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

しかし、それは実行されず、代わりにエラーが発生します:

例外 'PDOException' とメッセージ 'SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1064 SQL 構文にエラーがあります。C:\htdocs\lr\topic.php: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 に答える