Почему возникает ошибка SQLSTATE[42000] при запросе обновления в базе данных?

Добрый день!

Пытаюсь обновить информацию в базе данных через php скрипт, но получаю ошибку:

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 MariaDB server version for the right syntax to use near 'WHERE id = 1 SET content = '

Информацию из базы получаю, редактирую, записываю в переменную и далее пытаюсь обновить.
Сам скрипт:

$dbh = new PDO('mysql:dbname=database;host=localhost', 'usr', 'password');
$sth = $dbh->prepare("SELECT id, content FROM posts WHERE visibility = '1'");
$sth->execute();
$posts = $sth->fetchAll(PDO::FETCH_ASSOC);

Манипуляции c content

 $res = $dbh->query("UPDATE posts SET content = $content WHERE id = $id");

    if ($res === FALSE) {
        echo mysqli_error($dbh) . PHP_EOL;
    } else {
        echo "Пост - " . $id . PHP_EOL;
    }


Запрос напрямую в БД через phpmyadmin работает. Тип переменных: id (int), content (string)
  • Вопрос задан
  • 891 просмотр
Решения вопроса 1
@dm_gusev Автор вопроса
Работает вот так:

$dbh = new PDO('mysql:dbname=database;host=localhost', 'usr', 'password');
$sth = $dbh->query("SELECT id, content FROM posts WHERE visibility = '1'");
$sth->execute();
$posts = $sth->fetchAll(PDO::FETCH_ASSOC);

Манипуляции c content

 $res = $dbh->prepare("UPDATE posts SET content = $content WHERE id = $id");

    if ($res === FALSE) {
        echo mysqli_error($dbh) . PHP_EOL;
    } else {
        echo "Пост - " . $id . PHP_EOL;
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Потому что бессмысленный говнокод.
У меня племянница трёхлетняя так дом строит: деревья, мишку плюшевого, колеса от грузовика - всё в дело идёт.
Но ей хотя бы ума хватает не класть сверху мороженое. А тут всё вперемешку - SQL кривой, prepare используется там где не нужно, и не используется где нужно, каким-то боком mysqli...

Переменные не пишут прямо в запрос. А передают отдельно. Потому что именно от этого все ошибки и происходят.
И как раз для этого и используют PDO, с pepare и execute

$options = [
    \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
    \PDO::ATTR_EMULATE_PREPARES   => false,
];
$dbh = new PDO('mysql:dbname=database;host=localhost;charset=$charset', 'usr', 'password', $options);

$stmt = $dbh->prepare("UPDATE posts SET content = ? WHERE id = ?");
$stmt->execute([$content,$id]);
echo "Пост - " . $id . PHP_EOL;
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы