【问题标题】:Wordpress Query / Loop duplicating same content 24 timesWordpress 查询/循环复制相同内容 24 次
【发布时间】:2013-01-15 06:04:43
【问题描述】:

我遇到了一个小的查询问题,也许您可​​以帮我解决。我正在尝试从具有特定评论元的帖子中获取所有 cmets。这是我目前所拥有的:

$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments INNER JOIN wp_commentmeta WHERE comment_post_ID = '256' AND comment_approved = '1' AND meta_key = 'bestcomment' AND meta_value = 'yes' ");  ?>
<ul id="bestcomment">
<h2>Best Comment</h2>
<?php
if ( $comments ) : foreach ( (array) $comments as $comment) :
echo  '<li class="recentcomments">' . sprintf(__('%1$s on %2$s'), get_comment_author_link(), '<a href="'. get_comment_link($comment->comment_ID) . '">' . get_the_title($comment->comment_post_ID) . '</a>') . '</li>';
endforeach; endif;?></ul>

这篇文章应该只有一条评论。不幸的是,查询显示相同的结果 24 次。所以循环肯定有问题。想法?

【问题讨论】:

  • 感谢 JW,我解决了这个问题: get_results("SELECT * FROM $wpdb->cmets INNER JOIN $wpdb->commentmeta ON($wpdb- >cmets.comment_ID = $wpdb->commentmeta.comment_id) 其中comment_post_ID = '256' AND comment_approved = '1' AND meta_key = 'bestcomment' AND meta_value = 'yes' "); ?>

标签: mysql sql wordpress loops


【解决方案1】:

循环没有问题。问题是您的查询产生了cartesian product (CROSS JOIN),因为您没有指定应该链接两个表的列。

我能给出的最快答案是在ON 子句上定义链接列,

$comments = $wpdb->get_results("
SELECT * 
FROM $wpdb->comments a
      INNER JOIN wp_commentmeta b
         ON a.ColumnName = b.Columnname           <== define here
WHERE comment_post_ID = '256' AND 
      comment_approved = '1' AND 
      meta_key = 'bestcomment' AND 
       meta_value = 'yes' ");

只需将ColumnName 更改为表中列的真实名称即可。

要了解更多关于JOIN的信息,请查看下面的文章,

【讨论】:

  • 你完全正确!谢谢。我更改了它,现在它可以正确显示了。
  • 附带说明,如果值 (s) 来自外部,则查询很容易受到 SQL Injection 的攻击。请看下面的文章,了解如何预防。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。 see How to prevent SQL injection in PHP?
猜你喜欢
  • 1970-01-01
  • 2012-12-23
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
相关资源
最近更新 更多