【问题标题】:Prepare synatax error SQLSTATE[42000] [duplicate]准备语法错误 SQLSTATE[42000] [重复]
【发布时间】:2013-05-30 11:17:01
【问题描述】:
$tconn = new PDO('mysql:host='.WW_HST.';dbname='.WW_DB, WW_USR, WW_PS);
$res = $tconn->prepare('SELECT * FROM :tbl');
$res->execute(array(':tbl'=>"ugb"));  

当我使用此代码从“ugb”表中提取数据时,我收到以下错误:

'PDOException' 带有消息'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“ugb”附近使用正确的语法

所以它正确地将 :tbl 替换为 'ugb' 但无论我是执行绑定还是仅使用数组执行,我总是会收到错误消息。不过如果我只做SELECT * FROM ugb 就可以了。

我该如何解决这个问题?

【问题讨论】:

    标签: php sql syntax pdo


    【解决方案1】:

    PDO 不允许您在 FROM 中设置变量。

    您只能在查询字符串中添加表名。

    我通常是这样的:

    $allowedTables = array('first', 'second', 'third');
    if(in_array($tblName, $allowedTables)) {
      $$res = $tconn->prepare("SELECT * FROM $tblName");
    }
    

    【讨论】:

      【解决方案2】:

      我认为 PDO 不会允许您将参数绑定到 FROM 语句。您可以尝试手动转义表名参数,然后将其添加到查询中,如下所示:

      $table = "ugb";
      $tconn = new PDO('mysql:host='.WW_HST.';dbname='.WW_DB, WW_USR, WW_PS);
      $res = $tconn->prepare('SELECT * FROM '. $tconn->quote($table));
      $res->execute();
      

      希望这会有所帮助。

      【讨论】:

      • 这是一个可怕的。请阅读手册页上的 cmets 以了解您建议的功能。
      • 是的,你是对的,但在这种情况下它可能会起到一些作用。
      猜你喜欢
      • 2014-06-29
      • 2013-06-12
      • 1970-01-01
      • 2021-09-16
      • 2022-11-19
      • 2022-01-11
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多