2012-01-12 207 views
0

我已經嘗試了幾件事,但我無法在我的PHP代碼中獲取MySQL查詢來工作。請注意,當我硬編碼整數變量$ lastmsg時,該查詢確實工作。MySQL的查詢包含PHP變量,其中包含另一個變量

代碼工作在兩種情況下:

  1. 頁面加載,查詢運行,忽略$pagination因爲$lastmsg未設置。
  2. 一個按鈕將lastmsg的值發送到此頁面,該頁面再次運行代碼,這次查看$分頁,因爲設置了lastmsg。

此外,查詢確實工作。證明是,它在第​​一個實例中運行得非常好,並在變量被硬編碼時正確返回。 Firebugs報告lastmsg正在通過郵件發送。

問題是查詢沒有收到$ lastmsg的值(我沒有返回任何值)。我知道這是因爲$ lastmsg位於$分頁內。

P.S.我知道它需要注入的保護......我只是試圖讓這個工作:

if(isset($_POST['lastmsg']) &&is_numeric($_POST['lastmsg'])){ 
    $lastmsg = $_POST['lastmsg']; 
    $pagination = 'AND $wpdb->posts.ID < ".$lastmsg."'; 
} else { 
    $pagination = ''; 
} 

$pageposts = $wpdb->get_results($wpdb->prepare(" 
    SELECT * FROM $wpdb->posts 
    LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
    LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) 
    WHERE $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type = 'post' 
    AND $wpdb->posts.post_date < NOW()+INTERVAL 1 DAY 
    AND $wpdb->term_taxonomy.taxonomy = 'category' 
    AND $wpdb->term_taxonomy.term_id IN(3) 
    ".$pagination." 
    ORDER BY $wpdb->posts.post_date DESC 
    LIMIT 10 
    "), OBJECT); 

下不起作用

$pagination = 'AND $wpdb->posts.ID < '; 
$pageposts = $wpdb->get_results($wpdb->prepare(" 
    SELECT * FROM $wpdb->posts 
    LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
    LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) 
    WHERE $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type = 'post' 
    AND $wpdb->posts.post_date < NOW()+INTERVAL 1 DAY 
    AND $wpdb->term_taxonomy.taxonomy = 'category' 
    AND $wpdb->term_taxonomy.term_id IN(3) 
    ".$pagination." 
    ".$lastmsg." 
    ORDER BY $wpdb->posts.post_date DESC 
    LIMIT 10 
    "), OBJECT); 

任何解決方案?

回答

2

這是不是你要找的字符串:這將裏面$pagination文字AND $wpdb->posts.ID < ".$lastmsg.",當你把它交給MySQL的該字符串不會做任何有用的

$pagination = 'AND $wpdb->posts.ID < ".$lastmsg."'; 

你想在外面(插值),雙引號,沒有單引號都:

$pagination = "AND $wpdb->posts.ID < $lastmsg"; 

或者,如果$lastmsg是一個字符串,而不是一個數字:

$pagination = "AND $wpdb->posts.ID < '$lastmsg'"; 

應讓你的第一個版本工作。

現在出發並添加所有mysql_real_escape_string調用。

2

PHP解析器會忽略用單引號('')引用的行,就好像它們是普通字符串一樣。您可以強制PHP解析器通過將它們放在雙引號(「」)中來解析字符串。

在你的情況$分頁是這樣

$pagination = 'AND $wpdb->posts.ID < ".$lastmsg."'; 

外引號是單引號,因此將被PHP和$wpdb->posts.ID忽略,甚至$ lastmsg將被視爲簡單的字符串,他們不會得到他們的PHP值。
只是改變你的字符串

$pagination = "AND $wpdb->posts.ID < '$lastmsg'"; 

如果再$ lastmsg是數字你不需要內報價