【问题标题】:PDO Select form MYSQL db [duplicate]PDO 选择表格 MYSQL db [重复]
【发布时间】: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...}

标签: php mysql select pdo


【解决方案1】:

这是完全错误的:

$query = "SELECT ? FROM ?";

占位符只能代表VALUES。您不能对字段/表/数据库名称使用占位符 - 这些不是值 - 它们是标识符。

SELECT foo FROM bar WHERE foo = 'baz'
   a    b   c    d   e    f   g   h

a- sql keyword
b- field identifier
c- sql keyword
d- table identifier
e- sql keyword
f- field identifier
g- operator
h- value

在整个查询中,只有 h 部分可以使用占位符。

【讨论】:

  • 新的布局,我喜欢。加号。
【解决方案2】:

您不能在表名或列名上使用 PDO 占位符。这些仅用于值:

$query = "SELECT * FROM yourTable WHERE someCol = ?";

$stmt->bindParam(1, $value);

【讨论】:

    猜你喜欢
    • 2012-09-30
    • 2013-09-22
    • 2018-03-13
    • 2017-07-04
    • 1970-01-01
    • 2017-04-11
    • 2013-02-21
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多