0

私はこれをどのように回避すべきかを正確に理解しようとしています。1つのMySQLiクエリが失敗すると、残りのスクリプトが自動的に強制終了されます。例えば

//Pure example code
$data = $mysqli->prepare("somequery");
$data->execute(); // Execute the prepared query.
//If the query above fails, the rest of the script doesn't get executed.

基本的に、クエリが失敗したときにPHPがスクリプトを強制終了するのを防ぐ方法を見つけようとしています。何か案は?想定されるパフォーマンスとセキュリティの向上のために、プリペアドステートメントに移動しました。古いクエリを計画するためにすべてを書き直すのは面倒です。

ありがとう、

4

3 に答える 3

3

エラーが発生してスクリプトが中止される可能性がある$data->execute()ときに盲目的に実行するのではなく、実際に成功を確認する必要があります。datafalse

ドキュメントから、prepare..。

ステートメントオブジェクトを返します。エラーが発生した場合はFALSEを返します。

于 2013-01-07T05:03:18.613 に答える
1

PHPは、致命的なエラーでスクリプトを強制終了します。この行が失敗した場合:

$data = $mysqli->prepare("somequery");

PHPはスクリプトを強制終了しませんが$data、falseに設定されます。スクリプトは次の行で強制終了されます。

$data->execute();

次のエラーが発生します。

Fatal error: Call to a member function execute() on a non-object in...

まずerror_reporting、問題を自分で診断(およびおそらく解決策を見つけ出す)できるように、有効にする必要があります。次に、@ meagarが述べたように、mysqli関数の戻り値を確認します。

$data = $mysqli->prepare("somequery");
if($data === false) {
    echo $mysqli->error;
    // dying isn't the most graceful approach by the way
    die();
}
if($data->execute() === false) {
    echo $mysqli->error;
    die();
}

mysql_ *からmysqliへの変更は、問題とは何の関係もありません。mysql_ *を使用していた場合でも、関数からの戻り値を確認する必要があります。一般的なルール:クエリが常に成功するとは限りません。

于 2013-01-07T05:11:25.263 に答える
0
if($data = $mysqli->prepare("somequery")) {
// binding
  $data->execute(); // Execute the prepared query.
}

ドキュメントから

于 2013-01-07T05:30:55.247 に答える