PHP MySQLi「コマンドが同期していません」エラー: 修正方法

Barbara Streisand
リリース: 2024-11-18 10:03:02
オリジナル
919 人が閲覧しました

PHP MySQLi

PHP コマンドが同期していないエラー: 理解と解決策

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();
ログイン後にコピー

追加のヒント

  • 混乱を避けるために、プリペアド ステートメントごとに個別のオブジェクトを使用します。
  • ステートメントの実行後は、mysqli_stmt->error を使用して常にエラーを確認してください。
  • そうでない場合は、MYSQLI_USE_RESULT の使用を避けてください。同期の問題が発生する可能性があるため、必要です。

以上がPHP MySQLi「コマンドが同期していません」エラー: 修正方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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