@3dben

Почему не работает update?

В общем пишу свой "велосипед". Решил написать CRUD для постов блога. Работает всё кроме update. Не могу обновить запись в БД. Не понимаю в чём проблема. Кричит что ошибка синтаксическая, но я всё верно сделал. О_о в общем посмотрите. Может быть подскажите где я сделал ошибку.

Код ошибки:

Fatal error: Uncaught PDOException: 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 ' description, text WHERE id = ?' at line 1 in C:\OSPanel\domains\framework\components\engine\DB.php:31 Stack trace: #0 C:\OSPanel\domains\framework\components\engine\DB.php(31): PDO->prepare('UPDATE posts SE...') #1 C:\OSPanel\domains\framework\app\models\Post.php(34): components\engine\DB->query('UPDATE posts SE...', Array) #2 C:\OSPanel\domains\framework\app\controllers\admin\PostController.php(79): app\models\Post->updatePostById('3', 'aaaaaaaaaaaaaaa...', 'vvvvvvvvvvvvvvv...', 'eeeeeeeeeeeeeee...') #3 C:\OSPanel\domains\framework\components\engine\Router.php(81): app\controllers\admin\PostController->updateAction() #4 C:\OSPanel\domains\framework\index.php(8): components\engine\Router::run() #5 {main} thrown in C:\OSPanel\domains\framework\components\engine\DB.php on line 31


Это экшен в контроллере:
public function updateAction()
    {
        $model = new Post;

        $post = $model->getPostById($this->route['id']);

        if (isset($_POST['submit'])){

            $title = $_POST['title'];
            $description = $_POST['description'];
            $text = $_POST['text'];

            $errors = false;

            if(!$model->checkText($title,6)){
                $errors[] = 'Поле title не должно быть пустым, минимальное кол-во символов 6';
            }

            if(!$model->checkText($description,10)){
                $errors[] = 'Краткое описание дожно состоять минимум из 10 символов';
            }

            if(!$model->checkText($text,15)){
                $errors[] = 'Минимальнок кол-во симколов в в полном описании - 15 символов';
            }

            if ($errors == false){
                $model->updatePostById($this->route['id'],$title,$description,$text);

                redirect('/admin/post/index');
            }
        }
        $this->set(compact('post', 'errors', 'sss'));
    }


Получение поста по его id
public function getPostById($id){
        $params = [
          'id' => $id
        ];
        return $this->db->one('SELECT * FROM posts WHERE id = :id',$params);
    }


Метод который должен внести изменения в БД т.е. сделать update
public function updatePostById($id, $title, $description, $text){
        $params = [
            'id' => $id,
            'title' => $title,
            'description' => $description,
            'text' => $text,
        ];
        $this->db->query('UPDATE posts SET title, description, text WHERE id = :id', $params);
    }


На всякий случай класс БД и методы для работы с ней. Чтобы было понятно как это всё связанно у меня
class DB
{

    use Singleton;

    protected $db;

    /**
     * DB constructor.
     */
    protected function __construct(){
        $db = require ROOT . '/components/config/config_db.php';

        $opt = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   => false,
        ];

        $this->db = new PDO($db['dsn'],$db['user'],$db['pass'],$opt);
    }

    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;
                }
                $stmt->bindValue(':'.$key, $val, $type);
            }
        }
        $stmt->execute();
        return $stmt;
    }

    public function one($sql, $params = []) {
        $result = $this->query($sql, $params);
        return $result->fetch();
    }

    public function all($sql, $params = []) {
        $result = $this->query($sql, $params);
        return $result->fetchAll();
    }

    public function col($sql, $params = []) {
        $result = $this->query($sql, $params);
        return $result->fetchColumn();
    }

    public function lastInsertId() {
        return $this->db->lastInsertId();
    }
}
  • Вопрос задан
  • 339 просмотров
Решения вопроса 1
DevMan
@DevMan
description и text являются зарезервированными в мускуле.
если хотите их использовать как названия колонок, то используйте бэктик: `description` и `text`. ну и это кагбе общепринятое правило для избегания ошибок.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