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