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

すべきではない

$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 に答える
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 に答える