【问题标题】:Using parameters in PDO prepared statements with DESCRIBE通过 DESCRIBE 在 PDO 准备好的语句中使用参数
【发布时间】:2012-09-14 08:38:14
【问题描述】:

在我看来,这对于标准查询来说是可以的,但在涉及到 DESCRIBE 时则不行:

$q = $dbh->prepare("DESCRIBE ?");
$q->execute(array($this->ormTable));
$table_fields = $q->fetchAll(PDO::FETCH_ASSOC);

有人可以确认吗?除了手动附加表名之外,还有其他解决方法吗?

【问题讨论】:

  • 我不相信你可以为表名使用绑定参数。
  • 您不能为表名或字段名或与 SQL 相关的任何其他语法绑定参数。改用 PHP $变量。
  • 如 dbf 所说,使用变量来插入 SQL 查询部分——但请先转义它们,使用 PDO::quote()
  • @feeela 是的,我已经问过了

标签: php mysql pdo schema


【解决方案1】:

确保 ormTable 不会受到外部影响(SQL 注入等)或正确引用语法使用(不要为此使用 PDO::quote())

$q = $dbh->prepare("DESCRIBE ".$this->ormTable);
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_ASSOC);

【讨论】:

  • 我不应该先逃离这个吗?! (使用 `PDO::quote')
  • 是的:$dbh->prepare( 'DESCRIBE ' . $dbh->quote( $this->ormTable ) );
  • 没错,我有这个担心......非常感谢
  • @feeela 我认为这行不通。我理解引用是针对值,而不是针对字段或表名等实体。
  • 我想我必须在清理变量后自己用反引号引用它。
【解决方案2】:
$q = $dbh->prepare(sprintf('DESCRIBE %s', $this->ormTable));
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_ASSOC);

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 2014-07-20
    • 2017-09-29
    • 2010-11-30
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多