使用bindvalue准备语句而不是bindindg

时间:2013-06-19 16:41:04

标签: php sql pdo bindvalue

我刚刚开始使用PDO,没有多少经验,但最近我遇到了一个烦人的问题。

我正在尝试将bindValue与fetch语句一起使用,以从数据库中检索信息。我得到的变量来自上一页的GET。一切都进行得很顺利,但事实上它并没有为bindValue中的一个分配正确的值。

PDO:

$stmt = $dbconnect->prepare('SELECT * FROM :table WHERE id=:id');

$stmt->bindValue(':table', $table);
$stmt->bindValue(':id', $id);

$stmt->execute();
$row = $stmt->fetch();

我知道bindValue和bindParam之间的区别。当我对表值进行硬编码时,代码工作正常。我现在一直在墙上撞了一小会儿,但我似乎无法弄明白。任何人都可以给我正确的语法,请解释我的想法出了什么问题,因为在这一点上我想不出一个理由,除了可能误解字符串值,为什么会出错。

此外,我想知道SQL命令的确切内容。我试过这样做:

$SQL = 'SELECT * FROM :table WHERE id=:id';
$stmt = $dbconnect->prepare($SQL);

$stmt->bindValue(':table', $table);
$stmt->bindValue(':id', $id);

$stmt->execute();
$row = $stmt->fetch();

但是这不会将变量值绑定到SQL变量。非常感谢您的帮助!

修改 我注意到我的帖子与常见问题解答帖子重复:FAQ。所以我的问题已得到解答,但我对PDO的见解还不足以应对。任何人都可以解释下一行代码会发生什么,以及为什么这样做,从发布的链接中获取!

$field = "`".str_replace("`","``",$field)."`";
$sql   = "SELECT * FROM t ORDER BY $field";

答案 感谢silkfire我想出了解决方案。在插入SQL字符串之前,只需将字符串内容添加到SQL字符串中:

$SQL = 'SELECT * FROM '.$table.' WHERE id=:id';

1 个答案:

答案 0 :(得分:2)

PDO不允许表名或列名为占位符。只需使用连接创建查询,但请确保用户仅提供有效值。这应该是安全的。