作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个 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 错误?
最佳答案
很有可能 PHP 在 Windows 服务器上编译时使用的 SQLite 库版本不支持最近引入的公用表表达式。
要检查库的版本,请在服务器上执行此命令。
<?php print_r(SQLite3::version()); ?>
如果您从服务器上的命令行执行 SQLite,这不一定与您可能看到的版本号相同。我认为您至少需要 3.8.3 版。
考虑升级服务器上的PHP;当前版本为 5.6+。
关于使用 "WITH"子句的 PHP PDO SQLite3 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26426837/
我是一名优秀的程序员,十分优秀!