gpt4 book ai didi

php - PDO 和存储过程的无缓冲查询错误

转载 作者:太空宇宙 更新时间:2023-11-03 11:03:57 24 4
gpt4 key购买 nike

我正在重构一个项目,我正在做的部分工作是用对存储过程的调用替换内联 SQL。我遇到了一个问题。我使用的是 PHP 5.3.5 版和 MySQL 5.0.7 版

项目有成员,成员可以有请求。我想获取对特定成员的所有请求并将它们作为 Request 对象数组返回。

我创建了一个调用存储过程的静态方法,它返回所有请求 ID,我又用它来实例化新的 Request 对象。问题是我收到有关无缓冲查询的错误,这是错误:

General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute  

我已经按照错误消息的建议完成并使用了 fetchAll,但我仍然遇到这个问题。这是相关 PHP 的简化版本:

class Request
{
public function __construct($request_id)
{
//as you can see this is still inline
$db = Database::get_instance();
$sql = "SELECT field1,field2,field3 FROM requests WHERE request_id = ?";
$stmt = $db->prepare($sql);
$stmt->execute(array($request_id));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if(!empty($row))
{
//populate properties
foreach($row as $key=>$value)
{
$this->$key = $value;
}
}

}

public static function get_requests_by_member_id($member_id)
{
//array to hold results
$requests = array();
//this is just a PDO object
$db = Database::get_instance();
$sql = "CALL get_requests_by_member_id(?)";
$stmt = $db->prepare($sql);
/bind the param
$stmt->bindParam(1,$member_id,PDO::PARAM_INT,10);
$stmt->execute();
//iterate through adding new Request objects to the array
foreach($stmt->fetchAll(PDO::FETCH_ASSOC) as $row)
{
//here is where the problem occurs
$requests[] = new self($row['request_id']);
}

return $requests;

}

}

还有我的存储过程的简化版本:

delimiter $$

CREATE PROCEDURE get_requests_by_member_id(member_id_in INT)
BEGIN
SELECT request_id
FROM requests

WHERE cr.member_id = member_id_in;
END$$
delimiter ;

正如我上面提到的,当我尝试实例化一个新的请求以添加到数组时,问题就出现了。这似乎导致了我看到的光标问题,但是因为我使用了 fetchAll() 应该不能解决问题吗?是否有处理此类场景的最佳实践?任何建议将不胜感激。非常感谢!

最佳答案

当你完成一个语句时,你应该调用 closeCursor(),像这样:

$stmt->closeCursor();

通过关闭游标,可以使连接可​​用于新请求。请参阅 上的 PHP 文档 PDOStatement::closeCursor 了解详情。

关于php - PDO 和存储过程的无缓冲查询错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13364852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com