简而言之:有没有办法关闭/刷新/等用PDO :: exec()创建的无缓冲查询?
在代码中给出一个例子:
abstract class baseTask {
private $connection = false;
protected function save($data) {
if (!$this->connection) $this->connect();
/*
$this->tables() here returns the tables & fields a child class uses
*/
foreach ($this->tables() as $table => $fields) {
$sql = "SHOW TABLES LIKE '$table';";
if($this->connection->exec($sql) === 0) {
$sql = "CREATE TABLE IF NOT EXISTS $table (";
$prefix = "";
foreach ($fields as $name => $opts) {
$sql .= "$prefix$name $opts";
$prefix = ", ";
}
$sql .= ") ENGINE=InnoDB DEFAULT CHARSET=utf8;";
if ($this->connection->exec($sql) == 0) {
var_dump($this->connection->errorInfo());
}
}
}
}
private function connect() {
$config = $this->config();
$this->connection = new PDO("mysql:dbname=".$config['database'].";host=".$config['address'].";", $config['username'], $config['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
}
private function config() {
return array(
/* Config */
);
}
}
这里的目标是创建尚不存在的表,但显然“SHOW TABLES”查询在评估后仍保持活动状态,而PDO根本无法运行第二个exec()。
错误消息表明:
考虑使用PDOStatement :: fetchAll()
但显然在这种情况下不是很方便。我将如何完成第一个查询,因此在执行第二个查询后将不再有活动查询?
注意:我知道有办法解决这个问题,但我宁愿真正了解这里出了什么问题,如果不是这样,exec()究竟是什么用途,如果我的问题有一个更优雅的解决方案。
答案 0 :(得分:2)
首先,if($this->connection->exec($sql) === 0)
不是一个好主意。
来自PHP.net:
" PDO :: exec()不返回SELECT语句的结果。对于在程序中只需要发出一次的SELECT语句,请考虑发出PDO :: query()。"
更改它并告诉我们它是否解决了问题。