ホームページ  >  記事  >  データベース  >  MySQLi プリペアドステートメント使用時の PHP 「コマンドが同期していません」エラーを解決するにはどうすればよいですか?

MySQLi プリペアドステートメント使用時の PHP 「コマンドが同期していません」エラーを解決するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-20 14:04:17667ブラウズ

How to Resolve the PHP

PHP コマンドの同期エラー: 原因と解決策

PHP および MySQLi を使用してプリペアド ステートメントを使用してデータベースからデータを取得する場合、 「コマンドが同期していないため、現在コマンドを実行できません」というエラーが発生する場合があります。この問題は通常、同じ PHP スクリプト内で複数のプリペアド ステートメントを実行しようとしたときに発生します。

このエラーは、MySQLi の query() メソッドを MYSQLI_USE_RESULT オプションとともに使用すると、後続の呼び出しが「古い」状態のままになるために発生します。これを解決するには、次のステートメントに進む前に最初のステートメントの結果の処理を適切に終了することが重要です。

解決策の 1 つは、各結果セットを取得した後に mysqli_free_result() を呼び出すことです。この関数はバッファから保留中の結果を解放し、後続のステートメントが正常に実行できるようにします。

もう 1 つの効果的なアプローチは、mysqli::next_result() を使用することです。各準備されたステートメントを実行した後、 next_result() を呼び出して MySQLi 内の内部ポインターを進め、次のステートメントの適切な同期を確保します。これは、ストアド プロシージャまたは複数の結果セットを操作する場合に特に関係します。

next_result() の使用例を次に示します。

<?php

$mysqli = new mysqli('localhost', 'user', 'password', 'database');

// Prepare and execute first statement
$stmt1 = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
$stmt1->bind_param('s', $username);
$stmt1->execute();
$stmt1->store_result();

// Free the result set and advance to the next result
$stmt1->free_result();
$mysqli->next_result();

// Prepare and execute second statement
$stmt2 = $mysqli->prepare("SELECT * FROM orders WHERE user_id = ?");
$stmt2->bind_param('i', $userId);
$stmt2->execute();
$stmt2->store_result();

// Bind results and fetch data
$stmt2->bind_result($orderId, $productId, $quantity);
while ($stmt2->fetch()) {
    // Do something with the fetched data
}

$stmt2->free_result();
$mysqli->close();

?>

これらの戦略を実装すると、「コマンドが同期していません」エラーを解決し、PHP スクリプト内の複数の準備されたステートメントのスムーズな実行を保証します。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。