query()

1. 定义

该方法执行一条 SQL 语句,并返回一个PDOStatement对象形式的结果集。

2. 语法

public PDO::query ( string $statement ) : PDOStatement

public PDO::query ( string $statement , int $PDO::FETCH_COLUMN , int $colno ) : PDOStatement

public PDO::query ( string $statement , int $PDO::FETCH_CLASS , string $classname , array $ctorargs ) : PDOStatement

public PDO::query ( string $statement , int $PDO::FETCH_INTO , object $object ) : PDOStatement

3. 参数说明

参数 可选性 数据类型 描述
$statement 必需 字符串 SQL 字符串

其中,如果传入该方法的参数超过一个(即语法部分中的后三条),剩下的参数则相当于对PDOStatement对象结果集调用PDOStatement::setFetchMode()方法。

4. 示例

<?php

// PDO::query()
// 执行一条 SQL 语句,并返回一个`PDOStatement`对象形式的结果集

try {
    $config = ['driver' => 'mysql', 'host' => 'localhost', 'dbname' => 'test', 'charset' => 'utf8', 'user' => 'root', 'pwd' => 'mysql'];
    $dsn = sprintf('%s:host=%s;dbname=%s;charset=%s', $config['driver'], $config['host'], $config['dbname'], $config['charset']);
    $conn = new PDO($dsn, $config['user'], $config['pwd']);

    $statement = "SELECT * FROM `movie`";
    $query = $conn->query($statement);
    var_dump($query);
    /* 输出:
    object(PDOStatement)#2 (1) {
        ["queryString"]=>
        string(21) "SELECT * FROM `movie`"
    }
    */

    $result = $query->fetchAll();// 没有参数则默认为 PDO::FETCH_BOTH
    // var_dump($result);// 正确输出

    $query = $conn->query($statement, PDO::FETCH_ASSOC);
    $result = $query->fetchAll();// 默认为 query() 方法中指定的 PDO::FETCH_ASSOC
    var_dump($result);
    /* 输出:
    array(20) {
      [0]=>
      array(7) {
        ["id"]=>
        string(1) "1"
        ["name"]=>
        string(21) "哪吒之魔童降世"
        ["rate"]=>
        string(3) "8.5"
        ["url"]=>
        string(42) "https://movie.douban.com/subject/26794435/"
        ["cover"]=>
        string(74) "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2563780504.jpg"
        ["cover_x"]=>
        string(4) "5594"
        ["cover_y"]=>
        string(4) "8268"
      }
      [1]=>
      array(7) {
        ["id"]=>
        string(1) "2"
        ["name"]=>
        string(15) "我不是药神"
        ["rate"]=>
        string(3) "9.0"
        ["url"]=>
        string(42) "https://movie.douban.com/subject/26752088/"
        ["cover"]=>
        string(74) "https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2561305376.jpg"
        ["cover_x"]=>
        string(4) "2810"
        ["cover_y"]=>
        string(4) "3937"
      }
      ...

      [19]=>
      array(7) {
        ["id"]=>
        string(2) "20"
        ["name"]=>
        string(21) "三傻大闹宝莱坞"
        ["rate"]=>
        string(3) "9.2"
        ["url"]=>
        string(41) "https://movie.douban.com/subject/3793023/"
        ["cover"]=>
        string(73) "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p579729551.jpg"
        ["cover_x"]=>
        string(4) "3030"
        ["cover_y"]=>
        string(4) "4364"
      }
    }
    */

} catch (PDOException $e) {
    error_log($e->getMessage()); // 将错误信息记录至日志
    echo $e->getMessage();
}

5. 延展阅读

  • PDO::exec():执行一条非查询类 SQL 语句,并返回受影响的行数
  • PDO::prepare():对待执行的 SQL 语句进行预处理,并返回该 SQL 语句的语句对象PDOStatement
  • PDOStatement::execute():执行一条预处理语句