Я кажется понял - а нет разницы, гет или пост запросы. Вероятно нужно так же обрабатывать из в роутере и кидать на нужный контроллер и там уже с ними работать. Да! сейчас буду пробовать.
P.S. да, так заработало!
Не подключен файл с классом.
Ну это банальщину я то понял. Мне непонятно почему он не подключен, use прописан верно
<?php namespace Services; use Models\Comments\Comments; ini_set('display_errors', '1'); ini_set('display_startup_errors', '1'); error_reporting(E_ALL); if(!empty($_POST['view']=='moderation')){ if($_POST['task']=='remove'){ Comments::remove($_POST['item_id']); } }
<br /> <b>Fatal error</b>: Uncaught Error: Class 'Models\Comments\Comments' not found in /var/www/com/Services/moderation.php:11 Stack trace: #0 {main} thrown in <b>/var/www/com/Services/moderation.php</b> on line <b>11</b><br />
мои мысли такие - так как я обращаюсь к файлу moderation.php напрямую, то автозагрузка не работает и класс не загружается.
Но я пробовал инклюдить его напрямую - результат тот же.
Может обработку POST запросов нужно перенести в индекс пхп ниже автозагрузки и кидать запросы в корневой index.php?
Проблему решила строчка
$this->pdo->setAttribute( \PDO::ATTR_EMULATE_PREPARES, false );
Добавленная в метод класса работы с базой
public function query(string $sql, $params = [], string $className = 'stdClass'): ?array { $this->pdo->setAttribute( \PDO::ATTR_EMULATE_PREPARES, false ); $sth = $this->pdo->prepare($sql); $result = $sth->execute($params); if (false === $result) { return null; } return $sth->fetchAll(PDO::FETCH_CLASS, $className); }
Я правильно пронимаю что я отключил по сути "подготовленные запросы" и теперь потенциально увеличился риск SQL инъекций?
Попробовал так, чтобы не отказываться от класса базы, все равно не помогло.
Как же быть если в запросе могут быть и числа и строки?
И почему тогда такой запрос проходит без проблем?
$pagination = $db->query('SELECT * FROM `content` WHERE catid=:catid,[':catid' => 28]);
Добро пожаловать в жестокий мир 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)}
Ну так наверное не так
а так
без эффекта. Дело 100% в какой-то своеобразной обработке LIMIT :offset, :size_page'
стоит их убрать - или вместо параметров поставить числа - все работает.
Так это не PDO, это через какую-то обвёртку делаешь что-ли?
Да, я же писал выше
вот сюда запрос приходит
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); }
Отсюда повальное снижение CPMV. И дохода в целом.
Все гораздо проще. Новый год, пьяное начало года прошло и фирмы (те, что остались - и это КЛЮЧЕВОЙ момент) начали пилить рекламные бюджеты, которые сдулись многократно в связи сами знаете с чем.
Абсолютно согласен, у меня такое реализовано на портале с > 1 млн. страниц, проблем нет. Все равно типов (групп, называйте как хотите) страниц даже на мегапорталах не более пары десятков, а в подавляющем кол-ве случаев в районе десятка. Вообще проблем нет разделить для них стили и скрипты.