MySQL의 "버퍼링되지 않은 다른 쿼리가 활성 상태인 동안 쿼리를 실행할 수 없습니다" 오류 해결
소개:
MySQL의 클라이언트 프로토콜은 하나의 쿼리만 실행할 수 있다는 제한을 둡니다. 동시에. 이전 쿼리의 결과를 가져오지 않은 상태에서 추가 쿼리를 실행하려고 하면 "버퍼링되지 않은 다른 쿼리가 활성화되어 있는 동안에는 쿼리를 실행할 수 없습니다."라는 오류가 발생할 수 있습니다. 이 문제는 특정 시나리오, 특히 PDO::ATTR_EMULATE_PREPARES 속성이 false로 설정된 상태에서 PHP 데이터 개체(PDO)를 사용할 때 발생할 수 있습니다.
원인:
근본 원인은 MySQL 클라이언트 프로토콜이 동시에 여러 쿼리를 진행할 수 없다는 데 있습니다. 쿼리가 실행되면 클라이언트 라이브러리는 자동으로 모든 결과를 가져와서 캐시하므로 MySQL과 통신하지 않고도 저장된 결과에 대해 후속 가져오기를 반복할 수 있습니다. "버퍼 쿼리"라고 알려진 이 접근 방식을 사용하면 초기 결과가 검색된 후 MySQL 서버가 추가 처리를 하지 않아도 됩니다.
반대로, 버퍼되지 않은 쿼리는 결과를 캐시하지 않으므로 클라이언트가 한 번에 하나씩 가져와야 합니다. 이 제약 조건은 첫 번째 쿼리 결과를 완전히 가져오기 전에 두 번째 쿼리가 실행될 때 발생합니다. MySQL 서버는 이를 활성 쿼리 간의 충돌로 해석하고 오류 메시지를 트리거합니다.
해결 방법:
이 문제를 해결하려면 다음 전략을 사용할 수 있습니다.
추가 고려 사항:
코드 예:
제공된 코드는 fetchAll()을 활용하거나 명시적으로 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY를 true로 설정하여 오류를 방지하도록 수정할 수 있습니다. .
$sql ='SELECT temp_id FROM temp1'; $stmt2 = db::db()->prepare($sql); $stmt2->execute(); $rs2 = $stmt2->fetchAll(PDO::FETCH_ASSOC); $stmt2->closeCursor(); $sql='SELECT COUNT(*) AS valid FROM cities_has_zipcodes WHERE cities_id=:cities_id AND zipcodes_id=:zipcodes_id'; $stmt1 = db::db()->prepare($sql); foreach($data AS $row) { try { $stmt1->execute($row); $rs1 = $stmt1->fetchAll(PDO::FETCH_ASSOC); $stmt1->closeCursor(); syslog(LOG_INFO,'$rs1: '.print_r($rs1[0],1).' '.rand()); syslog(LOG_INFO,'$rs2: '.print_r($rs2[0],1).' '.rand()); } catch(PDOException $e){echo(sql_error($e));} }
위 내용은 MySQL 오류 '버퍼링되지 않은 다른 쿼리가 활성화되어 있는 동안 쿼리를 실행할 수 없습니다'를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!