TL;博士

>使用PDO :: exec发出不返回结果集的一次性非预准备语句.

>使用PDO :: query发出返回结果集的一次性非预准备语句.

如果语句只执行一次和/或它们是以预准备语句不支持的方式动态构造的,那么这两个语句都很有用.通常需要额外的工具来正确构造语句(并避免像SQL注入漏洞这样的事情).这与他们的灵活性很少需要的事实相结合意味着它通常更喜欢:

>使用PDOStatement :: prepare和PDOStatement :: execute来准备语句并执行它们,无论它们是否返回结果.如果多次执行和/或在热路径中有用.也不需要额外的工具来处理语句构造.几乎总是建议尽可能.

exec和query作用于PDO对象,因此仅在连接的上下文中. exec用于不返回结果集的语句(例如INSERT,UPDATE,DELETE),而查询将返回结果集(例如,来自SELECT语句).它们只是两个类似的接口,基本上做同样的事情(发表声明). SQL语句按原样传递给服务器,因此从客户端的角度来看可以认为是动态的.

这意味着理论上它们在执行之前可能总是(即在每次调用时)被DBMS解析,解释/编译并优化为查询计划.如果它们被多次执行,这在性能方面是昂贵的.

实际上,如果多次执行它们,它们通常会被缓存和重用,但DBMS只能在没有任何保证的情况下机会性地执行此操作.根据它们的匹配方式,稍微更改查询可能需要DBMS完全重新编译它.有时,客户端将动态构造查询(通常使用原始字符串连接,有时使用正确的language-based或library-based工具支持),这样DBMS就无法缓存查询计划.

更新:对于好奇,Pinq是PHP的基于语言的查询构建器的示例,而Doctrine LDBAL是基于库的示例.请注意,Pinq仅解析PHP表达式的谓词(似乎)并且仍然使用fluent API(尽管有些人认为流畅的接口可以形成DSLs的类型).

通过适当的工具和/或当声明仅执行一次(或非常少次)时,这很好并且有时是必要的.

对于您知道多次发出相同语句的情况,可能只有不同的参数(例如谓词/ WHERE子句中的不同值),如果有方法将它传递给DBMS,那不是很好吗所以它不会丢弃整个查询计划吗?它也可能允许它进行更多的重量级优化,否则它可能不会这样做,因为它有更多的时间来准备语句(缓慢的初始化阶段),然后才能执行它(可能在热路径中).

大多数数据库系统以prepared statements的形式提供此功能(使用各种机制,非标准AFAIK). PDO通过prepare方法以统一的方式公开它,该方法返回表示预准备语句的another object.

然后,您可以重用该对象,尤其是其execute方法(向DBMS发出语句以执行先前准备的语句).如果语句是参数化的,您甚至可以为每个执行调用传递新参数.

这也迫使您使用足够合适的工具来构建语句并发布它们.正如我前面提到的那样,基本的字符串连接和其他特殊技术只会让你在脚下射击之前到目前为止,很可能是因为你没有正确地使用escape动态部件/参数.这是SQL injection漏洞的第一来源.

请注意,如果语句返回结果集(例如SELECT),则需要使用各种fetch变体来检索结果.

$sth = $dbh->prepare("SELECT name, colour FROM fruit");

$sth->execute();

$result = $sth->fetchAll();

print_r($result);

还要注意,查询本身非常混乱,以PDOStatement对象的形式返回其结果(就像prepare返回的那样).虽然有人可能理解为什么在这里重用这个接口,但它可能不是最好的设计(至少可以说).例如,虽然(a)它似乎没有明确记录,(b)我没有测试它,我会假设在查询返回的PDOStatement上调用execute是非法的(产生错误).

免责声明:仅解释文档,而不是常用用户.

类似的问题:

