Я выполняю несколько запросов с использованием 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 должен работать.
Я нашел ответ в использовании подготовленного заявления. После цикла всех $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 »).