php - 如何使用 PDO 通过变量从动态列中进行选择?

标签 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;
    }
}

这会导致以下异常:数据库查询异常:SQLSTATE[42S22]:未找到列:1054 Unknown column ''name'' in 'field list' for $col = '名称'。当然,name 列确实存在。

它在 WHERE = :value 上运行良好,但我无法让它在列上运行。如何实现这一目标?

补充:我确实找到了函数 bindColumn(),但我认为它的作用相反,将列名绑定(bind)到 PHP 变量,而不是将变量绑定(bind)到列。

最佳答案

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

$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;
    }
}

关于php - 如何使用 PDO 通过变量从动态列中进行选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28283141/

相关文章:

php - MacOs 中的 Docker 非常慢

php - Laravel 中的 eval() 不执行字符串

mysql 删除出现数字后的所有内容(包括数字)

php - JSON 解析器无法转换我的字符串

mysql - 尽管设置正确,Aurora Serverless MySQL 仍给出 "Index Column Size Too Large"

mysql - 如何只计算前 5 个项目,然后将剩余的项目分组到 'other' bin 下?

php - 用于 MS SQL Server 的 PDO DBLIB 驱动程序 : Cannot find php_pdo_driver. h

php - mySQL SELECT 和 COUNT 极速查询

pdo - 使用 PDO 连接到 Sybase 的正确 DSN

php - 为 php mysql 中的特定行保留一些 id