1

所有 3 个选项都相同(Y/N)还是一个更好(A/B/C)?

选项 A - (1) 在变量中定义 SQL 字符串, (2) 使用变量上$sql的“方法”定义语句句柄以组合语句,以及 (3) 使用执行函数在步骤 2 中激活语句组合。prepare$sql

    $sql = "SELECT * FROM table1";
    $sth = $dbh->prepare($sql);
    $sth->execute();


选项 B - 类似于选项 C,因为该->query方法直接在 db 对象上使用,并且类似于选项 A,因为 sql 语句是分开的。

    $sql = "SELECT * FROM table1";
    $sth = $dbh->query($sql);


选项 C - 语句句柄是 sql 查询本身(不引用任何其他变量,只使用一种方法。

    $sth = $dbh->query("SELECT * FROM table1");


问题:

  • 两种选择是否产生相同的结果?
  • 如果它们产生相同的结果,是否推荐一种方法(即最佳实践)?
  • 我的“变量”、“方法”和“函数”之类的词汇是否正确?
  • 尽管没有明确使用该->query()方法,选项 A 是否仍然查询数据库?
  • 将 sql stmnt 包含在单独的变量中与 PDO 语句中的优缺点是什么?

  • 4

    2 回答 2

    3

    我想说这两种方法在使用字符串变量或直接文本字符串方面是相同的。

    假设您使用 PDO,prepare 语句和调用查询语句之间存在差异。

    在情况 A 中,prepare 语句将使数据库创建一个计划,以便可以重新执行该语句而无需重新解析查询字符串。

    在情况 B 中,查询将立即执行。

    在您给定的示例中,B 会运行得更快一些。但是,如果您的语句使用参数 case A 由于占位符已被驱动程序替换,您将获得额外的安全性。

    于 2012-12-28T01:48:11.373 回答
    2

    两种选择是否产生相同的结果?

    是的。

    如果它们产生相同的结果,是否推荐一种方法(即最佳实践)?

    两者都很好。在您的特定示例中,选项 B 用更少的代码完成了相同的工作。

    但是,如果您需要在查询中使用参数和/或约束(例如 ...WHERE id = :id),您需要选择选项 A 以使用 $dbh->bindParam(':id', $ id, PDO::PARAM_INT) 方法在您准备好您的语句后,例如:

    $dbh->prepare('UPDATE table SET column = :value WHERE id = :id');
    $dbh->bindParam(':value', $someNewValue, PDO::PARAM_STR);
    $dbh->bindParam(':id', $targetId, PDO::PARAM_INT);
    $dbh->execute();
    

    这样做还可以保护您免受 SQL 注入等令人讨厌的事情的影响。

    仅当您计划稍后在代码中重用该查询时,才需要将查询存储在单独的变量中。否则,您不妨直接在您的准备/查询方法中输入它。

    我的“变量”、“方法”和“函数”之类的词汇是否正确?

    看起来差不多!除了:“执行功能”是一种方法。函数和方法基本上是相同的东西,除了它们属于一个对象时,它们被称为方法。在您的示例中,执行属于 $sth 对象,因此它被称为方法。

    尽管没有明确使用 ->query() 方法,选项 A 是否仍然查询数据库?

    是的。execute 方法执行在 $dbh->prepare(...) 中准备好的查询。如果你想使用参数,你可以在你的准备和执行方法之间调用 ->bindParam() 。如果不需要参数,直接调用 ->query() 确实是更方便的方法。

    于 2012-12-28T01:55:47.320 回答