如何通过带有 PDO 的变量从动态列 select?
How to select from a dynamic column through a variable with 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'
for $col = 'name'
。当然,name
列确实存在。
它在 WHERE = :value
上运行良好,但我无法让它在专栏上运行。如何实现?
补充:我确实找到了函数 bindColumn()
,但我认为这样做恰恰相反,将列名称绑定到 PHP 变量而不是将变量绑定到列。
您可以使用一组允许的列名称来清理查询。
$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;
}
}
我会使用 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" ) ;
因此您可以使用 $fields,如下所示:
$sql="Select $fields FROM [table] WHERE id=:id etc...";
我有一个带有列名的 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 变量而不是将变量绑定到列。
您可以使用一组允许的列名称来清理查询。
$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;
}
}
我会使用 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" ) ;
因此您可以使用 $fields,如下所示:
$sql="Select $fields FROM [table] WHERE id=:id etc...";