收到wpdb::Prepare()缺少参数2的警告

时间:2016-02-22 作者:Jayant Rawat

我正在使用prepare 具有更新查询的方法

$updatequery = $wpdb->prepare("UPDATE `".$table_name_sms."` SET sftemplate_name = \'".$message."\',sftemplate_type = \'".$sfact_order_action."\',sftemplate_status = \'".$someSwitchOption001."\' where sfID=\'".$_REQUEST[\'setid\']."\'") or die("yes not working"); 
                     $results = $wpdb->get_results( $updatequery , ARRAY_A );
它工作正常,但它也向我发出警告Missing argument 2 for wpdb::prepare()

我也检查了过去的答案,但所有问题都使用插入或选择查询,没有人将其用于更新查询

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

你的prepare() 这种说法完全错误。prepare() 语句应以sprintf(). 必须为传递两个参数(prepare() 从3.5版开始,它成为强制性的,如果只传递一个,则会得到当前得到的缺少参数警告。如果你看看sprintf() 因为这对你有很大帮助。

目的WPDB::prepare() 是清理传递给语句的变量值,以便prevent SQL injection. 这非常重要。黑客喜欢在表单字段和URL中注入恶意代码,以便尝试访问您的网站,如果您使用来自$_POST$_GET 然后将其保存到db,您将恶意代码与您的值一起保存在db中,然后砰的一声,您的站点就对黑客开放了。

经验法则是,如果任何数据来自外部,即任何用户提交的数据(,其中也包括您),永远不要相信它。始终将此类数据视为已感染和恶意数据。永远不要再相信自己了。SANITIZE, VALIDATE AND ESCAPE 相应的所有数据。

在prepare语句中,应该删除所有变量,并用相应的占位符替换它们。请再次阅读并理解sprintf() 功能页。您不能混合占位符,传递的占位符将决定将在变量值上使用的卫生条件。如果假设变量为字符串,请使用%s 作为占位符,如果值是整数,请使用%d. 我不打算深入讨论这个问题,因为它是纯PHP,所以请务必阅读占位符和sprintf().

例如,您可以将语句重写如下:((未测试)

$wpdb->prepare(
    "
        UPDATE %s 
        SET sftemplate_name = %s, sftemplate_type = %s, sftemplate_status = %s 
        WHERE sfID = %d
    ",
    $table_name_sms,
    $message,
    $sfact_order_action,
    $someSwitchOption001,
    $_REQUEST[\'setid\']
)
几点注意事项我认为使用变量来保存表名是没有必要的,请对其进行硬编码。

我接受所有的值,除了最后一个值应该是字符串,最后一个值是整数

上述只是一个例子,决不是一个有效的例子。在现场尝试之前,你应该首先确保你了解了一切的工作原理

如果您不完全理解prepare语句,为什么不直接使用WPDB::update() 从最初的测试开始,它更容易、更快,并且在使用时自动处理卫生和验证prepare() 更新数据库之前