如何使用带动态列名的prepare()?

时间:2015-06-19 13:28:58

标签: php sql wordpress prepared-statement

我有一个函数,它将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));
}

但是,这段代码不起作用,因为考虑到prepare的性质,我不能将变量用于列名(和表名)。

这有效,但我认为这会带来安全问题:

return $wpdb->get_var('SELECT ' . $column_name . ' FROM myTable WHERE user_id=' . $current_user->user_login); 

为了在我的prepare语句中使用动态列名,我需要做什么?

1 个答案:

答案 0 :(得分:3)

您可以使用"已批准"的列表相反,这样你就不会在查询中真正使用用户数据。像这样:

$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)并将其保存到会话中以便以后使用?