pdo::quey excu excute 区别
PDO::query(PHP环境下同)和PDOStatement::execute函数均能实现SELECT查询功能,但官方文档并未见对此设计初衷的说明,此外还有个PDO::exec函数功能也很类似。天缘自己也很纳闷(也可能未发现或是未能完全理解),既然PDO::query函数功能做的如此单一,而且还和exec、execute之间有交叠,那为何不重新调整部分函数执行方法,只保留一个或保留两个足够,难道只是照顾到一些传统编程人员的习惯?下面是官方给这三个函数定义:
PDO::exec — Execute an SQL statement and return the number of affected rows
PDO::query — Executes an SQL statement, returning a result set as a PDOStatement object
PDOStatement::execute — Executes a prepared statement
原文参见:http://www.php.net/manual/en/book.pdo.php
特别注意:PDO::exec跟PDOStatement::execute是两个不同函数,前者跟PDO::query地位是并列的,而后者则是PDOStament类下子函数。
1、PDO::query
PDO::query执行一条SQL语句,如果通过,则返回一个PDOStatement对象。PDO::query函数有个“非常好处”,就是可以直接遍历这个返回的记录集。
示例如下:
$sql = 'SELECT name FROM url';
foreach ($dbh->query($sql) as $row) {
print $row['name'] . "\t";
}
query同传统的mysql query函数类似,同样需要对开发者自行对输入的sql语句进行安全检查。
query因为会返回PDOStament对象,似乎用在SELECT语句执行上更合适,这跟上文提到的query支持直接遍历不谋而合。
query执行后,在下一次query执行之前,如果不取走所有返回的记录集,则query将会执行失败,除非我们调用 PDOStatement::closeCursor()来释放数据库资源与PDOStatement对象。
原话:If you do not fetch all of the data in a result set before issuing your next call to PDO::query(), your call may fail. Call PDOStatement::closeCursor() to release the database resources associated with the PDOStatement object before issuing your next call to PDO::query().
二、PDO::exec
PDO::exec执行一条SQL语句,并返回受影响的行数。此函数不会返回结果集合。官方建议:
- 对于在程序中只需要发出一次的 SELECT 语句,可以考虑使用 PDO::query()。
- 对于需要发出多次的语句,可用 PDO::prepare() 来准备一个 PDOStatement 对象并用 PDOStatement::execute() 发出语句。
PDO::exec支持SELECT/DELETE/UPDATE/INSERT等全部SQL语句执行,所以相比PDO query()函数功能要强大的多。由于只返回受影响的函数,所以,如果执行SELECT则无法得到PDOStatement对象,故也无法遍历结果集,只能按照官方建议去使用query或execute函数。
三、PDOStatement::execute
再看一下PDOStatement::execute函数,execute函数是用于执行已经预处理过的语句,只是返回执行结果成功或失败。也就是说execute需要配合prepare函数使用,这个的确是麻烦了一点,每次都要先prepare,然后才能exec。所以,如果执行SELECT等SQL语句,则还需要借助fetch等函数进行结果读取(当然上文的query也是可使用fetch等函数)。
execute支持绑定参数,无需考虑安全问题(绑定时!其它语句还需要自己考虑),示例如下:
$sth= $dbh->prepare('SELECT name FROM foo WHERE width < :width AND height = :height');
$sth->bindParam(':width', $width);
$sth->bindParam(':height', $height);
$sth->execute();
execute支持多次运行,这在某些方面,有助于性能提升。示例如下:
$sth = $db->prepare("SELECT * FROM foo WHERE width = ?");
$sth->execute(array(1));
$results = $sth->fetchAll(PDO::FETCH_ASSOC);
$sth->execute(array(2));
$results = $sth->fetchAll(PDO::FETCH_ASSOC);
尽管PDOStatement::execute也很强大,但跟PDO::exec地位是不同的,不可混淆。
pdo::quey excu excute 区别的更多相关文章
- PHP中MySQL、MySQLi和PDO的用法和区别
PHP的MySQL扩展(优缺点) 设计开发允许PHP应用与MySQL数据库交互的早期扩展.mysql扩展提供了一个面向过程 的接口: 并且是针对MySQL4.1.3或更早版本设计的.因此,这个扩展虽然 ...
- PHP中MySQL、MySQLi和PDO的用法和区别【原创】
对于一个初学PHP的自己,对数据库的连接有着很大的疑惑,从Java转到PHP.数据库连接变了,以前只知道JDBC连接数据库,或者直接用框架调用,对于的PHP的数据库连接方式,及其应用.不是很了解,于是 ...
- PDO和Mysqli的区别
参考:http://www.cnblogs.com/feng18/p/6523646.html 人家写的不错
- JavaSE知识概述集
一.HelloWord(文档启动Java) /* 使用命令行的方式执行的时候,cmd的默认编码格式是GBK 因此在输入中文的时候需要设置文件的编码格式位ANSI,不会出现乱码错误 注意: 0.先用ja ...
- PDO和MySQLi区别与选择?
当用PHP访问数据库时,除了PHP自带的数据库驱动,我们一般还有两种比较好的选择:PDO和MySQLi.在实际开发过程中要决定选择哪一种首先要对二者有一个比较全面的了解.本文就针对他们的不同点进行分析 ...
- PDO PDO_MYSQL MYSQLI MYSQL 的区别
MYSQL,MYSQLI 这两个扩展本身就是访问MYSQL数据库的驱动 PDO则是一个抽象层接口 向程序员提供可调用的API是由,MYSQL驱动.MYSQLI驱动,以及PDO来提供. PDO_MYSQ ...
- PDO和MySQLi区别和数度;到底用哪个?
当用PHP访问数据库时,除了PHP自带的数据库驱动,我们一般还有两种比较好的选择:PDO和MySQLi.在实际开发过程中要决定选择哪一种首先要对二者有一个比较全面的了解.本文就针对他们的不同点进行分析 ...
- Java中excute,excuteUpdate,excuteQuery的区别
executeQuery(String sql) 执行select语句,它返回的是查询后得到记录集(resultset). executeUpdate(String sql) 执行 ...
- 前端学PHP之PDO基础操作
× 目录 [1]创建PDO [2]使用PDO [3]事务处理 前面的话 PDO(php data object)扩展类库为php访问数据库定义了轻量级的.一致性的接口,它提供了一个数据库访问抽象层,这 ...
随机推荐
- C语言通过枚举网卡,API接口可查看man 7 netdevice--获取接口IP地址
/*代码来自StackOverflow: http://stackoverflow.com/questions/212528/linux-c-get-the-ip-address-of-local-c ...
- MVC ---- 理解学习Func用法
//Func用法 public static class FuncDemo{ public static void TestFunc(){ //数据源 List<User> usList ...
- samtools一些文档
https://github.com/samtools/hts-specs
- gcc 编译出现 internal compiler error: Killed
系统没有交换分区, 编译过程中内存耗尽, 导致了编译中断 …解决方式也很简单, 就是增加一个交换分区: 创建分区文件, 大小 2G dd if=/dev/zero of=/swapfile ...
- ros pbstream
https://blog.csdn.net/xiekaikaibing/article/details/80320822
- 《F4+2》—团队项目系统设计改进与详细设计
一.团队项目系统设计改进: 1.分析项目系统设计说明书初稿的不足,特别是软件系统结构模型建模不完善内容 在上一次的项目系统设计说明书中没有很好的完成软件系统结构模型的建模设计,只做了基本的系统项目原型 ...
- marquee 跑马灯公告
1.原始 marquee 2.自定义 marquee .tops { color: #fff; height: 23px; margin: 0 0 0 20px; min-height: 23px; ...
- 解决dos窗口乱码问题
大家有没有遇到这样的情况,看着就糟心 打开dos窗口, 输入命令 chcp 936 (936表示中文编码GBK, 也可以设置其他编码), 回车一下执行. 鼠标右键 -> 属性 (关键一步): ...
- Android中如何实现EditText的自动换行
要实现EditText的自动换行需要实现如下设置: <EditText android:id="@+id/function_lifingcost_edit_txtRemark" ...
- 看起来很懵的java内存加载面试题
源代码如下,求结果 public class MemoryAnalyse { public static int k = 0; public static MemoryAnalyse t1 = new ...