MySQLi の「コマンドが同期していない」エラー: 包括的な説明
MySQLi は、新しいコマンドを実行すると「コマンドが同期していない」エラーをスローします。以前のクエリからの未読の行がまだ残っている間にクエリが試行されました。 query.
エラーの理由
MySQL クライアント プロトコルでは、新しいクエリを実行する前に、クエリのすべての結果がフェッチされる必要があります。これにより、結果セットの処理の一貫性が確保され、データ損失が防止されます。
ソリューション
mysqli_store_result() または mysqli_result::fetch_all():
次を使用して外部クエリからすべての行をプリフェッチします。 mysqli_store_result() するか、mysqli_result::fetch_all() を使用して結果セット全体を配列としてフェッチします。これにより、結果がクライアントにバッファリングされ、複数のクエリを実行できるようになります。
ストアド プロシージャと mysqli_multi_query():
ストアド プロシージャは複数の結果セットを返すことができます。これを処理するには、mysqli_multi_query() を使用し、すべての結果セットが処理されるまで mysqli_next_result() を使用して結果を繰り返し処理します。
コード スニペット
これは、質問のコードを使用して、 mysqli_store_result():
$result = mysqli_query($db, $sql) or exit(mysqli_error($db)); if ($result) { $result->store_result(); // Buffer the result set echo "<table border='1'> <tr><th>id</th> <th>name</th> <th>parent_id</th> <th>parent_name</th> <th>level</th> <th>email</th></tr>"; while ($row = mysqli_fetch_assoc($result)) { $aid = $row["id"]; $sql2 = "SELECT * FROM members WHERE MEMNO = '$aid'"; $result2 = mysqli_query($db, $sql2) or exit(mysqli_error($db)); if ($result = mysqli_fetch_assoc($result2)) { $fname = $ newArray['FNAME']; $lname = $newArray['LNAME']; $mi = $newArray['MI']; $address = $newArray['ADDRESS']; $city = $newArray['CITY']; $state = $newArray['STATE']; $zip = $newArray['ZIP']; $kdate = $newArray['KDATE']; $date = abs(strtotime(date('m/d/Y')) - strtotime(date($kdate))) / (60 * 60 * 24); } echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>", $row["id"],$row["name"], $row["parent_id"],$row["parent_name"], $row["level"],$row["email"]); } echo "</table>"; } mysqli_free_result($result); mysqli_close($db);
可能な設計改善
リレーショナル データベースに階層データを格納すると、複雑なクエリが発生する可能性があります。データの保存と取得を簡素化するために、ネストされたセットや隣接リストなどの代替モデルの使用を検討してください。
以上がMySQLi の「コマンドが同期していない」エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。