php exec和query,exec和php之间的区别

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是非法的(产生错误).

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

类似的问题:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值