집 >데이터 베이스 >MySQL 튜토리얼 >여러 PHP MySQLi 준비된 문을 사용할 때 \'명령이 동기화되지 않음\' 오류가 발생하는 이유는 무엇입니까?
PHP 명령이 동기화되지 않음: 여러 개의 준비된 문 사용 시 오류 해결
PHP에서 MySQLi를 사용하여 여러 개의 준비된 문을 실행하려고 할 때 , "명령이 동기화되지 않았습니다. 지금은 명령을 실행할 수 없습니다."라는 오류가 발생할 수 있습니다. 이 오류는 MySQLi의 쿼리 결과 집합 기본 처리로 인해 발생합니다.
이 오류의 잠재적인 원인 중 하나는 쿼리 실행 시 MYSQLI_USE_RESULT를 사용하는 것입니다. 이 모드는 전체 결과 집합의 버퍼링을 방지하여 성능을 최적화합니다. 그러나 mysqli_free_result()를 사용하여 수동으로 결과를 릴리스해야 합니다. 후속 명령문을 실행하기 전에 이를 수행하지 못하면 명령 순서가 동기화되지 않습니다.
이 문제를 해결하려면 각 명령문에서 모든 행을 가져온 후 mysqli_free_result()를 호출해야 합니다. 또는 store_result() 메소드를 사용하여 전체 결과 세트를 메모리에 저장할 수 있으므로 나중에 잠재적인 충돌에 대한 걱정 없이 액세스할 수 있습니다.
이 오류의 또 다른 일반적인 원인은 다음에서 보류 중인 결과가 존재하기 때문입니다. 이전 쿼리입니다. 루프 내에서 여러 쿼리를 실행할 때는 각 결과 세트를 처리한 후 mysqli_next_result()를 호출해야 합니다. 이 메서드는 남은 결과를 해제하고 후속 쿼리를 위한 연결을 준비합니다.
다음은 mysqli_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(); $stmt->close(); while ($mysqli->more_results()) { $mysqli->next_result(); } $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();
By 결과 세트를 적절하게 처리하고 필요하지 않을 때 이를 해제하면 "동기화되지 않은 명령" 오류를 방지하고 준비된 여러 명령문의 원활한 실행을 보장할 수 있습니다.
위 내용은 여러 PHP MySQLi 준비된 문을 사용할 때 '명령이 동기화되지 않음' 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!