php - PDO 没有正确执行绑定(bind)变量

标签 php mysql pdo

<分区>

所以我遇到了 PDO 的这个奇怪问题,因为带有绑定(bind)变量的查询由于某种原因没有正确执行。让我展示一些代码:

$conn = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pwd);
$sth=$conn->prepare("select count(*) from article");
$sth->execute();
var_dump($sth->fetchColumn());

这将在“文章”表中打印出正确数量的条目。

但是,如果我们稍作更改,将表设为命名参数而不是常量:

$conn = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pwd);
$sth=$conn->prepare("select count(*) from :article");
$sth->execute(array(":article"=>"article"));
var_dump($sth->fetchColumn());

这将打印一个 bool 值 false。这两个语句应该返回相同的结果,但我不知道为什么第二个语句不起作用。我怀疑我某处有错字,但我检查了几次,但没有发现任何问题。有人知道吗?

最佳答案

不可能。您正在尝试为表名使用占位符。这是不允许的。占位符只能替换值。

SELECT count(*) FROM :table WHERE field=:article
                     ^^^^^^--illegal    ^^^^^^^^--legal

为此,您必须使用老式的字符串构建:

$table = "article";
$sth=$conn->prepare("select count(*) from $table");

然后重新打开 SQL 注入(inject)攻击漏洞,因为您现在直接将外部数据插入到 SQL 字符串中。

关于php - PDO 没有正确执行绑定(bind)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22149834/

相关文章:

javascript - ajax 提交的页面上不显示错误

php - php-android 中未定义索引错误

php - 与数据库和对象交互的最佳方式

php - 将 mysqli 转换为 pdo bind_all

php - 使用 PDO 将 polymer 数据绑定(bind)到 MySQL 表数据

php - 使用 PDO 获取一列

php - Laravel 拒绝用户 'root' @'localhost' 访问(使用密码 : YES) in laravel 4. 2

PHP:foreach msqli_query 问题

php - Magento Enterprise Controller 覆盖

mysql - 运行时 java.lang.ClassNotFoundException : com. mysql.jdbc.Driver (eclipse/maven/tomcat)