簡體   English   中英

使用“WITH”子句的 PHP PDO SQLite3 問題

[英]PHP PDO SQLite3 issue using “WITH” clause

我正在開發一個 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。

我的環境是這樣配置的:

  • 視窗服務器 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 錯誤?

很有可能在 Windows 服務器上編譯的 SQLite 庫 PHP 版本不支持最近引入的公共表表達式。

要檢查庫的版本,請在服務器上執行此操作。

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

如果您從服務器上的命令行執行 SQLite,這不一定與您可能看到的版本號相同。 我認為您至少需要 3.8.3 版。

考慮升級服務器上的PHP; 當前版本是 5.6+。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM