prepare()

1. 定义

该方法对待执行的 SQL 语句进行预处理,并返回该 SQL 语句的语句对象PDOStatement

注:

  • 该方法不会检查 SQL 语句的正确性
  • 如果语句出错,则返回 FALSE 或抛出异常PDOException

2. 语法

public PDO::prepare ( string $statement [, array $driver_options = array() ] ) : PDOStatement

3. 参数说明

参数 可选性 数据类型 描述
$statement 必需 字符串 对目标数据库服务器有效的 SQL 语句模板,例如SELECT * FROM `movie` WHERE `name` = :name
$driver_options 可选 数组 为返回的PDOStatement对象设置的键值对属性,例如[PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]

其中,$statement所需要的 SQL 语句模板中的参数占位符有两种形式:

  • 命名参数形式:在需要传入的参数处,添加一个冒号:,后跟非关键字或标识符或其他范围性字符(比如在IN()查询中传入多个参数绑定到单一的参数中)的字符串
  • 问号形式:在需要占位的地方使用一个英文问号?进行占位,后续绑定参数时按照问号的顺位进行绑定

注意:

  • 两种占位方式不可以同时使用
  • 名称必须唯一
  • 也不需要手动给占位参数添加引号
  • 不允许对列名和表名进行占位!(但可以在 SQL 语句中使用变量)

4. 示例

<?php

// PDO::prepare()
// 对待执行的 SQL 语句进行预处理,并返回该 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']);

    // 使用 命名参数 进行参数占位绑定
    $sql = "INSERT INTO `movie`(`name`, `rate`, `url`, `cover`) VALUES (:name, :rate, :url, :cover)";
    $statement = $conn->prepare($sql);
    $statement->execute(
        [
            ':name'=>'极速教程',
            ':rate'=>'9.9',
            ':url'=>'https://www.jisudev.com/',
            ':cover'=>'http://www.jisudev.com/static/images/logo.png'
        ]
    );
    $statement->execute(
        [
            ':name'=>'极速数据',
            ':rate'=>'9.9',
            ':url'=>'https://www.jisuapi.com/',
            ':cover'=>'http://www.jisuapi.com/static/images/logo.png'
        ]
    );// PDOStatement::execute() 是执行预处理语句的方法,如果不传入任何参数,将插入 null

    // 可查看是否成功插入数据

    // 使用 问号 进行参数占位绑定
    $sql = "SELECT `name`,`rate` FROM `movie` WHERE `rate` > ? AND `rate` < ?";
    $statement = $conn->prepare($sql);
    $statement->execute(
        [9.5, 10]
    );
    $high = $statement->fetchAll(PDO::FETCH_ASSOC);
    $statement->execute(
        [8.0, 8.5]
    );
    $low = $statement->fetchAll(PDO::FETCH_ASSOC);

    echo '评分超过9.5的有:',implode('、', array_column($high, 'name')),"\n";
    echo '评分8.0-8.5的有:',implode('、', array_column($low, 'name')),"\n";
} catch (PDOException $e) {
    error_log($e->getMessage()); // 将错误信息记录至日志
    echo $e->getMessage();
}
/* 输出:
评分超过9.5的有:霸王别姬、肖申克的救赎、极速教程、极速数据
评分8.0-8.5的有:复仇者联盟3:无限战争、无名之辈、续命之徒:绝命毒师电影、你的名字。
*/

5. 延展阅读