Wpdb::Prepare调用不正确

时间:2014-06-16 作者:sleeper

我有这个代码来删除自定义帖子类型后的孤立帖子。

这是可行的,但这个代码。。。

global $wpdb;
$wpdb->query( 
    $wpdb->prepare( 
    "DELETE a,b,c FROM wp_posts a
    LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
    LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
    WHERE a.post_type=\'attorneys\'"
  )
);
。。。正在引发此错误:

PHP注意:调用了wpdb::prepareincorrectly. wpdb::prepare()的查询参数必须有占位符。

所以,在阅读之后the explanation 正在制作。wordpress。Andrew Nacin,我(sorta)推测。。。好我错过了第二个论点。

然后在阅读之后this stack post, 我想知道我是否需要prepare() 作用Are there 是否有包含未知值的变量?我不清楚。

。。。我错过了什么?

更新:这段代码也可以工作,但不带prepare(),我想知道它是否安全。

global $wpdb;
$wpdb->query( 
  "DELETE a,b,c FROM wp_posts a
  LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
  LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
  WHERE a.post_type=\'attorneys\'"
);
请告知。

1 个回复
最合适的回答,由SO网友:Chittaranjan 整理而成

通常建议使用$wpdb->prepare 当您从用户处获取输入时。这将有助于保护查询不受SQL注入的影响。有关更多详细信息,请查看Codex

当您使用$wpdb->prepare, 必须将变量传递给查询。在您的情况下,可以跳过使用$wpdb->prepare 使用硬编码值时。但是,如果变量的值相同,则需要按如下所示对其进行修改

$post_type = \'attorneys\';

$wpdb->query( 
     $wpdb->prepare(
          "DELETE a,b,c FROM wp_posts a
          LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
          LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
          WHERE a.post_type=%s",
          $post_type
     )
);

结束

相关推荐

使用wpdb获取按字母顺序排序的数据

我的WP中有一个从数据库获取数据的函数,下面是函数function thebook_get_provider_types() { global $wpdb; static $provider_types; if (! isset($provider_types)) { $row = $wpdb->get_row(sprintf(\'SELECT * FROM wp_postmeta WHERE meta_id = %d