PDO Error - PDOException 'с сообщением' SQLSTATE [HY000]: общая ошибка '

Я получаю эту ошибку:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error' in ...

.. всякий раз, когда я выполняю этот код с PDO:

 //Select data from the topic.
            $s = $dbh->prepare("SELECT * FROM forum_topics WHERE forum_id=:forum_cat_id AND topic_id=:topicid");
            $s->bindParam(':forum_cat_id', $forum_cat_id);
            $s->bindParam(':topicid', $topicid);
            $s->execute();
            $f= $s->fetch();

            $s = $dbh->prepare("UPDATE forum_cats SET forum_last_postid=:last_post_id, forum_last_posttime=:time, forum_last_userid=:userid, forum_last_username=:username, forum_posts=forum_posts+1 WHERE forum_id=:forum_cat_id");
            $s->bindParam(':last_post_id', $last_post_id);
            $s->bindParam(':time', $time);
            $s->bindParam(':userid', $userid);
            $s->bindParam(':username', $userdata['username']);
            $s->bindParam(':forum_cat_id', $forum_cat_id);
            try {
                $s->execute();
            }
            catch(PDOException $e) {
                die($e->getMessage());
            }

            if(count($s->fetchAll()) == 0)
                return 3;

Я понятия не имею, почему это происходит. Я проверил запрос, и я просто не могу найти никаких ошибок.

Ответ 1

Вот что происходит:

  • Вы пытаетесь получить запрос UPDATE. Вы не можете этого сделать, потому что запросы UPDATE не возвращают значения. Если вы хотите узнать, сколько строк повлияло на запрос, используйте функцию rowCount(). Обратите внимание, что не все драйверы DB предоставляют затронутые строки.

  • Вы используете необъявленные переменные (по крайней мере, в коде, который вы разместили здесь). Это не является причиной этой конкретной ошибки, но может генерировать другие.

  • Вы не используете данные, которые вы выбрали из базы данных

    Кроме того, рекомендуется делать все операции PDO внутри блока try, иначе вы можете получить необработанные исключения.

Ответ 2

Для других, которые пришли сюда, пытаясь расшифровать это эзотерическое сообщение об ошибке, как и я, позвольте мне добавить, что:

Попытка запускать выборки в операциях pdo, таких как:

$statement->fetchAll();

или

$statement->fetchAll(PDO::FETCH_ASSOC);

... после того, как оператор INSERT или UPDATE ** может вызвать эту ошибку (поскольку нет данных для извлечения).

** Оператор UPDATE... RETURNING... является исключением из этого.