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

时间:2014-04-02 19:32:00

标签: php mysql pdo

简而言之:有没有办法关闭/刷新/等用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()究竟是什么用途,如果我的问题有一个更优雅的解决方案。

1 个答案:

答案 0 :(得分:2)

首先,if($this->connection->exec($sql) === 0)不是一个好主意。

来自PHP.net:

  

" PDO :: exec()不返回SELECT语句的结果。对于在程序中只需要发出一次的SELECT语句,请考虑发出PDO :: query()。"

Source

更改它并告诉我们它是否解决了问题。