複数の PHP MySQLi プリペアド ステートメントを使用すると「コマンドが同期していません」エラーが発生するのはなぜですか?

Patricia Arquette
リリース: 2024-11-21 07:32:11
オリジナル
601 人が閲覧しました

Why Do I Get

PHP コマンドが同期していない: 複数のプリペアド ステートメント使用時のエラーを解決する

PHP で、MySQLi を使用して複数のプリペアド ステートメントを実行しようとしたときを実行すると、「コマンドが同期していないため、現在コマンドを実行できません。」というエラーが発生する場合があります。このエラーは、クエリからの結果セットの MySQLi のデフォルト処理が原因で発生します。

このエラーの潜在的な原因の 1 つは、クエリの実行時の MYSQLI_USE_RESULT の使用です。このモードは、結果セット全体のバッファリングを回避することでパフォーマンスを最適化します。ただし、mysqli_free_result() を使用して結果を手動で解放する必要があります。後続のステートメントを実行する前にこれを行わないと、コマンド シーケンスが同期しなくなります。

この問題を解決するには、各ステートメントからすべての行をフェッチした後で必ず mysqli_free_result() を呼び出してください。あるいは、store_result() メソッドを使用して結果セット全体をメモリに保存すると、潜在的な競合を気にせずに後でアクセスできるようになります。

このエラーのもう 1 つの一般的な原因は、保留中の結果が存在することです。以前のクエリ。ループ内で複数のクエリを実行する場合は、各結果セットを処理した後に必ず mysqli_next_result() を呼び出してください。このメソッドは、残りの結果をすべて解放し、後続のクエリのための接続を準備します。

mysqli_free_result() と mysqli_next_result() の両方を呼び出してエラーを修正する方法の例を次に示します。

$stmt = $mysqli->prepare("SELECT id, username, password, firstname, lastname, salt FROM members WHERE email = ? LIMIT 1");
$stmt->bind_param('s', $loweredEmail);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($user_id, $username, $db_password, $firstname, $lastname, $salt);
$stmt->fetch();

$stmt->free_result();
$stmt->close();

while ($mysqli->more_results()) {
    $mysqli->next_result();
}

$stmt1 = $mysqli->prepare("SELECT privileges FROM delegations WHERE id = ? LIMIT 1");
$stmt1->bind_param('s', $user_id);
$stmt1->execute();
$stmt1->store_result();
$stmt1->bind_result($privileges);
$stmt1->fetch();
ログイン後にコピー

By結果セットを適切に処理し、不要なときに解放することで、「コマンドが同期していない」エラーを回避し、シームレスな実行を保証できます。複数の準備されたステートメント。

以上が複数の PHP MySQLi プリペアド ステートメントを使用すると「コマンドが同期していません」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート