Nachdem ich einen halben Tag damit herumgespielt hatte, stellte ich fest, dass PDO einen Fehler hatte, bei dem ...
- -
//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;");
Es würde das ausführen "valid-stmt1;"
, anhalten "non-sense;"
und niemals einen Fehler auslösen. Wird das nicht laufen lassen "valid-stmt3;"
, wahr zurückgeben und lügen, dass alles gut gelaufen ist.
Ich würde erwarten, dass es auf dem fehlerhaft ist, "non-sense;"
aber es tut es nicht.
Hier habe ich diese Informationen gefunden: Eine
ungültige PDO-Abfrage gibt keinen Fehler zurück
Hier ist der Fehler:
https://bugs.php.net/bug.php?id=61613
Also habe ich versucht, dies mit mysqli zu tun und habe keine wirklich solide Antwort darauf gefunden, wie es funktioniert. Deshalb dachte ich, ich lasse es einfach hier für diejenigen, die es verwenden möchten.
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>";
}