我正在开发一个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。
我的环境配置如下:
相关的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错误?
答案 0 :(得分:0)
在Windows服务器上编译的SQLite库的版本不支持最近引入的公用表表达式,这很好。
要检查库的版本,请在服务器上执行此操作。
<?php print_r(SQLite3::version()); ?>
如果从服务器上的命令行执行SQLite,则不一定是相同的版本号。我认为你至少需要版本3.8.3。
考虑在服务器上升级PHP;当前版本是5.6 +。