__construct()

1. 定义

该方法创建一个数据库连接的PDO实例。

2. 语法

PDO::__construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )

3. 参数说明

参数 可选性 数据类型 描述
$dsn 必需 字符串 请求连接数据库的配置信息,其中包括数据库驱动名称、一个冒号,再加上具体的数据库驱动语法。例如:mysql:host=localhost;dbname=test;charset=UTF8;port=3306
$username 可选 字符串 连接数据库时的用户名,例如root,某些数据库驱动该项可选
$password 可选 字符串 连接数据库时用户$username对应的密码,某些数据库驱动该项可选
$driver_options 可选 数组 连接数据库时的键值对配置选项,例如[PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC](设置默认提取结果为关联数组形式)

其中,$dsn参数除了完整的 DSN 形式,还可以是 URI 指定本地文件或远程文件,详细使用请看示例。也可以是一个在php.ini中配置的pdo.dsn.name选项定义的连接参数别名(不便于修改,不推荐)。

另外,$driver_options有以下通用可选项:

  • PDO::ATTR_CASE:强制列名为大写或小写
    • PDO::CASE_LOWER:强制小写
    • PDO::CASE_NATURAL:保留列名原本的值
    • PDO::CASE_UPPER:强制大写
  • PDO::ATTR_ERRMODE:错误报告收集的类别
    • PDO::ERRMODE_SILENT:只设置错误代码
    • PDO::ERRMODE_WARNING:提出一个警告(warning)
    • PDO::ERRMODE_EXCEPTION:抛出一个异常(Exception)
  • PDO::ATTR_ORACLE_NULLS:对 Oracle 数据库无效。NULL与空字符串之间的转换
    • PDO::NULL_NATURAL:保留NULL
    • PDO::NULL_EMPTY_STRING:空字符串转换为NULL
    • PDO::NULL_TO_STRINGNULL值转换为空字符串
  • PDO::ATTR_STRINGIFY_FETCHES:布尔值,提取结果时是否将数值转换为字符串
  • PDO::ATTR_STATEMENT_CLASS:设置使用用户自定义的继承自PDOStatement的语句类。无法与进行持久性连接的 PDO 实例配合使用,值为一个包含字符串类名和构造函数参数数组的数组
  • PDO::ATTR_TIMEOUT:指定数据库连接的最大超时时间。各驱动对此支持度不一,意义也不一定相同,值为一个整型数值
  • PDO::ATTR_AUTOCOMMIT:对 OCI,Firebird 和 MySQL 有效。设置是否自动提交每个 SQL 语句
  • PDO::ATTR_EMULATE_PREPARES:启用或禁用PDO预处理语句(某些数据库驱动支持度有限)
  • PDO::MYSQL_ATTR_USE_BUFFERED_QUERY:仅对 MySQL 有效。使用查询缓冲
  • PDO::ATTR_DEFAULT_FETCH_MODE:设置默认提取结果模式
    • PDO::FETCH_ASSOC:结果集返回一个索引为列名的关联数组
    • PDO::FETCH_BOTH:默认值。结果集分别返回以索引为列名和从零开始的数字的关联数组
    • PDO::FETCH_BOUND:返回TRUE,并将结果集中的列值分配给使用PDOStatement::bindColumn()方法绑定到的 PHP 变量
    • PDO::FETCH_CLASS:返回所请求类的新实例,并将结果集的列值映射到该类中的命名属性,当与PDO::FETCH_PROPS_LATE同时使用时,将调用该类的构造函数
    • PDO::FETCH_INTO:更新请求的类中已存在的实例,并将结果集的列值映射到该类中的命名属性
    • PDO::FETCH_LAZY:相当于PDO::FETCH_BOTH | PDO::FETCH_OBJ,在访问对象的变量时创建该变量
    • PDO::FETCH_NUM:结果集返回一个数字索引的数组
    • PDO::FETCH_OBJ:结果集返回一个以列名为属性名的匿名对象
    • PDO::FETCH_PROPS_LATE:当与PDO::FETCH_CLASS同时使用时,将在从各个列值分配属性之前调用该类的构造函数

具体使用请看PDOStatement::fetch()

4. 示例

请确定您的计算机已安装 MySQL 或其他数据库。如未安装可根据本教程的安装进行安装。

假定您安装了 MySQL,并配置了用户root,密码为mysql

执行下列 SQL 命令创建test数据库:

CREATE DATABASE `test` DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_bin';

现在我们创建连接数据库的脚本conn.php

<?php

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']);
    $option = array(
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    );
    $conn = new PDO($dsn, $config['user'], $config['pwd'], $option);
    if($conn) echo '数据库连接成功!';
} catch (PDOException $e) {
    error_log($e->getMessage());// 将错误信息记录至日志
    echo $e->getMessage();
}

启动本地服务器,并访问conn.php。如果您的配置正确,将看到数据库连接成功!的输出。 可以尝试配置错误的参数,例如错误的密码,查看输出,如下所示:

SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)

根据错误信息,查询相应的解决方案。