0

我有一个执行一系列插入查询的 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 字段中看到的所有返回都是“查询失败:”。知道这是为什么吗?

4

4 回答 4

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在发生错误的情况下执行似乎没有用。该手册解释说:回滚可能是一个缓慢的操作,可能会在用户没有明确要求的情况下隐式发生(例如,发生错误时)

那么下面的代码就足够了:

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();
}
于 2012-08-01T12:33:37.933 回答
0

可能表达式"Query failed: " .$sql. sql_error()格式不正确。正确的形式是:

"Query failed: " . $sql . mysql_error()
于 2012-08-01T11:59:54.493 回答
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();
}

当它抛出一个异常消息时,它会给你任何遇到的错误作为异常消息。

于 2012-08-01T12:46:15.230 回答
0

不应该

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

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

于 2012-08-01T11:58:55.053 回答