我有一个php文件,它执行一系列插入查询。如果任何查询生成错误,我希望返回错误消息和查询字符串,并回滚所有查询
到目前为止,我有这个:
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字段中返回的只是"Query failed:"。知道为什么吗?
问题出在ROLLBACK
查询上:如手册中所述,mysql_error从lastmysql函数返回错误文本。由于您再次使用了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
似乎毫无用处。手册解释道:回滚可能是一种缓慢的操作,在用户没有明确要求的情况下(例如,发生错误时),它可能会隐式发生
以下代码就足够了:
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();
}
不应该
$arr = array("returnCode" => 0, "returnMessage" => "Query failed: " .$sql. sql_error());
是
$arr = array("returnCode" => 0, "returnMessage" => "Query failed: " .$sql. **mysql_error()**);
可能表达式"Query failed: " .$sql. sql_error()
的格式不正确。正确的形式是:
"Query failed: " . $sql . mysql_error()
我会使用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();
}
当抛出异常消息时,它会将遇到的任何错误作为异常消息提供给您。