Php 在PDO::exec()之后关闭无缓冲的MySQL查询
简而言之:有没有办法关闭/刷新/etc使用PDO::exec()进行的无缓冲查询 要在代码中给出一个示例:Php 在PDO::exec()之后关闭无缓冲的MySQL查询,php,mysql,pdo,Php,Mysql,Pdo,简而言之:有没有办法关闭/刷新/etc使用PDO::exec()进行的无缓冲查询 要在代码中给出一个示例: abstract class baseTask { private $connection = false; protected function save($data) { if (!$this->connection) $this->connect(); /* $this->tables() here
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 */
);
}
}
这里的目标是创建尚不存在的表,但显然“showtables”查询在求值后仍保持活动状态,PDO根本无法运行第二个exec()
错误消息表明:
考虑使用PDOStatement::fetchAll()
但很明显,在这种情况下,这不是很方便。如何完成第一个查询,以便在执行第二个查询后不再有活动查询
注意:我知道有很多方法可以解决这个问题,但我更愿意了解这里到底出了什么问题,如果没有,exec()的具体用途是什么,如果我的问题有更优雅的解决方案。首先,如果($this->connection->exec($sql)==0)
不是一个好主意
从PHP.net:
< P>:Pixor()不返回SELECT语句的结果。对于只需要在程序中发出一次的SELECT语句,请考虑发布PDO::Quyle()。
更改它,并告诉我们它是否解决了问题。据我所知,您正在寻找@PatrickQ,但事实并非如此。PDO中没有closeCursor()方法,我也没有用于closeCursor()的PDO语句。使用
query()
而不是exec()
怎么样?这将返回一个PDOStatement
对象。我很好奇,当您执行创建表(如果不存在)时,为什么您甚至对显示表(如…
查询)的结果感兴趣?IF NOT EXISTS
部分使您之前的检查毫无意义。我可以使用exec解决问题,但在这种情况下,我并不是在寻找结果集,而是寻找exec返回的结果集:“PDO::exec()在单个函数调用中执行SQL语句,返回受该语句影响的行数。”所以我的用例不应该是exec专门为之设计的吗?@Klasu不应该<返回您发出的SQL语句修改或删除的行数。如果没有任何行受到影响,PDO::exec()将返回0。
您的第一个查询既不修改也不删除任何行。如果是,通过exec发送的select查询将始终返回0,则测试将无效。您所做的正是我的QUOTEINDED中所述的,我错误地认为exec将处理SHOW TABLES。我把它改为:$stmt=$this->connection->query($sql);如果(empty($stmt->fetchAll()){…这就解决了问题。谢谢你们!