PDO准备好的声明不适用于此查询

时间:2012-11-07 16:34:41

标签: php pdo prepared-statement

我有这个问题:

$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();

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

  

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

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

我的错误是什么?

1 个答案:

答案 0 :(得分:4)

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

要解决此问题,只需使用

更改为准备好的语句
$query = $db->prepare("SELECT ... " );

然后在绑定所有变量后执行

$query->exec();