如何通过PDO选择动态列到变量?

时间:2015-02-02 17:18:48

标签: php mysql pdo

我有一个带有列名的PHP变量$col。我想用PDO创建一个查询,选择该列的值。我知道如何使用bindValue(),并尝试了以下内容:

$db = new PDO('mysql:host='. $db_host . ';dbname=' . $db_name . ';charset=utf8', $db_user, $db_password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

function get_user($id, $column){

    $sql = "
        SELECT :col
        FROM users
        WHERE `id` = :id;";

    try {
        $st = $db->prepare($sql);
        $st->bindValue('col', $column, PDO::PARAM_STR);
        $st->bindValue(':id', $id, PDO::PARAM_INT);
        $st->execute();
        $result = $st->fetch();
        return $result;
    } catch (PDOException $e) {
        echo "Database query exception: " . $e->getMessage();
        return false;
    }
}

这会导致以下异常:Database query exception: SQLSTATE[42S22]: Column not found: 1054 Unknown column ''name'' in 'field list' $col = 'name'。当然,列name确实存在。

它在WHERE = :value上运行良好,但我无法让它适用于专栏。怎么做到这一点?

另外:我确实找到了函数bindColumn(),但我认为相反,将列名绑定到PHP变量而不是将变量绑定到列。

2 个答案:

答案 0 :(得分:1)

您可以使用允许列名称数组来清理查询。

$allowed_columns = array('name', 'type1',etc);//Array of allowed columns to sanatise query 

然后检查列名是否在数组中。

if (in_array($column, $allowed_columns)){
      $result= get_user($id, $column);
}
function get_user($id, $column){

    $sql = "
        SELECT $column
        FROM users
        WHERE `id` = :id;";

    try {
        $st = $db->prepare($sql);
        $st->bindValue(':id', $id, PDO::PARAM_INT);
        $st->execute();
        $result = $st->fetch();
        return $result;
    } catch (PDOException $e) {
        echo "Database query exception: " . $e->getMessage();
        return false;
    }
}

答案 1 :(得分:1)

我会使用 array_intersect 之类的东西,比如只提取允许字段的清理功能。例如:

function get_fields_allowed($input_fields,$allowed){
  $input_fields=explode(",",$input_fields);
  $allowed=explode(",",$allowed);
  return array_intersect($allowed,$input_fields);
}


$select_fields=$_POST["fields"];  //example: "id,name,email"

$fields=get_fields_allowed ($select_fields, "id,name" ) ;

然后你使用$字段,如:

$sql="Select $fields FROM [table] WHERE id=:id etc...";