我应该定义我的SQL语句语句句柄使用单独的变量在PHP


Should I define my SQL statement statement handle using separate variables in PHP?

三个选项是相同的(Y/N)还是一个更好(A/B/C)?

选项A -(1)在变量$sql中定义SQL字符串;(2)在变量$sql上使用"方法"prepare定义语句句柄来组成语句;(3)使用execute函数激活步骤2中的语句组成。

    $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");


问题:

  • 两个选项产生相同的结果吗?
  • 如果它们产生相同的结果,是否推荐一种方法(即最佳实践)?
  • 我得到词汇像"变量","方法"answers"函数"正确吗?
  • 选项A仍然查询数据库,尽管没有显式使用->query()方法?
  • 包括sql语句在一个单独的变量vs在PDO语句的优点/缺点是什么?
  • 我想说这两种方法在使用字符串变量或直接文本字符串时是相同的。

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

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

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

    在你给出的例子中,B会运行得快一点。但是如果你的语句使用了参数,情况A会使你获得额外的安全性,因为占位符被驱动程序取代了。

    两个选项产生相同的结果吗?

    是的。

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

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

    但是,如果您需要在查询中使用参数和/或约束(例如. ...当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注入等讨厌的事情。

    只有在您计划稍后在代码中重用该查询时,才需要将查询存储在单独的变量中。否则,您不妨直接在prepare/query方法中键入它。

    我是否得到像"变量","方法"answers"函数"这样的词汇表正确?

    看起来不错!除了:"执行函数"是一个方法。函数和方法基本上是一样的,除了当它们属于一个对象时,它们被称为方法。在你的例子中,execute属于$sth对象,所以它被称为一个方法。

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

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