@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();
    }
}
  • Вопрос задан
  • 343 просмотра
Решения вопроса 1
DevMan
@DevMan
description и text являются зарезервированными в мускуле.
если хотите их использовать как названия колонок, то используйте бэктик: `description` и `text`. ну и это кагбе общепринятое правило для избегания ошибок.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы