За последние 24 часа нас посетили 35367 программистов и 1742 робота. Сейчас ищут 1208 программистов ...

PDO prepare

Тема в разделе "PHP для новичков", создана пользователем exec, 29 дек 2018.

  1. exec

    exec Активный пользователь

    С нами с:
    25 дек 2012
    Сообщения:
    34
    Симпатии:
    1
    index.php
    PHP:
    1. $sql = (" SELECT * FROM ( SELECT * FROM `my_table` ORDER BY id DESC LIMIT :lim ) as b order by id ASC ");
    2. $lim = 7;
    3. $params = array(':lim' => $lim);
    4. $row = $dbh->getAll($sql, $params);
    5. var_dump($row);
    получаю ошибку:
    PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]:
    Syntax error or access violation: 1064 You have an error in your SQL syntax;
    check the manual that corresponds to your MySQL server version for the right syntax to use near ''7' ) as b order by id ASC' at line 1'
    in ..../BD.class.php:74\nStack trace:\n#0 ...../BD.class.php(74):
    PDOStatement->execute(Array)\n#1
    ....../index.php(19):
    DB->getAll(' SELECT * FROM ...', Array)\n#2 {main}\n thrown in ...../BD.class.php on line 74

    Сам запрос рабочий. Как то он разворачивается не так, одинарных кавычек много.

    BD.class.php
    PHP:
    1.     public function getAll($query, array $params)
    2.     {
    3.         $this->sQuery = $this->pdo->prepare($query);
    4.         $this->sQuery->execute($params);
    5.         return $this->sQuery;
    6.     }
     
  2. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Попробуй один параметр вытянуть, заработает может, например:
    PHP:
    1. $sql=(" SELECT b.id FROM ( SELECT id FROM `my_table` ORDER BY id DESC LIMIT :lim ) as b order by id ASC ");
    Но подобную структуру запроса я впервые вижу, мне кажется она не правильная.
     
    _ne_scaju_ нравится это.
  3. exec

    exec Активный пользователь

    С нами с:
    25 дек 2012
    Сообщения:
    34
    Симпатии:
    1
    включил логирование на mysql сервере, и вот что попалось.
    PHP:
    1. SELECT * FROM ( SELECT * FROM `my_table` ORDER BY id DESC LIMIT '7' ) as b order by id ASC
    Почему то 7 в кавычках, поэтому и не работает. Без кавычек все работает.
    Почему проставляются кавычки ?? Как от этого избавиться ??
     
  4. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @exec кстати мне тоже интересно. Я в свое время перевел колонку таблицы чтобы принимал строчные тип varchar вместо циферок. Так что за тобой подожду ответа =)
    --- Добавлено ---
    @exec вот нарыл еще, потести https://php.ru/manual/mysqli.real-escape-string.html
     
  5. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    По умолчанию, все параметры считаются строковыми.
    PHP:
    1. $sth->bindValue(':lim', $lim, \PDO::PARAM_INT);
     
  6. exec

    exec Активный пользователь

    С нами с:
    25 дек 2012
    Сообщения:
    34
    Симпатии:
    1
    Код (Text):
    1.     public function getAll($query, array $params)
    2.     {
    3.         ....
    4.         $this->sQuery = $this->pdo->prepare($query);
    5.         $this->sQuery->bindValue(':lim', $params[':lim'], PDO::PARAM_INT);
    6.         $this->sQuery->execute($params);
    7.         ....
    8.     }
    Что то не могу победить ..
     
  7. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    PHP:
    1. $this->sQuery->execute(); // Без $params
    --- Добавлено ---
    P.S. В принципе, можно отключить режим эмуляции и обходиться без биндов.
    PHP:
    1. $this->pdo->setAttribute( \PDO::ATTR_EMULATE_PREPARES, false );
    В этом случае, должно работать даже в вашем первоначальном варианте
     
  8. exec

    exec Активный пользователь

    С нами с:
    25 дек 2012
    Сообщения:
    34
    Симпатии:
    1
    PHP:
    1. object(PDOStatement)#3 (1) { ["queryString"]=> string(88) " SELECT * FROM ( SELECT * FROM `my_table` ORDER BY id DESC LIMIT :lim ) as b order by id ASC " } 111
    Вообще лучше этот параметр указывать в index файле. Что типа:
    PHP:
    1. $sql = (" SELECT * FROM ( SELECT * FROM `my_table` ORDER BY id DESC LIMIT :lim ) as b order by id ASC ");
    2. $lim = 7;
    3. $params = array(':lim' => $lim);
    4. //$dbh->bindValue(':lim', $lim, \PDO::PARAM_INT);
    5. $row = $dbh->getAll($sql, $params);
    6. var_dump($row);
    Так как в класее это писать не удобно ..
     
  9. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Вы сейчас о чём? Я вам написал два решения вашей проблемы, а где и что вы будете указывать - дело лично ваше.
     
  10. exec

    exec Активный пользователь

    С нами с:
    25 дек 2012
    Сообщения:
    34
    Симпатии:
    1
    У меня не работает. У меня массив.
     
  11. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    @exec дай в студию BD.class.php говнокод
    --- Добавлено ---
    и
    перейди на версию 7.2, так как старикам больше не уступаю место в автобусе, их время вышло.
     
  12. exec

    exec Активный пользователь

    С нами с:
    25 дек 2012
    Сообщения:
    34
    Симпатии:
    1
    Хорошо, постараюсь.
    Проблему, решил. Удалил
    var_dump($row);
     
  13. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    нет, ты проблему не решил
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    ясно, дабл килл тс