【发布时间】:2014-12-12 14:19:58
【问题描述】:
这个话题有很多提示,我试过这个:How to create a secure mysql prepared statement in php? 和许多其他人,但没有任何工作。如果我想从数据库中选择一些东西并且不带参数进行查询,那没关系。但是,如果我想要带有参数的列和表的数据,它不起作用,它返回空数组。有什么提示吗?
这是我的代码:
function getDataByColumn($column, $table) {
try {
$connection = new PDO("mysql:dbname=vydap;charset=utf8;host=127.0.0.1", "...","...");
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
$query = "SELECT ? FROM ?";
// $query = "SELECT :column FROM :table";
$stmt = $connection->prepare($query);
// $stmt->bindParam(':column', $column);
// $stmt->bindParam(':table', $table);
$stmt->bindParam(1, $column);
$stmt->bindParam(2, $table);
$stmt->execute();
$result = $stmt->fetchAll();
var_dump($result);
}
【问题讨论】:
-
对,这样不行。这是经常被问到的。占位符不适用于构建任意 SQL 语句。它们的目的是替换准备好的语句中的标量值。要安全地使用动态表名或列名,您必须对照可接受的可能值的数组列表检查输入表名和列名。喜欢
if (in_array($_POST['table'], array('table1','table2')) {// ok to proceed...}