PHPEye开源社区 » Zend Framework 使用讨论 » 今天碰到的一个问题,解决了但还不是太明白,哪位
《Programming PHP》第二版上市
2007-8-16 14:28 sxpo
今天碰到的一个问题,解决了但还不是太明白,哪位

程序在我本机上没有问题,可是换了台linux主机就报下面的错误:

"SQLSTATE[HY000]: 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."

我先去看看了看程序,在那段程序里面确实用了多个$db->query($sql) $db是个pdo_mysql对象
看起来应该是由于没有设置查询缓存导致第二个查询失败
然后我就去查手册,看上面PDO有个属性是MYSQL_ATTR_USE_BUFFERED_QUERY
然后写了段代码看我本机上MYSQL_ATTR_USE_BUFFERED_QUERY 为1
而那台linux主机上MYSQL_ATTR_USE_BUFFERED_QUERY 为 0
初步判断是那个的问题 在google搜出来的都看不懂,就还是看程序
看zf创建PDO对象是在Zend_Db_Adapter_Pdo_Abstract 里面,看了他和他的父类子类没发现可以传入MYSQL_ATTR_USE_BUFFERED_QUERY 参数的地方,就在124行下面加了行:
$this->_connection->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
然后刷新页面发现就正常了

虽然问题解决了,但是还是稀里糊涂的,应该是对原理理解的不够透彻吧,不知道这样改有没有其他副作用

2007-8-16 16:12 wps2000
没有
最方便的办法是,永远都 fetchAll()
呵呵,那就不会出这种问题啦

2007-8-16 18:14 Haohappy
手册里有:
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY  (integer)

    If this attribute is set to TRUE on a PDOStatement, the MySQL driver will use the buffered versions of the MySQL API. If you're writing portable code, you should use PDOStatement::fetchAll() instead.

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.