>데이터 베이스 >MySQL 튜토리얼 >여러 PHP MySQLi 준비된 문을 사용할 때 \'명령이 동기화되지 않음\' 오류가 발생하는 이유는 무엇입니까?

여러 PHP MySQLi 준비된 문을 사용할 때 \'명령이 동기화되지 않음\' 오류가 발생하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-21 07:32:11664검색

Why Do I Get

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.