PHP PDO SQLite3 проблема с использованием & quot; WITH & quot; пункт

Я работаю над проектом 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 для 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?

2

Решение

Хорошие шансы, что версия библиотеки SQLite, с которой PHP скомпилирован на сервере Windows, не поддерживает обычные табличные выражения, которые были введены сравнительно недавно.

Чтобы проверить версию библиотеки, выполните это на сервере.

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

Это не обязательно тот же номер версии, который вы можете увидеть, если будете выполнять SQLite из командной строки на сервере. Я думаю, что вам нужна хотя бы версия 3.8.3.

Подумайте об обновлении PHP на сервере; текущая версия 5.6+.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]