Php 在PDO::exec()之后关闭无缓冲的MySQL查询

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

简而言之:有没有办法关闭/刷新/etc使用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 */
        );        
    }    
}
这里的目标是创建尚不存在的表,但显然“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()){…这就解决了问题。谢谢你们!