Сбой связывания PDO с параметрами оконной функции PostgreSQL - PullRequest
0 голосов
/ 08 мая 2018

Мне нужно выполнить запрос SELECT для базы данных PostgreSQL, используя оконную функцию OVER() .

Позволяет получить либо диапазон выбранных строк, указанных в значениях OFFSET и LIMIT, либо количество общих строк, которые запрос получит без ограничения:

SELECT
     DISTINCT *, COUNT(id) OVER() AS results_num
FROM (
    SELECT id, name, surname
    FROM users
    WHERE children > 1
    ORDER BY id
) AS x
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;

Чтобы разработать метод подкачки, мне нужно динамически установить смещение и limit , поэтому, используя PDO, я определяю заполнители параметров строки запроса для переменных OFFSET и LIMIT которые затем связаны через bindParam():

$sql = "SELECT DISTINCT *, COUNT(id) OVER() AS results_num FROM (
    SELECT id, name, surname
    FROM users
    WHERE children > 1
    ORDER BY id
) AS x
OFFSET :offset ROWS FETCH NEXT :limit ROWS ONLY;"

$query = $dbh->prepare($sql);

$query->bindParam(':offset', $offset, \PDO::PARAM_INT);
$query->bindParam(':limit', $limit, \PDO::PARAM_INT);

$result = $query->execute();

Ошибка:

ERROR:  syntax error at or near "$2"
LINE 7:   ) AS x OFFSET $1 ROWS FETCH NEXT $2 ROWS ONLY;
                                            ^

Код ошибки SQL - 42601 (errorInfo возвращает SQLSTATE[42601]: Syntax error: 7), но, похоже, он очень общий, в этом коде я обнаружил множество различных синтаксических ошибок.

Это не связано с именованными заполнителями; В действительности то же самое происходит с использованием заполнителей вопросительного знака:

$sql = "SELECT DISTINCT *, COUNT(id) OVER() AS results_num FROM (
    SELECT id, name, surname
    FROM users
    WHERE children > 1
    ORDER BY id
) AS x
OFFSET ? ROWS FETCH NEXT ? ROWS ONLY;"

$query = $dbh->prepare($sql);
$result = $query->execute([$offset, $limit]);

Я знаю, что PDO также пытается проверить структуру запроса, поэтому нельзя ли связывать этот тип синтаксиса с PDO?

EDIT:

Сам запрос правильно сформирован и работает; до сих пор я использую динамическую композицию строки запроса для установки смещения и limit , очевидно, после правильной проверки их значения:

$sql = "SELECT DISTINCT *, COUNT(id) OVER() AS results_num FROM (
    SELECT id, name, surname
    FROM users
    WHERE children > 1
    ORDER BY id
) AS x
OFFSET " . $offset . " ROWS FETCH NEXT " . $limit . " ROWS ONLY;"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...