Я работаю над проектом 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?
Хорошие шансы, что версия библиотеки SQLite, с которой PHP скомпилирован на сервере Windows, не поддерживает обычные табличные выражения, которые были введены сравнительно недавно.
Чтобы проверить версию библиотеки, выполните это на сервере.
<?php print_r(SQLite3::version()); ?>
Это не обязательно тот же номер версии, который вы можете увидеть, если будете выполнять SQLite из командной строки на сервере. Я думаю, что вам нужна хотя бы версия 3.8.3.
Подумайте об обновлении PHP на сервере; текущая версия 5.6+.
Других решений пока нет …