【问题标题】:Prepare statement not bindindg with bindvalue准备好的语句不与绑定值绑定
【发布时间】:2013-06-16 07:31:03
【问题描述】:

我最近才开始使用 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 变量。非常感谢您的帮助!

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

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

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

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

【问题讨论】:

标签: php sql pdo bindvalue


【解决方案1】:

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

【讨论】:

  • 好的。那么在执行 SQL 字符串之前,我只需要在 SQL 字符串中插入变量名并执行它?
猜你喜欢
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 2015-07-13
  • 2013-10-05
  • 1970-01-01
相关资源
最近更新 更多