PDO
PDO(PHP 数据对象),是 PHP 中的一个扩展库,用来操作数据库
使用 PDO 之前首先要确保 PHP 中安装了 PDO 这个扩展,我们可以使用以下两种方法来查看本地的 PHP 中是否安装了 PDO 扩展,同时要打开pdo_mysql扩展。
- 使用 phpinfo() 函数并在浏览器查看
- 在命令行中执行 php -m 查看是否有 pdo 扩展
PDO 中一共提供了三个类
PDO 类:PDO 的核心,主要负责连接数据、发送 SQL 语句等。
PDOStatement 类:主要用于解析结果集、实现预处理、事务等。
PDOException 类:主要用来代表 PDO 的异常。
PDO的基本用法
连接数据库
创建 PDO 的对象,就是连接数据库1
2
3
4
5
6
7
8
9
10
11try{
//连接数据库
$pdo = new \PDP('mysql:host=IP地址;dbname=数据库名;','用户名','密码');
//设置编码
$pdo ->exec("set names utf8");
}catch(PDOException $e){
var_dump($e->getMessage());
exit();
}
断开连接
1 | $pdo = null; |
exec() 方法
当要执行 insert、update、delete 等非 select 的语句时可以使用 PDO 类中提供的 exec 方法:1
2
3
4$pdo->exec($sql);
//1.成功时返回受影响的条数,有可能值为 0。
//2. 失败时返回 false。
//3.在判断是否执行成功时应该使用 === 来判断。
query() 方法
当要执行 select 从表中获取数据时,需要使用以下类方法1
2
3$pdo->query($sql);
//1. 如果执行成功返回 PDOStatement 类的对象。
//2. 如果失败返回 false
执行完 select 语句之后,PDO 会把数据保存到PDOStatement 类对象中返回,我们还需要使用这个类中的几个方法来获取数据1
2
3
4
5
6
7
8
9
10
11$stmt = $pdo->query($sql);
$stmt->rowCount(); // 返回记录数
$stmt->columnCount(); // 返回列数
$stmt->fetch([数据样式]); // 取出一条记录(执行一次取出一条)
$stmt->fetchAll([数据样式])// 取出所有记录
//数据样式
// PDO::FETCH_ASSOC : 返回关联数组(较常用)
//PDO::FETCH_BOTH :返回混合数组
//PDO::FETCH_NUM :返回索引数组
//PDO::FETCH_OBJ :返回对象
//PDO::FETCH__COLUMN :返回某一列的值
其他方法
1 | $id = $pdo->lastInsertId() // 返回新插入的记录的 id |
预处理
预处理是另一种高级的执行 SQL 语句的方式。和前面学习的执行 SQL 语句的方式相比,预处理有以下两个好处
➢ 执行 SQL 语句的速度更快。
➢ 这种方式更加的安全(对数据过滤,防止 SQL 注入)
因为预处理有很多好处,所以我们以后尽量都使用预处理的方式来执行 SQL 语句。
使用预处理的方式执行 SQL 语句主要分为两步:
- 先用 prepare 预执行 SQL 语句。
- 绑定数据并执行
预执行1
2
3
4
5$sql= 'insert into test values(?,?)';
//数据部分需要用?来代替,或用':字段名'来代替
//$sql= 'insert into test values(:name,:age)';
$stmt = $pdo->prepare($sql)
绑定数据并执行1
2
3
4
5
6
7
8$stmt->execute([
tom,
19
]);
/*$stmt->execute([
:name=>'tom',
:age=19
]);*/
事物
1 | //设置异常模式 |
PDO属性
1 | $pdo->setAttribute(属性名,属性值); // 设置属性值 |
属性列表
PDO 中可以设置的属性非常多
我们只先学习其中最常用的两个属性。
获取数据模式
我们可以使用 fetch 和 fetchAll 两个方法提取数据,在提供数据时可以通过参数设置提取模式:
错误模式
我们在执行每个操作时,都要考虑这个操作是否成功,如果失败了我们需要做相应的错误处理
但是,目前不同的操作错误处理的默认方式又是不同的,比如,连接数据库时如果失败会抛出 PDOException 异常,而其他操作失败时会返回 false。这就导致我们需要使用不同的方式
来处理错误。
我们可以通过错误模式属性,设置所有的错误模式相同,这样我们就可以写出统一的错误处
理代码。