当我用PHP的内置MySQL函数在PHP中打开MySQL连接时,我会执行以下操作:
$link = mysql_connect($servername, $username, $password);
mysql_select_db($dbname);
//queries etcetera
mysql_close($link);
Run Code Online (Sandbox Code Playgroud)
当我打开与PDO的连接时,它看起来像这样:
$link = new PDO("mysql:dbname=$dbname;host=$servername",$username,$password);
//prepare statements, perform queries
Run Code Online (Sandbox Code Playgroud)
我必须明确地关闭连接像我做的mysql_connect()和mysql_close()?如果没有,PHP如何知道我何时完成连接?
TIA.
我的服务器运行CentOS 6.4,使用带有CentOS的repos的yum安装了MySQL 5.1.69,并使用yum和ius的repos安装了PHP 5.4.16.Edit3升级到MySQL服务器版本:5.5.31由IUS社区项目分发,错误仍然存在.然后将库更改为mysqlnd,似乎消除了错误.尽管如此,需要知道为什么这个错误有时只会出现.
使用PDO并使用创建PDO对象时PDO::ATTR_EMULATE_PREPARES=>false,我有时会收到以下错误:
Table Name - zipcodes
Error in query:
SELECT id FROM cities WHERE name=? AND states_id=?
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.
File Name: /var/www/initial_install/build_database.php
Line: 547
Time of Error: Tuesday July 2, 2013, 5:52:48 PDT
Run Code Online (Sandbox Code Playgroud)
第547行是最后一行:
$stmt_check_county->execute(array($data[5],$data[4]));
if(!$county_id=$stmt_check_county->fetchColumn())
{ …Run Code Online (Sandbox Code Playgroud) 我正在使用与PDOStatement(; )的基于Mysql的PDO连接,并且我已经运行了一些在方法中使用的开发人员的代码.::prepare()::execute()PDOStatement::closeCursor()
无论如何,该函数在函数结束时未设置:
public function fooBar($identifier)
{
...
/** @var $dbc PDO */
$dbc = $conn->getConnection();
$stmt = $dbc->prepare('SELECT orderType, orderComment, payload FROM cart WHERE identifier = :identifier');
$stmt->execute(array('identifier' => $identifier));
$stmt->setFetchMode(PDO::FETCH_OBJ);
$cart = $stmt->fetch();
$stmt->closeCursor();
...
return $result;
}
Run Code Online (Sandbox Code Playgroud)
在我的心智模型中,我会说PDOStatement无论如何都在这里被清除,因为我发现对象要处理这个内务处理(封装基础知识).因此,调用PDOStatement::closeCursor()看起来对我来说是多余的,特别是因为这可能不是这里想要的:因为语句不能被重用,所以我根本不需要关闭光标.
注意:这段代码是示例性的,在实际代码中,
$stmt->execute(...)如果行计数不是一(1),甚至会抛出异常.
不只是一些驱动程序 - 驱动程序提供的某些设置需要在触发另一个查询之前关闭结果集,例如关闭MySQL
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY.谢天谢地,你可以打电话closeCursor,当它不需要采取行动时它将成功地做任何事情.否则,只需取消设置包含语句句柄的变量即可清除.
另一个问题我何时应该将closeCursor()用于PDO语句?没有接受的答案,我不会怀疑,因为它是所有的愚蠢.
在重用PDO语句var崩溃过程中有一个注释,即取消设置变量不会导致所有错误(内存损坏错误): …