我有一个函数,它将sql表列名字符串作为参数,返回1个字符串结果:
function myFunction($column_name) {
return $wpdb->get_var($wpdb->prepare("SELECT %s FROM myTable WHERE user_id=%s", $column_name, $current_user->user_login));
}
但是,此代码不起作用,因为出于准备的性质,我不能将变量用于列名(和表名)。
这有效,但我认为它带来了安全问题:
return $wpdb->get_var('SELECT ' . $column_name . ' FROM myTable WHERE user_id=' . $current_user->user_login);
为了在 prepare 语句中使用动态列名,我需要做什么?
您可以改用"已批准"值的列表,这样您就不会在查询中真正使用用户数据。 像这样:
$Approved = array ('firstname', 'lastname', 'birthdate') ;
$Location = array_search($ColumnName, $Approved) // Returns approved column location as int
if($Location !== FALSE) {
// Use the value from Approved using $Location as a key
$Query = $wpdb->Prepare('SELECT ' . $Approved[$Location] . ' FROM myTable WHERE user_id=:userid');
$Query->Execute(array(
:userid => $current_user->user_login
));
return $Query;
} else {
return false;
}
也许获取所有(SELECT * 或 SELECT a,b,c,d)用户数据并将其保存到会话以供以后使用可能更容易?
> 截至 2023 年 3 月 29 日:
从 3 月 29 日发布的里程碑 6.2 开始,您现在可以在表名和列名的语句中使用 %i
而不是 %s
$wpdb-prepare()
占位符。这是关于它的开发说明,其中包含示例。