PHP/MySQLi で複数のプリペアド ステートメントを実行すると、「コマンドが同期していない」エラーが発生することがあります。これは、実行されるステートメントの数と処理される結果の数が一致しないために発生します。この問題に対処するには、次の洞察と解決策を検討してください。
「非同期」エラーは、MySQL クライアントが特定のステートメントで予想されるよりも多くのデータを受信したときに発生します。これは、MYSQLI_USE_RESULT フラグを指定して mysqli::query を使用するときに発生します。このフラグは、結果を完全にバッファリングしないように MySQL に指示し、後続のコマンドが同期しなくなります。
提供されたコードでは、2 つのプリペアド ステートメントを使用して、データベース。最初のステートメントはユーザー情報を取得し、2 番目のステートメントは権限を取得します。ただし、2 番目のステートメントの実行中にエラーが発生します。
エラーを解決するには、2 番目のステートメントを実行する前に最初のステートメントの結果を解放する必要があります。これは、mysqli_stmt->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(); $mysqli->next_result(); // Ensure no stray results are present $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();
以上がPHP MySQLi「コマンドが同期していません」エラー: 修正方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。