php exec和query,exec和php之间的区别相关推荐

  1. query.exec报QSqlQuery::exec: database not open

    DataBase::DataBase() {int ret = 0;db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabase ...

  2. python exec函数_Python3 exec 函数

    Python3 exec 函数 描述 exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码. 语法 以下是 exec 的语法: ex ...

  3. SQL Server中唯一索引和唯一约束之间的区别

    This article gives you an overview of Unique Constraints in SQL and also the Unique SQL Server index ...

  4. 4.关于QT中的QFile文件操作,QBuffer,Label上添加QPixmap,QByteArray和QString之间的区别,QTextStream和QDataStream的区别,QT内存映射(

     新建项目13IO 13IO.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets network CON ...

  5. Linux_linux常用工具---闲杂篇(除了vim, 还有哪些常用的牛逼的编辑器, 并能够横向对比编辑器之间的区别和优缺点.)

    vim自行查找资料, 自行配置插件. 借鉴别人的 " 显示相关 """"""""""&qu ...

  6. python3.0与2.x之间的区别

    python3.0与2.x之间的区别: 1.性能 Py3.0运行pystone benchmark的速度比Py2.5慢30%.Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可以取得很好 ...

  7. 比较xdm gdm kdm 三者之间的区别

    (引导系统内核 )-> 启动画面 -> 登录界面 -> 用户桌面 gdm -- gnome display manager kdm -- kde display manager xd ...

  8. Select和SelectMany之间的区别

    我一直在搜索Select和SelectMany之间的区别,但我一直找不到合适的答案. 我需要学习使用LINQ To SQL的区别,但我发现的只是标准数组示例. 有人可以提供LINQ To SQL示例吗 ...

  9. mysql 迭代更新_MySQL、MongoDB、Redis 数据库之间的区别与使用(本章迭代更新)

    MySQL.MongoDB.Redis 数据库之间的区别与使用 MySQL.MongoDB.Redis 数据库之间的区别与使用(本章迭代更新) update:2019年2月20日 15:21:19(本 ...

最新文章

  1. 人脸识别是怎么识别人脸的?
  2. HRFormer 踩坑日记
  3. Python中必备知识点:对字符编码的基本操作
  4. python异步io 队列_python 学习笔记九 队列,异步IO
  5. camel 调用soap_使用Apache Camel通过soap添加WS-Security
  6. css pointer-event
  7. Java开发学习必须了解的基础知识点
  8. C语言基础知识整理(选择结构)
  9. 基于python tkinter的课堂点名小程序
  10. 浅谈社区电子商务的发展及其技术应用
  11. 数仓业务容错利器:物理细粒度备份恢复技术
  12. # 研究杂感 × VOSviewer(第二辑)
  13. ABOUTCG发布特效之王 Houdini基础教程
  14. python百度地图标注自己的店名_百度地图上怎么显示店名 百度地图标注店名方法...
  15. 长城会十周年:文厨用故事讲述它的“前世今生”
  16. cnpm不是内部命令的解决方案:配置环境变量【推荐】
  17. 苹果或将微信下架系谣言,苹果微信牵手ios11
  18. css3 图片裁剪菱形,利用CSS3 clip-path裁剪各种图形。
  19. Java 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量问题解决
  20. zabbix使用web界面监控本机

热门文章

  1. Iphone版音乐计算机,轻松实现从iPhone上进行音乐等文件的共享复制
  2. DXT纹理压缩格式解析
  3. 思博伦SpirentTestCenter - RFC2889之MAC地址表容量测试 -双极未来
  4. debian更新apt源报错 ...is not valid yet (invalid for another 722d 21h 13min 35s).
  5. 关于区块链、Web3.0、智能合约、DApp、DAO一文解释清楚
  6. 微信小程序mpvue项目使用WuxWeapp前端UI组件
  7. YTU 3090 团体操排序
  8. 【Mo 人工智能技术博客】利用Logistic函数和LSTM分析疫情数据
  9. 群控系统服务器掉线,手机群控系统安装调试问题汇总以及解决办法
  10. 【ReID】局部特征