PHP PDO SQLite3问题使用“WITH”子句

时间:2014-10-17 14:05:39

标签: php pdo sqlite common-table-expression

我正在开发一个PHP项目,我必须在SQLite3数据库中执行查询。我正在使用PHP PDO。除了一个,我的所有查询都像魅力一样。我正在谈论的是一个递归的SQLite CTE。

以下是声明:     

WITH data 
AS ( 
    SELECT 1 AS Level, id, number_of_processors nop, processor_type pt 
    FROM   devices 
    UNION ALL 
    SELECT level + 1, data.id, nop, pt 
    FROM   data INNER JOIN devices d ON (data.id = d.id) 
    WHERE  level < nop )
SELECT id, level, pt AS processor_type FROM data ORDER BY id, level

我已经使用“SQLite Manager”(Firefox扩展程序)测试了这个语句,并且它可以使用PDO而不是php_sqlite3.dll。

我的环境配置如下:

  • Windows Server 2012 R2
  • Apache Webserver 2.4.10
  • PHP 5.4.28 for Windows

相关的PHP类是这样的:

use \PDO;
use \PDOException;
class SQLiteDBConnector {

    private $dbname = NULL;

    private $db = NULL;

    public function __construct( $dbname ) {
        $this->dbname = $dbname;

        return $this;
    }

    private function connect() {
        try {
            $this->db = new PDO( 'sqlite:' . $this->dbname );
            $this->db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        } catch ( PDOException $e ) {
            throw $e;
        }
    }

    public function getConnection() {
        if ( isset( $this->db ) === FALSE ) {
            $this->connect();
        }

        return $this->db;
    }

    public function query( $stmt ) {
        $resultset[] = array();

        try {
            $conn = $this->getConnection();
            $prepStmt = $conn->prepare( $sqlStmt );

            $prepStmt->execute();
            while ( $row = $prepStmt->fetch( PDO::FETCH_ASSOC ) ) {
                $resultset[] = $row;
            }
        } catch ( PDOException $e ) {
            throw $e;
        }

       return $resultset;
    }       
}

这是PDO的答案:

SQLSTATE[HY000]: General error: 1 near "WITH": syntax error

有谁知道为什么抛出SQLSTATE错误?

1 个答案:

答案 0 :(得分:0)

在Windows服务器上编译的SQLite库的版本不支持最近引入的公用表表达式,这很好。

要检查库的版本,请在服务器上执行此操作。

<?php print_r(SQLite3::version()); ?>

如果从服务器上的命令行执行SQLite,则不一定是相同的版本号。我认为你至少需要版本3.8.3。

考虑在服务器上升级PHP;当前版本是5.6 +。