簡體   English   中英

MySQL的make查詢包括PHP變量,其中包含另一個變量

[英]MySQL make query include PHP variable which contains another variable

我已經嘗試了幾件事,但是無法在我的PHP代碼中使用MySQL查詢。 請注意,當我將變量$ lastmsg硬編碼為整數時,查詢確實起作用。

該代碼在兩種情況下起作用:

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

同樣,查詢確實起作用。 證明它在第一個實例中運行得很好,並且在對變量進行硬編碼時可以正確返回。 Firebug報告說lastmsg是通過郵寄發送的。

問題在於查詢未接收到$ lastmsg的值(我沒有返回任何值)。 我知道這是因為$ lastmsg位於$ pagination中。

PS我知道它需要注射保護...我只是想讓它起作用:

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

有什么辦法嗎?

這不是您要查找的字符串:

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

這將保留文字AND $wpdb->posts.ID < ".$lastmsg." $pagination ,當您將其交給MySQL時,該字符串將無用。

您需要在外部使用雙引號(用於插值),而根本不使用單引號:

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

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

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

那應該可以使您的第一個版本正常工作。

現在繼續添加所有的mysql_real_escape_string調用。

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

在你的情況下$ pagination像這樣

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

外部引號是單引號,因此PHP和$wpdb->posts.ID甚至$ lastmsg都將其視為簡單字符串,它們不會獲得其PHP值。
只需將您的字符串更改為

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

同樣,如果$ lastmsg是數字,則不需要內引號

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM