简体   繁体   English

使用PDO运行多个查询时如何出错?

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

I'm running multiple queries using PDO. 我正在使用PDO运行多个查询。 If the second query fails, now Exception is thrown. 如果第二个查询失败,则抛出异常。

$db = new PDO("mysql:host=localhost;dbname=test", 'root', '');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "
DELETE FROM car; 
INSERT INTO car(name, type) SELECT name, from FROM vehicle;
";

try {
    $db->exec($sql);
}
catch (PDOException $e)
{
    echo $e->getMessage();
    die();
}

The above code executes without throwing an exception. 上面的代码执行时没有抛出异常。

How can I make sure that all queries have run successfully? 如何确保所有查询都已成功运行? How can I check which queries have failed? 如何查看哪些查询失败?

PS I'm using PDO multi query to run MySQL dumps, but any valid .sql file should work. PS我正在使用PDO多查询来运行MySQL转储,但任何有效的.sql文件都应该有效。

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() . 循环遍历所有行集后,我可以使用$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();
}

Following code will show how to catch error while running multiple queries. 以下代码将显示如何在运行多个查询时捕获错误。 Try avoiding using "DELIMITER //". 尽量避免使用“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";
}
?>

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 '). 如果DB驱动程序告诉它,您也可以解析错误消息并提取问题行号(如第666行 ''未知标识符'blabla')。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM