三个选项是相同的(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");
问题:
->query()
方法?我想说这两种方法在使用字符串变量或直接文本字符串时是相同的。
假设您使用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()是更方便的方法。