为什么这个脆弱的PDO工作,而不是准备好的语句


How come this vulnerable PDO works instead of prepared statement?

我的PDO查询只有一种方式返回我想要的结果,但是正确的准备语句只给出列名。

返回列名而不是查询的行:

$queryPrice = "SELECT :zone FROM express WHERE kg >= :kg LIMIT 1";
$stmt = $conn->prepare($queryPrice);
$stmt->bindParam(':zone', $zone, PDO::PARAM_STR);
$stmt->bindParam(':kg', $_SESSION['weight'], PDO::PARAM_STR);
$stmt->execute();
$price = $stmt->fetchColumn();

这个可以工作,但是容易被注入:

$queryPrice = "SELECT $zone FROM express WHERE kg >= :kg LIMIT 1";
$stmt = $conn->prepare($queryPrice);
$stmt->bindParam(':kg', $_SESSION['weight'], PDO::PARAM_STR);
$stmt->execute();
$price = $stmt->fetchColumn();

为列名准备的语句为什么不工作?

是否有一种安全的方法来达到预期的结果?

再想一下,你的问题似乎是由糟糕的数据库设计引起的。

您必须将它们作为数据放在另一个表的单列中,而不是将它们作为表中的列。事实清楚地证明了这一点,您正在尝试以仅对数据进行处理的方式处理列名。

您已经重新组织了表,只留下一列用于区域,例如name。你可以用这样的查询来选择你的区域

SELECT name FROM zones WHERE kg > :kg