2012-01-12 157 views
0

我已经尝试了几件事,但我无法在我的PHP代码中获取MySQL查询来工作。请注意,当我硬编码整数变量$ lastmsg时,该查询确实工作。MySQL的查询包含PHP变量,其中包含另一个变量

代码工作在两种情况下:

  1. 页面加载,查询运行,忽略$pagination因为$lastmsg未设置。
  2. 一个按钮将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); 

任何解决方案?

回答

2

这是不是你要找的字符串:这将里面$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调用。

2

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

在你的情况$分页是这样

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

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

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

如果再$ lastmsg是数字你不需要内报价