我刚刚开始使用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';
答案 0 :(得分:2)
PDO不允许表名或列名为占位符。只需使用连接创建查询,但请确保用户仅提供有效值。这应该是安全的。