我是SQL的新手,我想知道是否需要对下面创建的表使用wpdb->prepare

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = "SELECT * FROM " . $tablename . " ORDER BY date_created DESC";
$resulst = $wpdb->get_results( $sql , ARRAY_A );


我是否需要在这里使用prepare ?我该怎么办?

干杯

#1 楼

最佳做法是始终使用prepare,但是它的主要用途是防止SQL注入攻击,并且由于用户/访问者没有输入或他们不能影响查询,因此在当前示例中这不是问题。

但是就像我之前说过的那样,使用它是最佳实践,一旦开始使用它就永远不会停止,因此在您的示例中,您可以这样使用它:

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM %s ORDER BY date_created DESC",$tablename );
$results = $wpdb->get_results( $sql , ARRAY_A );


欲了解有关如何使用它的更多信息,请转至法典

评论


@Bainternet,您好,感谢您的明确解释-由于某些原因,当我尝试您的代码时,它将返回一个空数组。我已经检查并仔细检查了错别字。如果我执行未准备的查询,则会得到数组。我不明白为什么它不起作用..!

–理查德·斯威尼(Richard Sweeney)
2011年5月11日晚上8:03

奇。我尝试将相同的代码用于另一个查询:$ tablename = $ wpdb-> prefix。 “ my_custom_table”; $ concert_id = 1; $ sql =“选择* FROM”。 $ tablename。 “ WHERE Con​​cert_id =%d LIMIT 1;“; $ prep_sql = $ wpdb-> prepare($ sql,$ concert_id); $ get_concerts = $ wpdb-> get_results($ prep_sql,ARRAY_A);而且效果很好!不知道为什么会这样。但是无论如何我现在都明白了!

–理查德·斯威尼(Richard Sweeney)
2011年5月11日8:36



将表名用单引号引起来将不起作用。普通的转义带有反引号,因此您的查询应最终看起来像这样:SELECT * FROM`wp_my_custom_table`。您可以启用双引号支持,但随后必须如下所示:SELECT * FROM“ wp_my_custom_table”。

– Jan Fabry
2011年5月11日8:52



我不同意这个答案。当函数已经对所有内容进行转义时,为什么还要转义呢?您认为Wordpress会决定从内核中消除转义吗?另外,也没有必要转义表名:),因为它是硬编码的,并且您知道还可以。我知道这只是示例,但无论如何都不能转义表名,在使用带有表名的prepare时会出现问题,它会增加反引号和SQL trows错误。

– Tommixoft
2014年11月4日12:41

@Tommixoft如果您再次阅读答案,您会发现您说的实际上与我说的相同,并且表名就是一个例子。

–互联网
2014年11月5日在7:07

#2 楼

当您使用prepare时,它可以保护代码免受SQL注入漏洞的影响。

这是使用prepare()时需要修改的代码;

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM {$tablename} ORDER BY date_created DESC");
$resulst = $wpdb->get_results( $sql , ARRAY_A );


评论


仅仅因为您使用prepare(),代码不会自动受到SQL注入的保护。您的代码可能会建议保护$ tablename防止SQL注入,因为在prepare中会用到它,而不是这种情况,因为它不是通过参数提供的。在这种情况下,这不是问题,因为$ tablename的内容是安全的,但我认为最好将其清除。

–康斯坦丁
20/12/28在15:04

#3 楼

在您的情况下,不可能进行SQL注入攻击。您的代码不需要额外的保护,因为不使用用户输入,例如:发布,获取,请求,cookie。

在不需要节省服务器资源的情况下,请勿使用复杂的功能。