2010-01-14 6 views
23

이 문제는 간단한 수정이어야하며이 오류가 발생하는 이유를 부분적으로 이해하고 있지만이를 수정하는 방법을 알지 못합니다. 나는 문서를 살펴 봤지만 버퍼링 된 쿼리 옵션을 사용하는 것 이외의 해결책을 찾을 수 없습니다. 나는 그것을 시도했지만 효과가 없습니다.PDO 버퍼되지 않은 다른 쿼리가 활성화되어있는 동안 쿼리를 실행할 수 없습니다.

오류 : 다른 버퍼링 쿼리가 오류가 나는 $ 결과 배열을 구축하고있는 라인에서 오는

를 활성화하는 동안 PDO 쿼리를 실행할 수 없습니다.

foreach($phones as $phone) 
{ 
    $stmt = db::getInstance()->prepare("CALL phones(:phone)"); 
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10); 
    $stmt->execute(); 

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC); 
} 
+6

말 그러나 준비된 문장의 모든 이점은 오직 한 번만 준비해야한다는 것입니다. 준비를 준비에서 벗어나십시오. –

+0

아멘, @KenK. 아멘. –

답변

34

당신은 내가

foreach($phones as $phone) 
{ 
    $stmt = db::getInstance()->prepare("CALL phones(:phone)"); 
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10); 
    $stmt->execute(); 

    $stmt->closeCursor() 

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC); 
} 

당신

+0

감사합니다. 나를 위해 일했다. – Roy

4

을 위해 그것을 할 것으로 판단

http://www.php.net/manual/en/pdostatement.closecursor.php

() 메소드를 PDOStatement :: closeCursor를 사용하여 연결을 확보해야 방금이 문제가 발생하여 문제가 발생했습니다. 누적 된 쿼리를 사용해야합니다. 위의 해결 방법으로는 문제가 해결되지 않았습니다. 나는이 점을 변경하는 경우

return $this->fquery(' 
    SELECT @follow_id:=COALESCE(MAX(follow_id) + 1, 0) FROM sync_delete_value; 
    INSERT INTO sync_delete_value (...) 
    VALUES (%d, @follow_id, %d, "%s")', 
    $val1, $val2, $val3 
); 

모든 것이 평소와 같이 재개 :

우리는 오류 발생시킨 일 전에 바로 실행이 쿼리했다

$followId = $this->fquery(' 
    SELECT @follow_id:=COALESCE(MAX(follow_id) + 1, 0) FROM sync_delete_value' 
); 
return $this->fquery(' 
    INSERT INTO sync_delete_value (...) 
    VALUES (%d, %d, %d, "%s")', 
    $val1, $followId, $val2, $val3 

을);

소소한 의사 코드이지만 포인트를 얻습니다.

+0

+1이 사람은 나를 잠시 잡았습니다. 공유해 주셔서 감사합니다. –

8

내 PDO 연결 절의 오류로 인해이 문제가 발생했습니다. 나는 연결에 시간대를 변경하려고했다 :

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8; SET time_zone = '$timezone';" 

나는 그것을 변경 :

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8, time_zone = '$timezone';" 

그리고 그것은 괜찮 았는데.

+1

감사합니다. 똑같은 문제가있었습니다! – Tom

3

만약 $ stmt-> closeCursor() (나를 위해하지 않았다) 당신을 위해 작동하지 않습니다, 당신은 단지 설정 해제 $ stmt에 변수가과 같이 커서를 UPP 무료로 할 수 있습니다

foreach($phones as $phone) 
{ 
    $stmt = db::getInstance()->prepare("CALL phones(:phone)"); 
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10); 
    $stmt->execute(); 
    unset($stmt); 

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC); 
} 
+0

정말 흥미 롭습니다. 이것도 나를 위해 고정. – felwithe

관련 문제