MySQL make query包含PHP变量,其中包含另一个变量

时间:2012-01-12 05:07:29

标签: php mysql variables pagination

我已经尝试了几件事,但我无法在我的php代码中获取MySQL查询。请注意,当我对变量$ lastmsg进行硬编码时,查询会正常工作。

代码在两个实例中起作用:

  1. 当页面加载时,查询会运行,忽略$pagination,因为未设置$lastmsg
  2. 一个按钮将lastmsg的值发送到此页面,该页面再次运行代码,这次查看$ pagination,因为设置了lastmsg。
  3. 同样,查询工作正常。证明它在第一个实例中运行完全正常,并且在变量被硬编码时正确返回。 Firebugs报告称lastmsg是通过邮寄发送的。

    问题是查询没有收到$ lastmsg的值(我没有返回值)。我知道这是因为$ lastmsg坐在$ pagination中。

    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 个答案:

答案 0 :(得分:2)

这不是您要找的字符串:

$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来电。

答案 1 :(得分:2)

PHP解析器将忽略引用单引号('')的行,就像它们是普通字符串一样。您可以强制PHP解析器通过将它们括在双引号(“”)中来解析字符串。

在您的情况下 $ pagination 就像这样

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

外引号是单引号,因此PHP和$wpdb->posts.ID将忽略它们甚至$ lastmsg将被视为简单字符串,它们不会获得它们的PHP值。
只需将您的字符串更改为

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

如果$ lastmsg是数字,则不需要内部引号