gpt4 book ai didi

使用 "WITH"子句的 PHP PDO SQLite3 问题

转载 作者:行者123 更新时间:2023-12-03 18:15:19 24 4
gpt4 key购买 nike

我正在开发一个 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。

我的环境是这样配置的:

  • window 服务器 2012 R2
  • Apache 网络服务器 2.4.10
  • 适用于 Windows 的 PHP 5.4.28

相关的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com