php - PDO - 准备好的语句不能正确处理变量

标签 php mysql variables pdo prepared-statement

我有一个变量 ($q=$_GET["q"];),我想用它来运行我准备好的语句。它包含我的数据库表的列名。

变量的值来自下拉列表。当我运行以下代码时,输​​出是在列表中选择的精确值。所以它只是一个列名。

$q=$_GET["q"];

$dsn = "mysql:host=$host;port=$port;dbname=$database";

$db = new PDO($dsn, $username, $password);

$sql = "SELECT DISTINCT ? FROM repertoire";
$stmt = $db->prepare($sql);
$stmt->execute(array($q));

    echo "<select>";
    while ( $row = $stmt->fetchObject() ) {
        echo "<option>";
        echo "{$row->{$q}}";
        echo "</option>";
        }
    echo "</select>";

但是,当我更改此行时 $sql = "SELECT DISTINCT ? FROM repertoire";

$sql = "SELECT DISTINCT ".$q."FROM repertoire"; 我从数据库中获取了所需的行...

我不太擅长 PHP,所以我猜我的语法在某个地方是错误的。

预先感谢您的帮助。

最佳答案

在 PDO 中,准备好的语句准备值,而不是表。

您需要处理用户输入并直接引用。

$q=$_GET["q"];

// Make sure you sanitize your user inputs using filter_inputs() or similar.

$dsn = "mysql:host=$host;port=$port;dbname=$database";

$colNames = new PDO($dsn, $username, $password); // Create object for getting column names.
$sql = "DESC repertoire Field"; // SQL for getting column names.
$stmt = $colNames->prepare($sql);
$stmt->execute();

$colList = $stmt->fetchAll(PDO::FETCH_COLUMN, 0); // Fetch the results into $colList array.

if (in_array($q, $colList)) { // If the value of $q is inside array $colList, then run.

    $db = new PDO($dsn, $username, $password);

    $sql = "SELECT DISTINCT $q FROM repertoire";
    $stmt = $db->prepare($sql);
    $stmt->execute(array($q));

        echo "<select>";
        while ( $row = $stmt->fetchObject() ) {
            echo "<option>";
            echo "{$row->{$q}}";
            echo "</option>";
            }
        echo "</select>";
}

另请阅读:Can PHP PDO Statements accept the table or column name as parameter?

编辑:我添加了一种方法来检查以确保 $q 是有效列,方法是基本上执行 SQL desc,以便从表库中获取所有列名称。

关于php - PDO - 准备好的语句不能正确处理变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11387524/

相关文章:

PHP 回显多个 div 类

php - 完全销毁 session 的最佳方法 - 即使浏览器未关闭

javascript - 阻止表单提交

mysql - 如何在 phpMyAdmin 中临时禁用数据库

javascript - 为什么这会给我一个错误?

variables - 如何在 julia 中将变量类型 "SentinelArrays"转换为 "Arrays{Float64,n}"

jquery - 获取 math.max 的变量名

php - Laravel:如何优化多个查询

php - 在ajax中返回foreach响应

php - 使用多个表格式化来自 mysql 查询的日期