PDO对象
PDO 是什么
PDO 是 PHP Date Object(PHP 数据对象)的简称,它是 PHP 为访问数据库定义的一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样无论你使用什么数据库,都可以通过同一函数执行查询和获取数据,大大简化了数据库的操作,并能够屏蔽不同数据库之间的差异。
PDO 是与 PHP5.1 版本一起发行的,使用 PDO 可以很方便地进行跨数据库程序的开发,以及不同数据库间的移植,目前 PDO 支持的数据库包括 Firebird、FreeTDS、Interbase、MySQL、SQL Server、ODBC、Oracle、Postgre SQL、SQLite 和 Sybase 等。
PDO 的特点
我们可以将 PDO 看作是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口。与 MySQL 和 MSSQL 函数库相比,PDO 让跨数据库的使用更具有亲和力,与 ADODB 和 MDB2 相比,PDO 更加高效。
PDO 将通过一种轻型、清晰、方便的函数,统一各种不同的数据库的共有特性,实现 PHP 脚本在最大程度上的抽象性和兼容性。
PDO 吸取了现有数据库扩展成功和失败的经验教训,利用 PHP5 的最新特性,可以轻松地与各种数据库进行交互。
PDO 扩展是模块化的,能够在运行时为用户数据库后端加载驱动程序,而不必重新编译或重新安装整个 PHP 程序。例如,PDO_MySQL 扩展会替代 PDO 扩展实现 MySQL 数据库 API,它还有一些用于 Oracle、Postgre SQL、ODBC 和 Firebird 的驱动程序。
开启 PDO扩展
默认情况下,PDO 在 PHP 中为开启状态,但是要启用对某个数据库驱动程序的支持,仍需要进行相应的配置操作。
以 Windows 系统下为例,在配置文件 php.ini 中有关 PDO 相关的配置信息如下所示:
;extension=pdo_firebird
;extension=php_pdo_mysql.dll
;extension=pdo_oci
;extension=pdo_odbc
;extension=pdo_pgsql
;extension=pdo_sqlite
提示:开启相应的配置只需要去除配置项前面的分号;,然后重启 Apache 服务器即可。
验证相关的配置是否开启成功,只需要执行 phpinfo() 函数就行,在输出的页面中搜索配置的名称,如果存在则说明开启成功
使用PDO连接数据库
在使用 PDO 与不同数据库之间交互时,PDO 对象中的成员方法是统一各种数据库的访问接口,所以在使用 PDO 与数据库交互之前,首先要创建一个 PDO 对象,然后再通过对象的构造函数来连接数据库。
new PDO(string $dsn[, string $username [, string $password [, array $driver_options]]]);
参数说明如下:
- $dsn:数据源名称或叫做 DSN(Data Source Name 的缩写),包含了请求连接到数据库的信息。通常一个 DSN 是由 PDO 驱动程序的名称,紧随其后是一个冒号,再后面是可选的驱动程序的数据库连接信息,比如主机名、端口和数据库名。以 MySQL 数据库为例 $dsn 可以定义为:
mysql:host=localhost;port=3306;dbname=dbname;charset=utf8
,分别定义了数据库类型、端口号、数据库名和字符集; - $username:可选参数,用来表示 DSN 字符串中的用户名;
- $password:可选参数,用来表示 DSN 字符串中的密码;
- $driver_options:可选参数,一个具体驱动的连接选项的键/值数组。
PHP 数据对象:https://www.php.net/manual/zh/book.pdo.php
预定义常量:https://www.php.net/manual/zh/pdo.constants.php
创建 PDO 对象
$pdo = new PDO($dsn, $user, $pwd);
参数:dsn,数据库用户名,数据库密码
<?php
$type = 'mysql'; //数据库类型
$host = 'localhost'; //数据库主机名
$dbname = 'test'; //使用的数据库名称
$username = 'root'; //数据库连接用户名
$username = 'root'; //数据库连接密码
$dsn="$type:host=$host;dbname=$dbname";
try{
// 可选,设置错误提示级别为WARNING
$params = array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING);
//初始化一个PDO对象
$pdo= new PDO($dsn,$user,$pwd,$params);
# 设置结果集的默认获取的方式 (默认索引数组和关联数组)
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
}catch(Exception $e){
die('数据库连接失败:'.$e -> getMessage());
}
?>
使用PDO执行SQL语句
在 PDO 中,我们可以使用三种方式来执行 SQL 语句,分别是 exec() 方法,query() 方法,以及预处理语句 prepare() 和 execute() 方法。
执行sql语句: exec() 、query()、 perpare();
1、query用来处理有结果集的,如select, 返回 PDOStatement 对象,失败返回false(当为 PDO::ERRMODE_SILENT,这也是默认的值)
2、exec用来处理有返回影响行数的(int),如 insert(插入的行数)、 delete(删除的行数) 、update(和原数值不等才算), 失败返回false (当为 PDO::ERRMODE_SILENT,这也是默认的值)
3、prepare 执行所有sql,可以完全替代 query,exec的功能,并且可以防止SQL注入
错误报告是针对执行的sql出错时
PDO::ERRMODE_SILENT(0) :默认 不提示任何错误 ,连接时无论如何都会提示,只有在执行后面的方法时才会起作用
PDO::ERRMODE_WARNING(1) : 警告
PDO::ERRMODE_EXCEPTION(2):异常(推荐使用) 用try catch捕获,也可以手动抛出异常 new PDOException($message, $code, $previous)
1) exec() 方法
当执行 INSERT、UPDATE 和 DELETE 等不需要返回结果集的 SQL 语句时,可以使用 PDO 对象中的 exec() 方法。该方法成功执行后,将返回受影响的行数
主要思路:
(1)连接数据库、数据库的用户名、数据库的密码
(2)生成PDO对象
(3)执行查询
<?php
# $stmt = $pdo->exec($sql); 执行SQL增删改语句,返回值是false或 受影响的整型数量
$dsn = 'mysql:host=localhost;dbname=users;';
$username = 'root';
$password = 'root';
// 生成PDO对象
$pdo = new PDO($dsn,$user,$pwd);
$sql = "insert into user(name,age,sex) values('zhang','18','男')";
$res = $pdo -> exec($sql);
if($res) echo '成功添加 '.$res.' 条数据!';
?>
# exec用法
try {
$sql = "insert into users (`user_name`, `user_pwd`) values('zhang', '123'),('admin', 'admin')";
$rows = $pdo->exec($sql); // 影响的条数 2
$id = $pdo->lastInsertId(); //最后插入的id,有多条时返回的是第一条的id
} catch (Exception $e) {
echo $pdo->errorInfo();
}
注释:exec主要用于执行没有返回结果集的操作,比如insert、delete、update,返回的是影响的记录条数
2) query() 方法
当执行需要返回结果集的 SELECT 查询语句时,可以使用 PDO 对象中的 query() 方法。如果该方法执行成功,则会返回一个 PDOStatement 对象。如果使用了query() 方法,并想了解获取的数据行总数,可以使用 PDOStatement 对象中的 rowCount() 方法获取。
PDO::query(string $sql)
# 执行SQL查询语句,返回值是false或 PDOStatement 类型的对象
$stmt = $pdo->query($sql);
# 读取结果中的数量
echo $stmt->rowCount();
# 返回结果集第一条数据
$stmt->fetch(PDO::FETCH_ASSOC);
# 返回结果集全部数据
$stmt->fetchAll(PDO::FETCH_ASSOC);
# 直给pdo对象全局设置返回类型
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
通过设置第二个参数可以调整返回值的样式:
- PDO::FETCH_BOTH 关联+索引数组(默认值)
- PDO::FETCH_ASSOC 关联数组
- PDO::FETCH_NUM 索引数组
- PDO::FETCH_OBJ 对象类型
<?php
$dsn = 'mysql:host=127.0.0.1;dbname=mydb';
$user = 'root';
$pwd = 'root';
$pdo = new PDO($dsn,$user,$pwd);
$sql = "SELECT * FROM users ";
// 获取PDOStatement对象
$stmt = $pdo -> query($sql,PDO::FETCH_ASSOC);
echo "<pre>";
print_r($stmt);
// 获取结果集全部数据
print_r($stmt->fetchAll());
?>
设置结果集参数也可以通过fetch和fetchAll()传入
<?php
$sql = "SELECT * FROM users ";
// 获取PDOStatement对象
$stmt = $pdo -> query($sql);
// 获取结果集中第一条数据 返回关联数组
$res = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "<pre>";
print_r