$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()
!