execute()

1. 定义

该方法执行一条预处理语句。 成功时返回 TRUE,失败则返回 FALSE。

注:

  • 类似的执行方法还有PDO::query()PDO::exec()
  • PDO::query():直接执行一条 SQL 语句,并返回一个PDOStatement结果集
  • PDO::exec():仅对没有返回值的 SQL 语句有效,返回受影响的行数
  • PDOStatement::execute():针对预处理过的 SQL 语句执行,返回PDOStatement结果集,可有效防止SQL 注入

2. 语法

PDOStatement::execute ([ array $input_parameters ] ) : bool

3. 参数说明

参数 可选性 数据类型 描述
$input_parameters 可选 数组 元素个数与 SQL 预处理语句中的占位标识符一样多的绑定参数数组

其中,如果已通过PDOStatement::bindValue()方法或PDOStatement::bindParam()方法进行参数绑定,参数$input_parameters可不传。 另外,参数$input_parameters数组的个数不能超过 SQL 预处理语句中指定的参数个数,否则将失败并发出一个错误;也不能将多个值绑定到一个参数,例如绑定两个值到IN()子句中的一个单独的命名参数。 最后,通过参数$input_parameters绑定的参数,一律当作PDO::PARAM_STR(即字符串)处理。

4. 示例

<?php

// PDOStatement::execute()
// 执行一条预处理语句

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']);
} catch (PDOException $e) {
    error_log($e->getMessage());
    echo $e->getMessage();
}

try {
    $sql = 'SELECT `name`,`rate`,`cover` FROM `movie` WHERE `id` > :id';
    $stmt = $conn->prepare($sql);
    $stmt->bindValue(':id', 10);
    $stmt->execute();// 通过 PDOStatement::bindValue() 绑定参数而不是在 PDOStatement::execute() 中绑定
    $res = $stmt->fetch(PDO::FETCH_ASSOC);
    var_dump($res);
    /* 输出:
    array(3) {
      ["name"]=>
      string(12) "阿甘正传"
      ["rate"]=>
      string(3) "9.5"
      ["cover"]=>
      string(74) "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2559011361.jpg"
    }
    */

    $sql = 'SELECT `name`,`rate`,`cover` FROM `movie` WHERE `name` = :name';
    $stmt = $conn->prepare($sql);
    $stmt->execute(['name'=>'霸王别姬']);// 通过 PDOStatement::execute() 绑定同样数量的参数:如果是命名占位符则一定是 命名=>值 形式的数组
    var_dump($stmt->fetch(PDO::FETCH_ASSOC));
    /* 输出:
    array(3) {
      ["name"]=>
      string(12) "霸王别姬"
      ["rate"]=>
      string(3) "9.6"
      ["cover"]=>
      string(74) "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2561716440.jpg"
    }
    */

    $sql = 'SELECT `name`,`rate`,`cover` FROM `movie` WHERE `name` = ?';
    $stmt = $conn->prepare($sql);
    $stmt->execute(['霸王别姬']);// 通过 PDOStatement::execute() 绑定同样数量的参数:如果是问号占位符则只需要传值而不需要键名
    var_dump($stmt->fetch(PDO::FETCH_ASSOC));
    /* 输出:
    array(3) {
      ["name"]=>
      string(12) "霸王别姬"
      ["rate"]=>
      string(3) "9.6"
      ["cover"]=>
      string(74) "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2561716440.jpg"
    }
    */

    $sql = 'SELECT `name`,`rate`,`cover` FROM `movie` WHERE `name` IN(?)';
    $stmt = $conn->prepare($sql);
    // $stmt->execute(['霸王别姬,阿甘正传']);// 试图在一个参数上绑定多个值
    $stmt->execute(["'霸王别姬','阿甘正传'"]);// 试图在一个参数上绑定多个值
    var_dump($stmt->fetch(PDO::FETCH_ASSOC));// 输出:bool(false)

} catch (Exception $e) {
    echo "发生了错误:", $e->getMessage();
}

5. 延展阅读