绑定变量的数量与令牌PDO的数量不匹配

时间:2014-08-05 03:28:36

标签: php pdo

相对较新的PDO(以及一般的OOP),我的 3 命名参数给我一个错误。这是我编写的函数,用于检查数据库中是否已存在某个值(因此我不会有重复的条目):

function checkTable($table, $column, $value, $con) {
    $stmt = $con->prepare("SELECT * FROM :tbl WHERE :col = :val");
    $stmt->execute(['tbl' => $table, 'col' => $column, 'val' => $value]);

    return $stmt->fetchAll();
}

当然$ con是PDO连接(是的,我已经检查过,它已连接,我可以在数据库上运行正常查询) 我用这段代码调用函数:

checkTable("posts", "title", "title", $con);

我希望看到true被退回,因为我在数据库中存在确实的价值,但我得到的一切是

'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens'

编辑:我已经在一个函数外测试了这个,这就像预期的那样有效:

$bind = ['tbl' => "posts", 'col' => "title", 'val' => "title"];
$query = query("SELECT * FROM :tbl WHERE :col = :val", $con, $bind);
var_dump($query);

query()函数如下所示:

function query($query, $con, $bind = null) {
    try {
        $stmt = $con->prepare($query);
        $stmt->execute($bind);
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
        $result = $stmt->fetchAll();

        return $result;
    } catch(Exception $e) {
        return false;
    }
}

1 个答案:

答案 0 :(得分:2)

您不能在预准备语句中使用表名和列名进行替换。 :tbl - 是一个表名。因此,您的查询:col, :val中只有两个令牌。

同样:col将替换为'column_name'(带引号)。条件看起来像'column_name'='value'