0

我有这个查询:

$query = $db->query("SELECT

                      posts.post_topic_id,
                      posts.post_content,
                      posts.post_id,
                      posts.post_date,
                      posts.post_by,    
                      posts.post_votes_total,
                      posts.post_suggested_amount, 
                      posts.post_accepted,
                      posts.post_last_edited,
                      posts.post_edit_sum,
                      users.user_id,
                      users.username

                    FROM
                      posts

                    JOIN
                      users
                    ON
                      posts.post_by = users.user_id
                    WHERE
                      posts.post_topic_id = :topic_id
                    ORDER BY
                      :sort
                    LIMIT :start , :per_page
                  ");

$query->bindParam(':topic_id', $topic_id, PDO::PARAM_INT);
$query->bindParam(':sort', $sort, PDO::PARAM_STR);
$query->bindParam(':start', $start, PDO::PARAM_INT);
$query->bindParam(':per_page', $per_page, PDO::PARAM_INT);
$query->execute();

但它不会执行,而是给我和错误:

带有消息“SQLSTATE [42000]”的异常“PDOException”:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在 C:\htdocs\lr\topic.php:577 中的 ':topic_id ORDER BY posts.post_id ASC ' at line 25' 附近使用正确的语法:577 堆栈跟踪:#0 C :\htdocs\lr\topic.php(577): PDO->query('SELECT???? ...') #1 {main}

如果我不准备语句,而我使用普通变量,则查询执行得很好。

我的错误是什么?

4

1 回答 1

4

您混合了准备好的语句和简单查询的方法。该bindParam()方法仅与准备好的语句有关。就其本身而言,该query()方法尝试立即执行给定的查询,但失败了,因为参数尚未被替换。

要解决这个问题,只需使用以下方法一直更改为准备好的语句

$query = $db->prepare("SELECT ... " );

然后绑定所有变量后执行

$query->exec();
于 2012-11-07T16:38:03.460 回答