wpdb::prepare 被错误调用
-
28-09-2020 - |
题
我有这个代码可以在删除自定义帖子类型后删除孤立的帖子。
它有效,但是这段代码...
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::prepare 被调用 不正确地. 。wpdb::prepare() 的查询参数必须有一个占位符。
那么,读完之后 说明 在 Andrew Nacin 的 make.wordpress.org 上,我(有点)认为……嗯……我错过了第二个论点。
然后读完之后 这个堆栈帖子, ,我想知道我是否需要 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'"
);
请指教。
解决方案
始终建议使用 $wpdb->prepare
当您从用户那里获取输入时。这将有助于保护查询免遭 SQL 注入。欲了解更多详情,请查看 法典
当你使用 $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
)
);