2012-11-07 61 views
0

林工作:PDO預處理語句不會與此查詢有此查詢

$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:577堆棧跟蹤:#0 C附近的':topic_id ORDER BY posts.post_id ASC'處使用正確的語法:\ htdocs中\ LR \ topic.php(577):PDO->查詢( 'SELECT ???? ...')#1 {}主要

如果我不準備發言,並我使用正常的變量,查詢執行得很好。

我的錯誤是什麼?

+2

另一個常見的問題後,再執行:確保'$ start'和'$ per_page'和'$ topic_id'包含實際的整數值。使用'var_dump()'來驗證。 – hakre

+0

'near':topic_id ORDER BY posts.post_id在第25行的ASC'它看起來像你發佈的查詢不完全是給出錯誤的那個? (你的這裏有「:topic_id ORDER BY:sort LIMIT」) –

+0

Jup,即使這樣,不使用'prepare'。這需要首先解決。 – hakre

回答

4

混合了預處理語句和簡單查詢的方法。 bindParam()方法只涉及準備好的語句。本身,query()方法試圖立即執行給定的查詢,因爲參數尚未被替換,所以失敗。

爲了解決這個問題,只需更改到準備好的發言一直使用

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

,然後結合所有變量

$query->exec(); 
+0

對我很不小心。我錯過了好幾天......謝謝。 – villeroy