我应该使用wpdb prepare吗?


28

我是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这里使用吗?我该怎么做?

干杯

Answers:


33

最佳做法是始终使用,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,您好,感谢您的明确解释-由于某些原因,当我尝试您的代码时,它将返回一个空数组。我已经检查并仔细检查了错别字。如果我执行未准备的查询,则会得到数组。我不明白为什么它不起作用..!
理查德·斯威尼

奇。我尝试将相同的代码与另一个查询一起使用:$tablename = $wpdb->prefix . "my_custom_table"; $concert_id = 1; $sql = "SELECT * FROM " . $tablename . " WHERE concert_id = %d LIMIT 1;"; $prep_sql = $wpdb->prepare( $sql, $concert_id ); $get_concerts = $wpdb->get_results( $prep_sql , ARRAY_A ); 它的工作原理很棒!不知道为什么会这样。但是无论如何我现在都明白了!
理查德·斯威尼

6
表名单引号引起来将不起作用。正常的转义带有反引号,因此您的查询最终应如下所示:SELECT * FROM `wp_my_custom_table`。您可以启用双引号支持,但随后必须如下所示:SELECT * FROM "wp_my_custom_table"
扬·法布里

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

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

0

使用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 );

0

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

当不需要节省服务器资源时,不要使用复杂的功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.