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 サイトの他の関連記事を参照してください。