我有一个执行一系列插入查询的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:'。知道为什么会这样吗?
答案 0 :(得分: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();
}
答案 1 :(得分:0)
不应该
$arr = array("returnCode" => 0, "returnMessage" => "Query failed: " .$sql. sql_error());
是
$arr = array("returnCode" => 0, "returnMessage" => "Query failed: " .$sql. **mysql_error()**);
答案 2 :(得分:0)
表达式"Query failed: " .$sql. sql_error()
可能没有很好地形成。
正确的形式是:
"Query failed: " . $sql . mysql_error()
答案 3 :(得分: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();
}
当它抛出异常消息时,它将为您提供任何错误。