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 중국어 웹사이트의 기타 관련 기사를 참조하세요!