我已经尝试了几件事,但是无法在我的PHP代码中使用MySQL查询。请注意,当我将变量$ lastmsg硬编码为整数时,查询确实起作用。

该代码在两种情况下起作用:


页面加载后,查询将运行,忽略$pagination,因为未设置$lastmsg
一个按钮将为lastmsg的值发送到此页面,该页面再次运行代码,这次查看$ pagination,因为设置了lastmsg。


同样,查询确实起作用。证明它在第一个实例中运行得很好,并且在对变量进行硬编码时可以正确返回。 Firebug报告说lastmsg是通过邮寄发送的。

问题在于查询未接收到$ lastmsg的值(我没有返回任何值)。我知道这是因为$ lastmsg位于$ pagination中。

附言我知道它需要注射保护...我只是想让它起作用:

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调用。

09-16 22:00