2010-01-14 43 views
23

Tôi biết điều này phải là một cách khắc phục đơn giản và tôi hiểu một phần lý do tôi gặp phải lỗi này nhưng không biết cách khắc phục. Tôi đã xem qua các tài liệu nhưng không thể tìm thấy giải pháp nào khác ngoài việc sử dụng tùy chọn truy vấn được lưu vào bộ đệm. Tôi đã thử nó nhưng nó không hoạt động.PDO Không thể thực hiện truy vấn trong khi các truy vấn không được kích hoạt khác đang hoạt động

Lỗi này là: PDO Không thể thực hiện truy vấn trong khi truy vấn không có bộ đệm khác đang hoạt động

Các lỗi là đến từ dòng nơi tôi đang xây dựng các mảng $ result.

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

cuối đối với đảng, nhưng toàn bộ lợi ích của các điều lệ đã chuẩn bị là bạn chỉ cần chuẩn bị chúng một lần. di chuyển chuẩn bị của bạn ra khỏi vòng lặp. –

+0

Amen, @KenK. Amen. –

Trả lời

34

Bạn cần phải giải phóng kết nối của bạn bằng cách sử dụng PDOStatement :: closeCursor phương pháp()

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

Tôi tin

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); 
} 

nên làm điều đó cho bạn

+0

Cảm ơn. Đã làm cho tôi. – Roy

4

Tôi chỉ chạy vào vấn đề này bản thân mình và vấn đề hóa ra là việc sử dụng các truy vấn xếp chồng. Giải pháp trên không giải quyết được vấn đề.

Chúng tôi đã có truy vấn này chạy ngay trước một trong đó gây ra lỗi:

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 
); 

Tất cả mọi thứ trở lại như bình thường khi tôi thay đổi này vào:

$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 

);

Đó là mã giả phân loại nhưng bạn nhận được điểm.

+0

+1 cái này đã cho tôi một thời gian. Cám ơn vì đã chia sẻ. –

8

Tôi gặp sự cố này do lỗi trong mệnh đề kết nối PDO của tôi. Tôi đã cố gắng để thay đổi múi giờ khi kết nối:

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

tôi đã thay đổi nó để:

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

Và nó làm việc tốt.

+1

Cảm ơn! Đã có chính xác cùng một vấn đề! – Tom

3

Nếu $ stmt-> closeCursor() không làm việc cho bạn (nó không cho tôi), bạn có thể chỉ unset biến $ stmt để giải phóng UPP con trỏ, như vậy:

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

Thực sự thú vị. Điều này cũng cố định cho tôi. – felwithe

Các vấn đề liên quan