首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPDB:更新表

WPDB:更新表
EN

WordPress Development用户
提问于 2021-03-23 00:08:29
回答 2查看 3.7K关注 0票数 0

我目前正在开发我的第一个WordPress插件,目前对如何更改数据库中的记录感到有点困惑。

到目前为止,我已经使用$wpdb::update()函数对其进行了求解:

代码语言:javascript
复制
public function toggle_status() {
    global $wpdb;
    $id = (int) $_POST["id"];
    $active = (int) $_POST["active"];
    $tablename = $wpdb->prefix . 'myplugin_table';
    $wpdb->update($tablename, array("active" => $active), array("id" => $id)); // Update record
}

现在,我已经了解到,对于SQL注入,更改数据库的方式是不安全的。我应该使用$wpml::prepare()函数:

代码语言:javascript
复制
$wpdb->query($wpdb->prepare("UPDATE $tablename SET active = '%s' WHERE id = '%d'", array($active, $id)));

$wpdb::update()函数真的不安全吗?

根据文档,这对于$wpdb函数来说不是必需的:"$data应该是未转义的(函数将为您转义它们)。键是列,值是值。“(https://codex.wordpress.org/Data_Validation#Database)。

EN

回答 2

WordPress Development用户

发布于 2021-03-23 01:19:52

现在,我已经了解到,对于SQL注入,更改数据库的方式是不安全的。

所以我想知道你是从哪里学来的?

除此之外,您应该检查这两个POST变量是否真的设置了,在我看来,您的toggle_status()代码很好,$wpdb->update()是在WordPress中更新数据库中记录的一种简单方法,所以您应该只使用这个函数,而不是使用"long“版本:$wpdb->query( $wpdb->prepare( "UPDATE ...", ... ) )

实际上,如果要使用该版本,那么正确的语法是:

代码语言:javascript
复制
$wpdb->query(
    $wpdb->prepare( "UPDATE $tablename SET active = %s WHERE id = %d", $active, $id )
);

也就是说,不要将查询值占位符封装在引号中,例如,仅用%s而不是'%s',对于每个占位符,将其替换值作为$wpdb->prepare()的直接参数传递,而不是像在代码中那样作为数组的一部分。

是的,使用$wpdb->update(),您应该传递原始数据,而不是转义数据,例如传递"foo" as-is,而不是像\"foo\"那样转义。否则,函数将双转义,转义值为\\\"foo\\\".

票数 1
EN

WordPress Development用户

发布于 2022-01-21 21:40:37

如果您检查源代码$wpdb->update(),它所做的最后一件事就是准备查询,然后运行它并返回它。

因此,要回答你的问题,它是安全的,文件是正确的。

票数 1
EN
页面原文内容由WordPress Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://wordpress.stackexchange.com/questions/385544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档