【问题标题】:How bindValue for table name? [duplicate]如何为表名绑定值? [复制]
【发布时间】:2013-01-17 15:23:21
【问题描述】:

是否可以为表名做一个绑定值?如果我删除 :table 并添加表名,我的似乎基本上没有捡起它,第二个 2 绑定工作正常,但我想将它用于同一表单中的多个表。

表单上的表字段是根据上一个查询的结果定义的,因此表名出现在表单中的值为 $table 正确显示,所以这应该将 $table 的值发布到表绑定? ??

try {
    $sql = 'UPDATE :table SET
                archive = :archive
                WHERE id = :id';
    $s = $pdo->prepare($sql);
    $s->bindvalue('table', $_POST['table']);
    $s->bindvalue('archive', $_POST['archive']);
    $s->bindvalue('id', $_POST['id']);
    $s->execute();
}

【问题讨论】:

  • 尝试后得到了什么?
  • 如果@Akam 的方向,我不能完全理解你刚刚指出我的那个帖子
  • 幸运的是这是不可能的。 PS:使用允许表的白名单并将其替换为字符串

标签: php mysql pdo bindvalue


【解决方案1】:

由于prepared statements比sprintf多“一点”,所以按变量设置表没有意义。

在设置实际值之前将准备好的语句传递给数据库。所以数据库可能会寻找一种方法来回答查询。在此准备之后,设置搜索的实际值。当调用execute() 时,查询得到了回答。

因此,要准备“一种如何回答查询的方法”(正如我所说的那样),表名是一个重要信息。这就是为什么将它作为变量传递是没有意义的。这也是它不起作用的原因。

所以,你必须用字符串连接表名:

$sql = 'UPDATE '. $table .' SET
            archive = :archive
            WHERE id = :id';

正如@zerkms 建议的那样,您应该将可能的表名列入白名单。

【讨论】:

    猜你喜欢
    • 2013-02-17
    • 2013-01-22
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多