【发布时间】:2017-11-03 21:49:57
【问题描述】:
我有一个带有列名的 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' for $col = 'name'。当然,name 列确实存在。
它在WHERE = :value 上运行良好,但我无法让它在列中运行。如何做到这一点?
补充:我确实找到了函数bindColumn(),但我认为相反,将列名绑定到PHP变量而不是将变量绑定到列。
【问题讨论】:
-
(抱歉,我无法正确地用反引号标记代码块。)
-
您不能通过参数绑定来执行此操作 - 原因请参见 this answer。您将需要清理该列名称并将其手动添加到查询中。
-
不可能。占位符只能代表查询中的 VALUES,而不能代表列或字段名。您将不得不使用古老的 sql-injection-vulnerable
SELECT $field FROM $table-type 字符串构造方法