SQL prepare что не так?

12
D
На сайте с 28.06.2008
Offline
1104
243

Пишу один класс и решил делать все по взрослому, через  PDO, написал запрос, вроде без ошибок

$pagination = $db->query('SELECT * FROM `content` WHERE catid=:catid ORDER BY `id` DESC LIMIT :offset, :size_page;',
            [':catid' => 28,
                ':offset' => $offset,
                ':size_page' => $size_page,
                ]);

пробовал так - тоже нулл

        $pagination = $db->query('SELECT * FROM `content` WHERE catid=:catid ORDER BY id DESC LIMIT :size_page OFFSET :offset;',
            [':catid' => 28,
                ':offset' => $offset,
                ':size_page' => $size_page,
                ]);

Но он возвращает NULL, полез в класс работы с базой, туда приходит вот что

string(89) "SELECT * FROM `content` WHERE catid=:catid ORDER BY `id` DESC LIMIT :offset, :size_page;"
array(3) {
  [":catid"]=>
  int(28)
  [":offset"]=>
  int(0)
  [":size_page"]=>
  int(10)
}

Ручками в myadmin запрос

SELECT * FROM `content` WHERE catid=28 ORDER BY `id` DESC LIMIT 0, 10

отрабатывает как и положено. Так же если вставить значения лимит и офсет прямо в запрос

$pagination = $db->query('SELECT * FROM `content` WHERE catid=:catid ORDER BY `id` DESC LIMIT 0, 10',[':catid' => 28]);

То запрос тоже верно отработает. Что не так?


J0
На сайте с 27.02.2019
Offline
32
#1

Так нужно использовать prepare, а не query.

$pagination = $db->prepare('SELECT * FROM `content` WHERE catid=:catid ORDER BY `id` DESC LIMIT :offset, :size_page');
$paginatin->execute(['catid' => 28, 'offset' => $offset, 'size_page' => $size_page])
$result = $pagination->fetch()

LEOnidUKG
На сайте с 25.11.2006
Offline
1748
#2

все по взрослому, через  PDO

Токо забыл в документацию глянуть.

https://www.php.net/manual/en/pdo.query.php


полез в класс работы с базой

Так это не PDO, это через какую-то обвёртку делаешь что-ли?

PHP: PDO::query - Manual
  • www.php.net
(     ,     ,     ,      ): If you do not fetch all of the data in a result set before issuing your next call to , your call may fail. Call to release the database resources associated with the object before issuing your next call to . Parameters The SQL statement to prepare and execute. If the SQL contains placeholders, and must be used...
✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
D
На сайте с 28.06.2008
Offline
1104
#3
LEOnidUKG #:

Так это не PDO, это через какую-то обвёртку делаешь что-ли?

Да, я же писал выше

Dram :
полез в класс работы с базой,

вот сюда запрос приходит


    public function query(string $sql, $params = [], string $className = 'stdClass'): ?array
    {
        $sth = $this->pdo->prepare($sql);
        $result = $sth->execute($params);

        if (false === $result) {
            return null;
        }

        return $sth->fetchAll(\PDO::FETCH_CLASS, $className);
    }
IS
На сайте с 16.08.2006
Offline
160
#4

delete

LEOnidUKG
На сайте с 25.11.2006
Offline
1748
#5
Так же если вставить значения лимит и офсет прямо в запрос

Добро пожаловать в жестокий мир PDO 😂

Тебе надо INT передавать с параметром:  PDO::PARAM_INT https://www.php.net/manual/ru/pdostatement.execute.php

Иначе у тебя там будет LIMIT '0','10'

D
На сайте с 28.06.2008
Offline
1104
#6
Igor-san #:

Ну так наверное не так

а так

без эффекта. Дело 100% в какой-то своеобразной обработке  LIMIT :offset, :size_page'

стоит их убрать - или вместо параметров поставить числа - все работает.

D
На сайте с 28.06.2008
Offline
1104
#7
LEOnidUKG #:

Добро пожаловать в жестокий мир PDO 😂

Тебе надо INT передавать с параметром:  PDO::PARAM_INT https://www.php.net/manual/ru/pdostatement.execute.php

Иначе у тебя там будет LIMIT '0','10'

да вроде int там, вот я в классе базы делаю вывод, вот что 

    public function query(string $sql, $params = [], string $className = 'stdClass'): ?array
    {
        $sth = $this->pdo->prepare($sql);
        var_dump($params);
        $result = $sth->execute($params);

получаю

array(3) {
  [":catid"]=>
  int(28)
  [":offset"]=>
  int(0)
  [":size_page"]=>
  int(10)
}
LEOnidUKG
На сайте с 25.11.2006
Offline
1748
#8
получаю

Ты путаешь тёплое с мягким.

execute

Начхать, что там твой PHP показывает. Ему надо точно указать, что есть INT и он там уже у себя будет обрабатывать запрос. И опять же внимательно почий документацию, там всё написано об этом.

D
На сайте с 28.06.2008
Offline
1104
#9

Попробовал так, чтобы не отказываться от класса базы, все равно не помогло.

Как же быть если в запросе могут быть и числа и строки?

И почему тогда такой запрос проходит без проблем?

$pagination = $db->query('SELECT * FROM `content` WHERE catid=:catid,[':catid' => 28]);
IS
На сайте с 16.08.2006
Offline
160
#10

Может поможет?

$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
12

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