MySQLi 中的「指令不同步」錯誤:全面解釋
當新的指令出現時,MySQLi會拋出「指令不同步」錯誤在上一個查詢中仍有未讀行的情況下嘗試查詢
錯誤原因
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_resu lt():
$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中文網其他相關文章!