How can I get an error when running multiple queries with PDO?

前端 未结 3 1812
逝去的感伤
逝去的感伤 2021-01-05 06:24

I\'m running multiple queries using PDO. If the second query fails, now Exception is thrown.

$db = new PDO(\"mysql:host=localhost;dbname=test\", \'root\', \         


        
相关标签:
3条回答
  • 2021-01-05 07:05

    Following code will show how to catch error while running multiple queries. Try avoiding using "DELIMITER //". Queries are generally separately by ";".

    <?php
    // Create SQL List
    $sqlStatements = "SELECT 100;SELECT 200;SELECT 300; Error SELECT 400;SELECT 500;";
    
    // Prepare and execute statements
    $options = [\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION];
    $db = new PDO("mysql:host=127.0.0.1;dbname=test", 'root', '', $options);
    
    // Prepare and execute
    $error = false;
    $statement = $db->prepare($sqlStatements);
    $statement->execute();
    
    // Check error
    try{
        do{
            // Print Resultset
            $rowset = $statement->fetchAll(PDO::FETCH_NUM);
            var_dump($rowset);
        }while($statement->nextRowset());
    
    }catch(\Exception $e){
        echo $e->getMessage()."\n";
    }
    ?>
    
    0 讨论(0)
  • 2021-01-05 07:16

    I found the answer in using a prepared statement. After looping through all rowsets, I can check if the last query executed caused an error using $stmt->errorInfo().

    $db = new PDO("mysql:host=localhost;dbname=test", 'root', '');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
    
    $sql = "
    DELETE FROM car; 
    INSERT INTO car(name, type) SELECT name, from FROM vehicle;
    ";
    
    $stmt = $db->prepare($sql);
    $stmt->execute();
    $i = 0;
    
    do {
      $i++;
    } while ($stmt->nextRowset());
    
    $error = $stmt->errorInfo();
    if ($error[0] != "00000") {
      echo "Query $i failed: " . $error[2];
      die();
    }
    
    0 讨论(0)
  • 2021-01-05 07:17

    There's no clear&easy way to do that.

    I think, the best way is to read dump file query-by-query and execute one query at a time.

    You can also parse error message and extract problem line number if DB driver tells it (like 'unknown identifier 'blabla' on line 666').

    0 讨论(0)
提交回复
热议问题