Подготовленные запросы PDO

D
На сайте с 28.06.2008
Offline
1101
631

Господа, только вникаю в подготовленные запросы, не могу понять что не так с этим запросом?

    public static function findAllOffset(int $limit, int $offset): array
    {
        $db = Db::getInstance();
        return $db->query('SELECT * FROM `' . static::getTableName() . '` ORDER BY `id`  DESC limit :limit offset :offset;',
            [
                ':limit' => $limit,
                ':offset' => $offset
            ],
            static::class);
    }

Ругается что возвращается пустота

Fatal error: Uncaught TypeError: Return value of MyProject\Models\ActiveRecordEntity::findAllOffset() must be of the type array, null returne

Хотя если выполнить запрос ручками, или вставить его прям в функцию - все будет ок

SELECT * FROM `articles` ORDER BY `id` DESC limit 10 offset 0

То что подставляется нужная таблица и в функцию приходят нужные переменные я проверил. А как проверить итоговый запрос который в базу уходит чтобы понять что не так?

E
На сайте с 01.10.2017
Offline
94
#1

Проблема из-за возврата null, на этот раз из query(). Зачем вам вообще нужно это значение? Не используете исключения?

Как я понимаю, это ваш query(). У метода PDO другие параметры.

Домены на продажу: https://p20.ru/collection/domains-for-sale
ДП
На сайте с 23.11.2009
Offline
203
#2
Посмотрите что в итоге происходит в $db->query - как там подставляются переменные. Насколько помню, там были тонкости. В одном проекте приходилось через отдельный statement и bindValue делать, чтобы можно было плейсхолдеры в лимите использовать.
$st = $this->db->prepare($sql);
$st->bindValue(":limit", $resultRange, ParameterType::INTEGER);

W1
На сайте с 22.01.2021
Offline
284
#3
Dram :
А как проверить итоговый запрос который в базу уходит чтобы понять что не так?

Проще всего - сделать синтаксическую ошибку в запросе. Тогда строка запроса будет выдана в сообщении об ошибке.

Другой путь - сделать вывод этой строки в методе query().

Мой форум - https://webinfo.guru –Там я всегда на связи
D
На сайте с 28.06.2008
Offline
1101
#4
estic #:

Проблема из-за возврата null, на этот раз из query(). Зачем вам вообще нужно это значение? Не используете исключения?

Как я понимаю, это ваш query(). У метода PDO другие параметры.

query это просто обращение к методу класса базы 


D
На сайте с 28.06.2008
Offline
1101
#5
webinfo #:

Проще всего - сделать синтаксическую ошибку в запросе. Тогда строка запроса будет выдана в сообщении об ошибке.

Другой путь - сделать вывод этой строки в методе query().

Синтактическая ошибка ничего не выводит (ошибка не меняется), пытался в классе DB поймать запрос, выводит это

 string(73) "SELECT * FROM `articles` ORDER BY `id` DESC limit :limit offset :offset;"

Параметры вроде тоже верно приходят

Сам запрос в майдамин отрабатывает нормально


E
На сайте с 01.10.2017
Offline
94
#6
Dram #:
query это просто обращение к методу класса базы

Вместо возврата null пробрасывайте исключение.

Что в общем может быть причиной ошибки? Попробуйте, как вам выше написали, явно "биндить" в целочисленный тип. Возможно, MySQL не поддерживает PG-синтаксис LIMIT в подготовленных выражениях - попробуйте обычный LIMIT x, y. Про ошибки времени выполнения тоже не стоит забывать.

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#7

Потому, что нельзя передавать в запрос ничего кроме переменных. Чтобы передавать лимиты и т.д. тебе надо выключить этот режим:

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Иначе у тебя все цифры загоняются в одинарные кавычки  ' 10'

Остальное гугли по запросу:

mysql PDO LIMIT ATTR_EMULATE_PREPARES

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
Aisamiery
На сайте с 12.04.2015
Offline
293
#8

И в целом вы прописываете методу возврат массива, хотя возвращаете результат функции у которой прописано что может быть null. Зачем вы сами себе в ногу стреляете то?


Не делайте так никогда, шторм обычно кричит о таких ошибках, у вас на деве она может всегда возвращать массив и вы ошибку не поймаете, а у пользователей обязательно оно вылезет

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий