首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应该在PHP中使用单独的变量来定义SQL语句句柄吗?

应该在PHP中使用单独的变量来定义SQL语句句柄吗?
EN

Stack Overflow用户
提问于 2012-12-28 01:39:02
回答 2查看 177关注 0票数 1

三种选择是相同的(Y/N)还是更好的(A/B/C)?

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

代码语言:javascript
复制
    $sql = "SELECT * FROM table1";
    $sth = $dbh->prepare($sql);
    $sth->execute();

选项B -类似于选项C,因为->query方法直接用于db对象,与选项A类似,因为->query语句是分开的。

代码语言:javascript
复制
    $sql = "SELECT * FROM table1";
    $sth = $dbh->query($sql);

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

代码语言:javascript
复制
    $sth = $dbh->query("SELECT * FROM table1");

问题:

  • 这两个选项会产生相同的结果吗?
  • 如果它们产生相同的结果,是否建议采用一种方法(即最佳做法)?
  • “变量”、“方法”和“函数”这样的词汇正确吗?
  • 选项A是否仍然查询db,尽管没有显式地使用->query()方法?
  • 将sql stmnt包含在单独的变量和PDO语句中有什么优缺点?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-28 01:48:11

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

假设您使用PDO,准备语句和调用查询语句之间有区别。

在A种情况下,prepare语句将使数据库创建一个计划,这样语句就可以被重新执行,而无需对查询字符串进行重新分析。

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-12-28 01:55:47

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

是。

如果它们产生相同的结果,是否建议采用一种方法(即最佳做法)?

两人都很好。在您的特定示例中,选项B可以用较少的代码完成相同的任务。

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

代码语言:javascript
复制
$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注入之类的讨厌的事情的影响。

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

“变量”、“方法”和“函数”这样的词汇正确吗?

看上去是对的!除了:“execute函数”是一个方法。函数和方法基本上是相同的,除非它们属于一个对象,它们被称为方法。在您的示例中,execute属于$sth对象,因此称为方法。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14063527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档