【问题标题】:Using question mark instead of table name in PDO prepared statements [duplicate]在 PDO 准备好的语句中使用问号而不是表名 [重复]
【发布时间】:2013-08-27 18:48:20
【问题描述】:

我需要知道是否可以在 PDO 准备语句中使用问号 (?) 作为表名。

$table = $_POST['table'];
$id = $_POST['id'];
$sql = "UPDATE ? SET priority = priority + 1 WHERE id = ?";
$q = $db->prepare($sql);
$q->execute(array($table,$id));

我收到此错误:

警告:PDO::prepare() [pdo.prepare]: SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '? 附近使用的正确语法。 SET 优先级 = 优先级 + 1 WHERE id = ?'

【问题讨论】:

  • 感谢@tadman 提供的建议链接
  • 仅供参考,如果您需要 - 很可能您的数据库结构有误

标签: php mysql pdo prepared-statement tablename


【解决方案1】:

除了这个简单的问题之外,还有另一个问题 - 您的代码散发出糟糕的数据库设计的味道。在正确规划的数据库中,您将永远需要通过 POST 请求接收表名。

您很可能正在使用多个表,而您只能使用一个。

【讨论】:

    【解决方案2】:

    你需要像这样绑定参数:

    $q->bindParam(1, $table);
    $q->bindParam(2, $id);
    

    Source (see Example #2)

    【讨论】:

    • 关闭,但没有。你不能在 PDO 中绑定表名,尽管可以说这是一个巨大的疏忽。
    猜你喜欢
    • 2013-10-26
    • 1970-01-01
    • 2016-07-20
    • 2011-07-13
    • 2016-12-30
    • 2015-08-25
    • 2011-04-23
    相关资源
    最近更新 更多