Как я могу получить ошибку при запуске нескольких запросов с помощью PDO?

Я выполняю несколько запросов с использованием PDO. Если второй запрос завершается с ошибкой, теперь вызывается Exception.

$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(); } 

Вышеупомянутый код выполняется без исключения исключения.

Как я могу убедиться, что все запросы выполнены успешно? Как я могу проверить, какие запросы не удались?

PS Я использую PDO multi query для запуска дампов MySQL, но любой действительный файл .sql должен работать.

Related of "Как я могу получить ошибку при запуске нескольких запросов с помощью PDO?"

Я нашел ответ в использовании подготовленного заявления. После цикла всех $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(); } 

Следующий код покажет, как поймать ошибку при запуске нескольких запросов. Попробуйте избежать использования «DELIMITER //». Запросы обычно раздельно «;».

 <?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"; } ?> в <?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"; } ?> 

Нет четкого и простого способа сделать это.

Я думаю, лучший способ – прочитать дамп-файл по каждому запросу и выполнить один запрос за раз.

Вы также можете разобрать сообщение об ошибке и извлечь номер строки проблем, если драйвер DB говорит об этом (например, «неизвестный идентификатор« blabla » в строке 666 »).