PDO support for multiple queries (PDO_MYSQL, PDO_MYSQLND)

后端 未结 7 2307
长发绾君心
长发绾君心 2020-11-21 06:03

I do know that PDO does not support multiple queries getting executed in one statement. I\'ve been Googleing and found few posts talking about PDO_MYSQL and PDO_MYSQLND.

7条回答
  •  一个人的身影
    2020-11-21 06:43

    After half a day of fiddling with this, found out that PDO had a bug where...

    --

    //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;");
    

    It would execute the "valid-stmt1;", stop on "non-sense;" and never throw an error. Will not run the "valid-stmt3;", return true and lie that everything ran good.

    I would expect it to error out on the "non-sense;" but it doesn't.

    Here is where I found this info: Invalid PDO query does not return an error

    Here is the bug: https://bugs.php.net/bug.php?id=61613


    So, I tried doing this with mysqli and haven't really found any solid answer on how it works so I thought I's just leave it here for those who want to use it..

    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(). " 
    ".$e->getTraceAsString()."
    "; }

提交回复
热议问题