index.php PHP: $sql = (" SELECT * FROM ( SELECT * FROM `my_table` ORDER BY id DESC LIMIT :lim ) as b order by id ASC "); $lim = 7; $params = array(':lim' => $lim); $row = $dbh->getAll($sql, $params); 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: public function getAll($query, array $params) { $this->sQuery = $this->pdo->prepare($query); $this->sQuery->execute($params); return $this->sQuery; }
Попробуй один параметр вытянуть, заработает может, например: PHP: $sql=(" SELECT b.id FROM ( SELECT id FROM `my_table` ORDER BY id DESC LIMIT :lim ) as b order by id ASC "); Но подобную структуру запроса я впервые вижу, мне кажется она не правильная.
включил логирование на mysql сервере, и вот что попалось. PHP: SELECT * FROM ( SELECT * FROM `my_table` ORDER BY id DESC LIMIT '7' ) as b order by id ASC Почему то 7 в кавычках, поэтому и не работает. Без кавычек все работает. Почему проставляются кавычки ?? Как от этого избавиться ??
@exec кстати мне тоже интересно. Я в свое время перевел колонку таблицы чтобы принимал строчные тип varchar вместо циферок. Так что за тобой подожду ответа =) --- Добавлено --- @exec вот нарыл еще, потести https://php.ru/manual/mysqli.real-escape-string.html
По умолчанию, все параметры считаются строковыми. PHP: $sth->bindValue(':lim', $lim, \PDO::PARAM_INT);
Код (Text): public function getAll($query, array $params) { .... $this->sQuery = $this->pdo->prepare($query); $this->sQuery->bindValue(':lim', $params[':lim'], PDO::PARAM_INT); $this->sQuery->execute($params); .... } Что то не могу победить ..
PHP: $this->sQuery->execute(); // Без $params --- Добавлено --- P.S. В принципе, можно отключить режим эмуляции и обходиться без биндов. PHP: $this->pdo->setAttribute( \PDO::ATTR_EMULATE_PREPARES, false ); В этом случае, должно работать даже в вашем первоначальном варианте
PHP: 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: $sql = (" SELECT * FROM ( SELECT * FROM `my_table` ORDER BY id DESC LIMIT :lim ) as b order by id ASC "); $lim = 7; $params = array(':lim' => $lim); //$dbh->bindValue(':lim', $lim, \PDO::PARAM_INT); $row = $dbh->getAll($sql, $params); var_dump($row); Так как в класее это писать не удобно ..
Вы сейчас о чём? Я вам написал два решения вашей проблемы, а где и что вы будете указывать - дело лично ваше.
@exec дай в студию BD.class.php говнокод --- Добавлено --- и перейди на версию 7.2, так как старикам больше не уступаю место в автобусе, их время вышло.