我有两个db表:wp\\U注释和wp\\U评级。我正在尝试使用$wpdb创建一个查询,它必须执行以下操作:
从…起wp_comments 我必须得到comment_ID\'在那里comment_post_ID 等于当前值post id 获取所有ratings 从…起wp_ratings 哪里comment_id 等于comment_ID\'我从wp_comments.
wp\\U注释表是用于注释的标准wp表。wp\\U评级是自定义的,如下所示:
wp\\U额定值:
我正在努力确定是使用联接还是子查询来实现这一目标。我对写查询很陌生。到目前为止,我只有查询的第一部分:
$my_query = $wpdb -> get_results( "SELECT rating FROM wp_ratings WHERE comment_id =( SELECT comment_ID FROM comments WHERE comment_post_ID = " . the_ID () . " ) " );
我想让评分计算(并显示)平均值,并显示评分数。
编辑:使子字符串部分工作:
$my_query = $wpdb -> get_results( "SELECT comment_ID FROM wp_comments WHERE comment_post_ID = $post->ID" );
找到了一条注释,当您使用双引号时,可以直接插入变量而无需关闭字符串!
SO网友:MikeNGarrett
为了使这项工作顺利进行,您需要做一些不同的事情。
确保正在设置$wpdb
到全球使用$wpdb->prefix
而不是硬编码wp_
.
Wrap your variables in curly braces.使用
$wpdb
变量而不是表名,如
$wpdb->comments
.始终始终始终使用
$wpdb->prepare()
在执行查询之前
使用$wpdb->prepare()
来自
Codex:
在执行SQL查询之前,必须对SQL查询中的所有数据进行SQL转义,以防止SQL注入攻击。prepare方法为WordPress执行此功能,它支持类似sprintf()和vsprintf()的语法。
sprintf
与大多数函数的调用略有不同。就像array_merge()
, 你想说多少就说多少。
首先,指定SQL语句:
$wpdb->prepare(
"SELECT rating
FROM {$wpdb->prefix}ratings
WHERE comment_id = (
SELECT comment_ID
FROM {$wpdb->comments}
WHERE comment_post_ID = %d
)", get_the_ID() )
请注意
%d
在准备声明中?这意味着这里需要一个整数。如果没有从
get_the_ID()
, 该过程将出错以保护您的数据。
接下来,按照预期参数在SQL语句中的显示顺序添加这些参数。由于本声明中只有一个,我们添加get_the_ID()
在SQL语句之后。
把它们放在一起
global $wpdb;
$my_query = $wpdb->get_results(
$wpdb->prepare(
"SELECT rating
FROM {$wpdb->prefix}ratings
WHERE comment_id = (
SELECT comment_ID
FROM {$wpdb->comments}
WHERE comment_post_ID = %d
)",
get_the_ID() )
);