单独传入MySQL PREPARE语句参数引发错误

时间:2022-01-24 作者:thisissparzo

我有一些代码如下所示:

$stmt = $wpdb->prepare("SELECT * FROM <tablename> WHERE user_id = %d", $user_ID);
看起来效果不错。。。

然而,我有一些查询会变得很长,所以我想做一些类似的事情:

$query = ("SELECT * FROM <tablename> WHERE user_id = {$user_ID}"); // string variable
$stmt = $wpdb->prepare($query);
为了实现可伸缩性,这是一种更好的编写方法。我认为这不会有什么问题。但是,我遇到了以下错误:

Notice: wpdb::prepare was called incorrectly. The query argument of wpdb::prepare() must have a placeholder.
我想我理解这个错误的意思:它必须在方法中包含查询和变量,这样它才能;自行准备;。

你能帮我理解为什么会这样吗?安全另外,请帮助我找到另一种预先定义大型查询语句的方法,以便更好地组织代码。

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

$query = ("SELECT * FROM <tablename> WHERE user_id = {$user_ID}"); // string variable
$stmt = $wpdb->prepare($query);
说出你的$user_ID9, 这将被评估为:

$query = ("SELECT * FROM <tablename> WHERE user_id = 9");
$stmt = $wpdb->prepare($query);
最终成为

$stmt = $wpdb->prepare("SELECT * FROM <tablename> WHERE user_id = 9");
现在它抱怨没有占位符(如%d was),这是正确的。你不再使用预先准备好的语句了,这很糟糕。因为如果$user_ID\'\' OR 1=1 语句变为

$stmt = $wpdb->prepare("SELECT * FROM <tablename> WHERE user_id = \'\' OR 1=1");
突然间,您对各种SQL注入敞开了大门。

如果您想将查询和变量更多地分组在一起,我建议您使用以下方法:

$query = [
    \'sql\' => \'SELECT * FROM <tablename> WHERE user_id = %d\',
    \'args\' => [
        $user_Id,
    ],
];
$stmt = $wpdb->prepare($query[\'sql\'], $query[\'args\']);
或者使用其他任何东西。But do not remove the %d from the SQL query, 否则,您将失去prepare()!

相关推荐

如何批量查找和替换发布图像URL的MySQL

网站迁移后,我发现有些帖子的图片URL放错了位置。假设这篇文章的图像URL应该在/2021/07/年,然而它变成了/2020/07年,图像死了404年。我必须从古腾堡编辑器手动替换图像URL。https://ibb.co/bggdX7V如果我想用SQL命令来做这件事,我应该如何以安全的方式来做呢?从wp\\U postmeta表中查找所有wp content/uploads/2021/07/,替换为wp content/uploads/2021/07/,是否正确?谢谢