এটির সাথে আড্ডা দেওয়ার অর্ধেক দিন পরে, আবিষ্কার করলেন যে পিডিওতে একটি বাগ রয়েছে যেখানে ...
-
//This would run as expected:
$pdo->exec("valid-stmt1; valid-stmt2;");
-
//This would error out, as expected:
$pdo->exec("non-sense; valid-stmt1;");
-
//Here is the bug:
$pdo->exec("valid-stmt1; non-sense; valid-stmt3;");
এটি কার্যকর করে "valid-stmt1;"
, থামিয়ে দেয় "non-sense;"
এবং কখনও ত্রুটি ছুঁড়ে না ফেলে। চালাবে না "valid-stmt3;"
, সত্য ফিরে আসবে এবং মিথ্যা বলবে যে সবকিছুই ভাল চলছে ।
আমি এটির ত্রুটি থেকে বেরিয়ে আসার আশা করব "non-sense;"
তবে তা হয় না।
এই তথ্যটি আমি এখানে কোথায় পেয়েছি:
অবৈধ PDO ক্যোয়ারী কোনও ত্রুটি ফেরায় না
এখানে বাগটি রয়েছে:
https://bugs.php.net/bug.php?id=61613
সুতরাং, আমি মাইসকিলি দিয়ে এটি করার চেষ্টা করেছি এবং এটি কীভাবে কাজ করে সে সম্পর্কে সত্যই কোনও দৃ answer় উত্তর আমি পাইনি তাই আমি ভেবেছিলাম যে যারা এটি ব্যবহার করতে চান তাদের জন্য আমি কেবল এটি এখানে রেখে চলেছি ..
try{
// db connection
$mysqli = new mysqli("host", "user" , "password", "database");
if($mysqli->connect_errno){
throw new Exception("Connection Failed: [".$mysqli->connect_errno. "] : ".$mysqli->connect_error );
exit();
}
// read file.
// This file has multiple sql statements.
$file_sql = file_get_contents("filename.sql");
if($file_sql == "null" || empty($file_sql) || strlen($file_sql) <= 0){
throw new Exception("File is empty. I wont run it..");
}
//run the sql file contents through the mysqli's multi_query function.
// here is where it gets complicated...
// if the first query has errors, here is where you get it.
$sqlFileResult = $mysqli->multi_query($file_sql);
// this returns false only if there are errros on first sql statement, it doesn't care about the rest of the sql statements.
$sqlCount = 1;
if( $sqlFileResult == false ){
throw new Exception("File: '".$fullpath."' , Query#[".$sqlCount."], [".$mysqli->errno."]: '".$mysqli->error."' }");
}
// so handle the errors on the subsequent statements like this.
// while I have more results. This will start from the second sql statement. The first statement errors are thrown above on the $mysqli->multi_query("SQL"); line
while($mysqli->more_results()){
$sqlCount++;
// load the next result set into mysqli's active buffer. if this fails the $mysqli->error, $mysqli->errno will have appropriate error info.
if($mysqli->next_result() == false){
throw new Exception("File: '".$fullpath."' , Query#[".$sqlCount."], Error No: [".$mysqli->errno."]: '".$mysqli->error."' }");
}
}
}
catch(Exception $e){
echo $e->getMessage(). " <pre>".$e->getTraceAsString()."</pre>";
}