2014-04-23 14 views
8

我正在使用PDO運行多個查詢。如果第二個查詢失敗,則拋出異常。如何在使用PDO運行多個查詢時遇到錯誤?

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

上述代碼在不拋出異常的情況下執行。

如何確保所有查詢都已成功運行?如何檢查哪些查詢失敗?

P.S.我使用PDO多查詢來運行MySQL轉儲,但任何有效的.sql文件都應該可以工作。

+0

最好的方法是一次運行一個。另外,你的INSERT查詢中有一個SQL語法錯誤 - 'SELECT'語句在'name'之後需要另一個列名, – Kryten

+1

@Kryten我正在使用PDO來運行MySQL轉儲。拆分是一項艱鉅的任務。示例中的錯誤是故意的。 –

+0

啊,我明白了。在這種情況下,我唯一的建議是檢查'catch'塊中的'PDOException',看它是否包含有關失敗的特定查詢的更多細節。開始於'catch'塊中的'print_r($ e)'... – Kryten

回答

6

我找到了使用準備好的語句的答案。循環遍歷所有行集後,我可以使用$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

有沒有清楚的&做到這一點的簡單方法。

我認爲,最好的方法是一次讀取轉儲文件按查詢查詢並執行一個查詢。

如果DB驅動程序告訴它(如'未知標識符'blabla'on line 666'),您還可以解析錯誤消息並提取問題行號。

+1

這會讓我從火中進入平底鍋。這些查詢很可能有「;」在他們的價值中。另外我不想把重點放在轉儲文件的格式上。任何有效的.sql文件都應該這樣做。 –

1

以下代碼將顯示如何在運行多個查詢時捕獲錯誤。儘量避免使用「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"; 
} 
?> 
相關問題