• 热门专题

PDO query和exec区别

作者:天缘博客  发布日期:2013-11-29 10:41:03
Tag标签:PDO  query  
  • PDO::query(PHP环境下同)和exec函数均能实现SELECT查询功能,但官方文档并未见对此设计初衷的说明。天缘自己也很纳闷(也可能未发现或是未能完全理解),既然PDO::query函数功能做的如此单一,那为什么还不直接废弃掉,难道只是照顾到一些传统编程人员的习惯?下面是官方给这两个函数定义:

    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
    

    原文参见:http://www.php.net/manual/en/book.pdo.php

    1、PDO::query

    PDO::query执行一条SQL语句,如果通过,则返回一个PDOStatement对象。PDO::query函数有个“非常好处”,就是可以直接遍历这个返回的记录集。

    示例如下:

    <?php
        $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().

    二、PDOStatement::exec

    PDOStatement::exec用于执行已经预处理过的语句,返回受影响的行数。也就是说exec需要配合prepare函数使用,这个的确是麻烦了一点,每次都要先prepare,然后才能exec。返回值也只是返回受影响的行数,如果执行的是SELECT语句,那么还需要借助于fetch等函数进行结果读取(当然上文的query也是可使用fetch等函数)。

    天缘个人看法,exec对安全问题的提升似乎也不太明显,因为对外发人员而言,不能把这类安全问题都留给PDO解决,而需要在上次综合去解决。

    exec支持SELECT/DELETE/UPDATE/INSERT等全部SQL语句执行,所以相比PDO query()函数功能要强大的多。

    exec支持绑定参数,无需考虑安全问题(绑定时!其它语句还需要自己考虑),示例如下:

    $sth= $dbh->prepare('SELECT name FROM foo WHERE width < :width AND height = :height');
    $sth->bindParam(':width', $width);
    $sth->bindParam(':height', $height);
    $sth->execute();

    exec支持多次运行,这在某些方面,有助于性能提升。示例如下:

    $sth = $db->prepare("SELECT * FROM table WHERE foo = ?");
    $sth->execute(array(1));
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    $sth->execute(array(2));
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规