你的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()
更新数据库之前