代码之家  ›  专栏  ›  技术社区  ›  Your Common Sense

PDO参数化查询的工作方式

  •  8
  • Your Common Sense  · 技术社区  · 14 年前

    请仔细阅读这个问题。这不是通常愚蠢的“我的代码不工作!!!”问题。

    当我用 故意错误

    try {
      $sth = $dbh->prepare("SELECT id FROM users WHERE name INN(?,?) ");
      $sth->execute(array("I'm","d'Artagnan"));
    } catch (PDOException $e) {
        echo $e->getMessage();
    }
    

    我收到这个错误信息

    但我多年来一直认为,查询和数据是分开发送到服务器的,从来没有干扰。因此,我有一些问题(虽然我怀疑有人得到答案…)

    1. 它从哪里得到如此熟悉的字符串表示-引用和转义?它是专门用来报告错误还是实际查询的一部分?
    2. 它在现实中是如何工作的?它是否用数据替换占位符?

    更新

    mysqli 按预期执行:它抛出一个错误 near 'INN(?,?)'

    2 回复  |  直到 14 年前
        1
  •  7
  •   user187291    14 年前

    尝试添加

    $dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
    

    ;)

        2
  •  7
  •   Dan Soap    14 年前

    1. 引用发生在数据库端。数据库转义并清除它接收到的所有值(见项目符号2),以便正确解释。 一旦抛出错误,数据库(在本例中是MySQL)就会打印出它试图运行的查询。如果只是显示准备好的部分,那就没什么帮助了。

    2. 不,没有。在准备时,查询在服务器端编译。使用值执行查询时,只传输值。这与直接在数据库上调用PREPARE和EXECUTE非常相似。

    3. 这取决于您使用的数据库。例如,MySQL可以将所有查询记录到一个日志文件中(检查我的.cnf设置)。但你也可以用 debugDumpParams()

    我希望这有点帮助。