exec()

1. 定义

该方法执行一条非查询类 SQL 语句,并返回受影响的行数。

注:

  • 对于有返回值的 SQL 语句,例如 SELECT、OPTIMIZE TABLE等,该方法并不适用,建议使用PDO::prepare()预处理语句

2. 语法

PDO::exec ( string $statement ) : int

3. 参数说明

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

4. 示例

<?php

// PDO::exec()
// 执行一条非查询类 SQL 语句,并返回受影响的行数

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 = "DELETE FROM `movie` WHERE `id` > 1 LIMIT 1";
    $count = $conn->exec($statement);
    echo '[1]执行 ', $statement, ' ', "\n", '   受影响行数:', $count, "\n";

    // 对于有返回值的 SQL 语句,例如 SELECT、OPTIMIZE TABLE等,该方法并不适用,建议使用`PDO::prepare()`预处理语句
    $statement = "SELECT * FROM `movie`";
    $count = $conn->exec($statement);
    echo '[2]执行 ',$statement,' ',"\n",'   受影响行数:',$count,"\n";

    $statement = "DELETE FROM `movie`";
    $count = $conn->exec($statement);
    var_dump($count);
    echo '[3]执行 ', $statement, ' ', "\n", '   受影响行数:', $count, "\n";

    $statement = "SELECT * FROM `movie`";
    $count = $conn->query($statement);
    echo '[4]执行 ', $statement, ' ', "\n", '   受影响行数:', $count->rowCount(), "\n";

    /* 输出:
    [1]执行 DELETE FROM `movie` WHERE `id` > 1 LIMIT 1 
       受影响行数:1
    int(5)
    [3]执行 DELETE FROM `movie` 
       受影响行数:5
    bool(false)
    [4]执行 SELECT * FROM `movie` 
       受影响行数:0
    */
} catch (PDOException $e) {
    echo $e->getMessage();
}

通过示例代码可以看出,假定一个 PDO 连接实例是游戏Boss,使用PDO::exec()执行有返回值的 SQL 语句,相当于 Boss 被放了一个打断技能,后续关于 PDO 连接实例的所有操作都无法进行。

5. 延展阅读

  • PDO::prepare():对待执行的 SQL 语句进行预处理,并返回该 SQL 语句的语句对象PDOStatement
  • PDO::query():执行一条 SQL 语句,并返回一个PDOStatement对象形式的结果集
  • PDOStatement::execute():执行一条预处理语句