我已经尝试了几件事,但是无法在我的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
调用。