This question without an accepted answer은 Windows의 MySQL 버전 5.6.16에서 수정 된 형식으로 발생하는 MySQL에 치명적인 문제를 발생시킵니다.Windows의 MySQL 5.6.16에서 PDOStatement :: nextRowSet()이 작동하지 않습니다.
문제는 쉽게 재현 할 수 있습니다 : 여기
$pdo = /* connection stuff here */
$sql = "call test();"; // call stored procedure - see below
$statement = $connection->query($sql);
do {
$rowset = $statement->fetchAll(PDO::FETCH_ASSOC);
if($rowset) {
// Do stuff with $rowset
}
} while($statement->nextRowset());
저장 프로 시저
test
의 정의입니다 : 내가 (위의 링크 된 질문에서 복사,하지만 내 코드에 적용되는 변경) 여기에 포함
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`$$
CREATE PROCEDURE `test`()
BEGIN
SELECT 1; SELECT 2; SELECT 3; SELECT 4;
END$$
DELIMITER ;
내 코드와 위의 링크 된 코드의 유일한 차이점은 SQL 쿼리를 저장 프로 시저에 압축한다는 것입니다.
필자의 경우 while
문은 true
번을 세 번이 아닌 네 번 (단지 세 번이어야 함)으로 반환합니다. 네 번째 시간 후에 fetchAll(...)
은 SQLSTATE[HY000]: General error
오류를 발생시킵니다.
불행히도이 문제는 재앙입니다. nextRowSet()
함수를 사용하는 것 이외의 다른 행 집합을 반복하는 PDO를 사용하는 다른 방법은 없습니다. 따라서이 문제를 해결하기 위해 이전 버전의 MySQL로 되돌릴 수 있습니다.
은 여기에 나열 : https://bugs.php.net/bug.php?id=67130 및 http://permalink.gmane.org/gmane.comp.php.devel/81518
이 참이라고 나는 확인을 부탁드립니다, Windows에서의 MySQL 버전 5.6.16 버그를 . 더 나아가, 나는 해결 방법을 고맙게 생각한다. 감사.
['mysqli' (http://php.net/mysqli) "수"([I 기억으로 (http://php.net/manual/en/ mysqli.multi-query.php))는 결과 집합간에 전환하지만, 전체 애플리케이션을 다른 데이터베이스 상호 작용 계층으로 이동해야한다. – BlitZ
4 개의 개별 쿼리로 모든 문자열을 실행할 수없는 이유는 무엇입니까? – silkfire
@silkfire 중요한 질문을 추가하기 위해 제 질문을 업데이트했습니다 (처음 질문을 올렸을 때 사과하지 않으신 것에 사과드립니다). 코드는 현재 실행중인 코드와 100 % 동일합니다. 사실 SQL은 저장 프로 시저에 내장되어 있습니다. 실제 응용 프로그램의 경우 쿼리가 훨씬 복잡하고 쉽게 리팩터링되지 않습니다. –