2012-08-01 176 views
0

我有一個執行一系列插入查詢的PHP文件。如果任何一個查詢產生一個錯誤,我想返回錯誤信息和查詢字符串,並回滾所有查詢從php返回mySQL錯誤 - 沒有任何錯誤返回

到目前爲止,我有這樣的:

mysql_query("SET autocommit=0;"); 
mysql_query("BEGIN;"); 
$sql ="SOME MALFORMED QUERY"; 

mysql_query($sql); 

if(mysql_error()){ 
    mysql_query("rollback;"); 
    $arr = array("returnCode" => 0, "returnMessage" => "Query failed: " .$sql. mysql_error()); 
    echo json_encode($arr); 
    die(); 
} 

然而,在javascript中所有的我看到在返回消息JSON字段中返回的「查詢失敗:」。任何想法爲什麼這是?

回答

1

問題是與您的ROLLBACK查詢:按照手冊中的解釋,mysql_error返回從最後的MySQL函數的錯誤文本。由於您再次使用了mysql_query,以前的錯誤將會丟失。

我建議這樣的代碼:

mysql_query("SET autocommit=0;"); 
mysql_query("BEGIN;"); 
$sql ="SOME MALFORMED QUERY"; 

mysql_query($sql); 
$error = mysql_error(); 
if($error){ 
    mysql_query("rollback;"); 
    $arr = array("returnCode" => 0, "returnMessage" => "Query failed: $sql, Error: $error"); 
    echo json_encode($arr); 
    die(); 
} 

在發生錯誤的情況下執行ROLLBACK好像沒用。所述manual說明: 回滾可以是一個慢的操作隱含可能發生而無需用戶已經明確地要求它(例如,在發生錯誤時)

那然後下面的代碼應該足夠:

mysql_query("SET autocommit=0;"); 
mysql_query("BEGIN;"); 
$sql ="SOME MALFORMED QUERY"; 

mysql_query($sql); 
if(mysql_error()){ 
    $arr = array("returnCode" => 0, "returnMessage" => "Query failed: $sql, Error: ".mysql_error()); 
    echo json_encode($arr); 
    die(); 
} 
+0

謝謝,這是有道理的。雖然,我想知道爲什麼$ sql變量也是空白的? – 2012-08-01 19:29:25

+0

也許這並不完全清楚:我只發佈了代碼的修改部分。我剛剛更新了我的答案,包括完整的修改版本。 – Jocelyn 2012-08-01 21:15:55

0

不應

$arr = array("returnCode" => 0, "returnMessage" => "Query failed: " .$sql. sql_error());

$arr = array("returnCode" => 0, "returnMessage" => "Query failed: " .$sql. **mysql_error()**);

+0

對不起!應該是這樣的,但是我在複製代碼時犯了一個錯誤。我編輯了這個問題 – 2012-08-01 12:01:37

0

也許表達"Query failed: " .$sql. sql_error()沒有很好地形成。 正確的形式是:

"Query failed: " . $sql . mysql_error() 
+0

它是'mysql_error()'而不是'my_sql_error()',不是嗎? – MiDo 2012-08-01 12:14:37

+0

已修復!感謝您的通知 – cybertextron 2012-08-01 12:16:53

0

我會使用PDO及其內置的事務支持。

<?php 

// create PDO instance as $db here 
// don't forget to set error mode to 'exception' 

try { 
    $db->beginTransaction(); 
    // do your queries here, i.e. $db->exec('BOGUS'); 
    $db->commit(); 
} 
catch (Exception $e) { 
    $db->rollBack(); 
    echo 'Error: ' . $e->getMessage(); 
} 

當它拋出一個異常消息時,它會給你任何遇到的錯誤。