【问题标题】:PDO prepared statement wont work with this queryPDO 准备好的语句不适用于此查询
【发布时间】:2012-10-27 18:22:19
【问题描述】:

我有这个查询:

$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' 附近使用正确的语法:\htdocs\lr\topic.php:577 堆栈跟踪:#0 C :\htdocs\lr\topic.php(577): PDO->query('SELECT???? ...') #1 {main}

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

我的错误是什么?

【问题讨论】:

  • 另一个常见问题:确保$start$per_page$topic_id 包含实际的整数值。使用var_dump() 进行验证。
  • near ':topic_id ORDER BY posts.post_id ASC ' at line 25' 看起来您发布的查询与给出错误的查询不完全相同? (你这里有“:topic_id ORDER BY :sort LIMIT”)
  • Jup,即便如此,也不使用prepare。这首先需要解决。

标签: php pdo prepared-statement


【解决方案1】:

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

要解决这个问题,只需使用

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

绑定所有变量后再执行

$query->exec();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多