MySQL的查询包含PHP变量,其中包含另一个变量
问题描述:
我已经尝试了几件事,但我无法在我的PHP代码中获取MySQL查询来工作。请注意,当我硬编码整数变量$ lastmsg时,该查询确实工作。MySQL的查询包含PHP变量,其中包含另一个变量
代码工作在两种情况下:
- 页面加载,查询运行,忽略
$pagination
因为$lastmsg
未设置。 - 一个按钮将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);
任何解决方案?
答
这是不是你要找的字符串:这将里面$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
调用。
答
PHP解析器会忽略用单引号('')引用的行,就好像它们是普通字符串一样。您可以强制PHP解析器通过将它们放在双引号(“”)中来解析字符串。
在你的情况$分页是这样
$pagination = 'AND $wpdb->posts.ID < ".$lastmsg."';
外引号是单引号,因此将被PHP和$wpdb->posts.ID
忽略,甚至$ lastmsg将被视为简单的字符串,他们不会得到他们的PHP值。
只是改变你的字符串
$pagination = "AND $wpdb->posts.ID < '$lastmsg'";
如果再$ lastmsg是数字你不需要内报价