@Ilyasssssss
Младший веб разработчик

Как исправить Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: :max?

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: :max

Здравствуйте, пишу сайт для себя в учебных целях. Создал переменную $max которая отвечает за отображение количества постов на главной странице:
public function postsList($route) {    
$max = 1;    
$params = [
               'max' => $max,
               'start' => ((($route['page'] ?? 1) - 1) * $max),
    ];
            return $this->db->row('SELECT * FROM posts ORDER BY id DESC LIMIT :max, :start', $params); 
    }


Выходит фаталка:
Fatal error:  Uncaught PDOException: SQLSTATE[42601]: Syntax error: 7 ОШИБКА:  синтаксис LIMIT #,# не поддерживается
LINE 1: SELECT * FROM posts ORDER BY id DESC LIMIT $1, $2 ^ HINT:  Используйте отдельные предложения LIMIT и OFFSET.
in /var/www/test1.com/application/lib/Db.php:30 
Stack trace: 
#0 /var/www/test1.com/application/lib/Db.php(30): 
PDOStatement->execute() 
#1 /var/www/test1.com/application/lib/Db.php(36): application\lib\Db->query() 
#2 /var/www/test1.com/application/models/Main.php(37): application\lib\Db->row() 
#3 /var/www/test1.com/application/controllers/MainController.php(14): application\models\Main->postsList() 
#4 /var/www/test1.com/application/core/Router.php(53): application\controllers\MainController->indexAction() 
#5 /var/www/test1.com/index.php(17): application\core\Router->run() 
#6 {main} thrown in /var/www/test1.com/application/lib/Db.php on line 30


Если убрать LIMIT:
return $this->db->row('SELECT * FROM posts ORDER BY id DESC', $params);


То тоже фаталка:
Fatal error:  Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: :max in /var/www/test1.com/application/
lib/Db.php:27 
Stack trace: 
#0 /var/www/test1.com/application/lib/Db.php(27): PDOStatement->bindValue() 
#1 /var/www/test1.com/application/lib/Db.php(36): application\lib\Db->query() 
#2 /var/www/test1.com/application/models/Main.php(37): application\lib\Db->row() 
#3 /var/www/test1.com/application/controllers/MainController.php(14): application\models\Main->postsList() 
#4 /var/www/test1.com/application/core/Router.php(53): application\controllers\MainController->indexAction() 
#5 /var/www/test1.com/index.php(17): application\core\Router->run() 
#6 {main}   thrown in /var/www/test1.com/application/lib/Db.php on line 27


функция которая валидирует (в Db.php):
public function query($sql, $params = []) {
              $stmt = $this->db->prepare($sql);
              if (!empty($params)) {
                        foreach ($params as $key => $val) {
                                if (is_int($val)) {
                                            $type = PDO::PARAM_INT;
                                 } else {
                                            $type = PDO::PARAM_STR;
                                 }
               (27 строчка->) $stmt->bindValue(':'.$key, $val, $type);
                        }
              }
      (30 строчка->) $stmt->execute();
              return $stmt;
   }


Помогите пожалуйста разобраться, почему $max = 1 Invalid parameter number и как правильно задать LIMIT
База pgsql, php - 8.2.
  • Вопрос задан
  • 135 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
1. В PostrgeSQL используется синтаксис
[ LIMIT { number | ALL } ] [ OFFSET number ]
2. Нельзя передавать в запрос параметры, для которых в запросе нет плейсхолдеров.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
27 апр. 2024, в 11:55
1000 руб./за проект
27 апр. 2024, в 11:55
1500 руб./за проект
27 апр. 2024, в 11:52
12000 руб./за проект