0

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

我正在尝试使用带有 fetch 语句的 bindValue 从数据库中检索信息。我得到的变量来自 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 变量。非常感谢您的帮助!

编辑: 我注意到我的帖子与常见问题解答帖子重复:常见问题解答。所以我的问题已经得到解答,但是我对 PDO 的洞察力不足以理解它。任何人都可以解释下一行代码会发生什么以及为什么会这样,从发布的链接中获得!

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

多亏了Silkfire ,我想出了修复方法。在插入 SQL 字符串之前,只需将字符串内容添加到 SQL 字符串中:

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

1 回答 1

2

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

于 2013-06-19T16:51:58.250 回答