PDO概述

1、PDO简介

ü PDO是PHP数据对象(PHP Data Object)的缩写。
ü PDO扩展为PHP访问不同数据库定义了一个轻量级的、一致性的接口;
ü PDO作用是统一各种数据库的访问接口,PDO让跨数据库的使用更具亲和力;
ü 有了PDO,您不必再使用mysqli*函数、oci函数或者mssql_函数,也不必再为它们封装数据库操作类,只需要使用PDO接口中的方法就可以对各种数据库进行操作。
ü PDO是一个第三方的类,默认已经集成到PHP中了。

2、PDO的访问流程图

image.png
image.png
image.png

3、创建PDO类的对象

ü 描述:创建一个表示数据库连接的 PDO 对象。
ü 语法:PDO::__construct ( string $dsn [, string $username [, string $password]] )
ü 参数:
þ $dsn,数据源名称或叫做 DSN,包含了请求连接到数据库的信息。通常,一个 DSN 由 PDO 驱动名、紧随其后的冒号、以及具体 PDO 驱动的连接语法组成。
þ 例如:$dsn = “mysql : host=127.0.0.1; port=3306; dbname=db; charset=utf8”
þ $username,数据库用户名。
þ $password,数据库密码。
ü 返回值:成功则返回一个PDO对象。
image.png

PDO对象常用方法

ü 描述:执行一条 SQL 语句,并返回受影响的行数
ü 语法:int PDO::exec ( string $sql )
ü 参数:$sql要被预处理和执行的 SQL 语句。
ü 注意:不会从SELECT语句返回结果。
返回:返回受修改或删除 SQL 语句影响的行数。如果没有受影响的行,则返回 0。
image.png

  1. <?php
  2. //数据库配置信息
  3. $dsn = "mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
  4. $username = "root";
  5. $password = "root";
  6. //创建PDO类的对象
  7. $pdo = new PDO($dsn,$username,$password);
  8. //执行插入的SQL语句
  9. $sql = "INSERT INTO student VALUES(null,'刘东明',1,default,'大专',6000,400,'山东省')";
  10. $records = $pdo->exec($sql);
  11. echo "成功插入了{$records}条记录!";

2、PDO::query()方法

ü 描述:执行一条SQL语句,返回一个结果集对象( PDOStatement )。
ü 语法:public PDOStatement PDO::query ( string $statement )
ü 提示:主要用于SELECT、SHOW语句。
ü 返回:执行成功返回PDOstatement对象,执行失败返回FALSE。
image.png

  1. <?php
  2. //数据库配置信息
  3. $dsn = "mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
  4. $username = "root";
  5. $password = "root";
  6. //创建PDO类的对象
  7. $pdo = new PDO($dsn,$username,$password);
  8. //执行查询的SQL语句,返回结果集对象(PDOStatement类)
  9. $sql = "SELECT * FROM student ORDER BY id DESC";
  10. $PDOStatement = $pdo->query($sql);
  11. var_dump($PDOStatement);

3、PDO::lastInsertId()方法

ü 描述:返回最后插入行的ID或序列值
ü 语法:string PDO::lastInsertId ( void )
ü 返回:返回最后插入行的ID。
image.png

  1. <?php
  2. //数据库配置信息
  3. $dsn = "mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
  4. $username = "root";
  5. $password = "root";
  6. //创建PDO类的对象
  7. $pdo = new PDO($dsn,$username,$password);
  8. //执行插入的SQL语句
  9. $sql = "INSERT INTO student(name,salary,bonus,city) VALUES('刘芒芒',8000,400,'安徽省')";
  10. $pdo->exec($sql);
  11. //获取最后插入成功的记录的id
  12. $id = $pdo->lastInsertId();
  13. echo "最后插入成功的记录ID是:{$id}";

4、PDO::setAttribute()方法

ü 描述:设置数据库句柄属性
ü 语法:bool PDO::setAttribute ( int $attribute , mixed $value )
ü 提示:PDO内置了一些可用的通用属性(详细见手册)
þ PDO::ATTR_CASE:强制列名为指定的大小写。
þ PDO::ATTR_ERRMODE:错误报告
þ PDO::ATTR_DEFAULT_FETCH_MODE: 设置默认的提取模式。
ü 返回:成功时返回 TRUE, 或者在失败时返回 FALSE。
image.png

  1. <?php
  2. //数据库配置信息
  3. $dsn = "mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
  4. $username = "root";
  5. $password = "root";
  6. //创建PDO类的对象
  7. $pdo = new PDO($dsn,$username,$password);
  8. //设置PDO属性:设置从结果集提取数组的类型为关联数组
  9. $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  10. //执行查询的SQL语句,执行成功返回结果集对象(PDOStatement类)
  11. $sql = "SELECT * FROM student";
  12. $PDOStatement = $pdo->query($sql);
  13. //遍历结果集对象,取出每一行数据(一维数组)
  14. foreach($PDOStatement as $arr)
  15. {
  16. print_r($arr);
  17. }

PDOStatement对象常用方法

1、PDOStatement::fetch()方法

ü 描述:从结果集中获取一行,并向下移动指针
ü 语法:mixed PDOStatement::fetch ([ int $fetch_style ] )
ü 参数:$fetch_style,控制下一行如何返回给调用者。
þ PDO::FETCH_ASSOC,返回一个索引为结果集列名的数组
þ PDO::FETCH_BOTH(默认),返回一个索引为结果集列名和以0开始的列号的数组
þ PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组
ü 返回:此函数(方法)成功时返回的值依赖于提取类型。在所有情况下,失败都返回 FALSE 。
image.png

  1. <?php
  2. //数据库配置信息
  3. $dsn = "mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
  4. $username = "root";
  5. $password = "root";
  6. //创建PDO类的对象
  7. $pdo = new PDO($dsn,$username,$password);
  8. //执行查询的SQL语句,执行成功返回结果集对象(PDOStatement类)
  9. $sql = "SELECT * FROM student";
  10. $PDOStatement = $pdo->query($sql);
  11. //从结果集对象循环取出所有行数据
  12. while($arr = $PDOStatement->fetch(PDO::FETCH_ASSOC))
  13. {
  14. print_r($arr);
  15. }

2、PDOStatement::fetchAll()方法

ü 描述:返回一个包含结果集中所有行的数组
ü 语法:array PDOStatement::fetchAll ([ int $fetch_style ] )
ü 参数:$fetch_style,控制下一行如何返回给调用者。
þ PDO::FETCH_ASSOC,返回一个索引为结果集列名的数组
þ PDO::FETCH_BOTH(默认),返回一个索引的数组
þ PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组
image.png

  1. <?php
  2. //数据库配置信息
  3. $dsn = "mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
  4. $username = "root";
  5. $password = "root";
  6. //创建PDO类的对象
  7. $pdo = new PDO($dsn,$username,$password);
  8. //执行查询的SQL语句,执行成功返回结果集对象(PDOStatement类)
  9. $sql = "SELECT * FROM student";
  10. $PDOStatement = $pdo->query($sql);
  11. //从结果集对象获取多行数据
  12. $arrs = $PDOStatement->fetchAll(PDO::FETCH_ASSOC);
  13. print_r($arrs);

3、PDOStatement::rowCount()方法

ü 描述:返回受上一个 SQL 语句影响的行数
ü 语法:int PDOStatement::rowCount ( void )
ü 返回:返回上一个由对应的 PDOStatement 对象执行SELECT、DELETE、 INSERT、或 UPDATE 语句受影响的行数。
提示:要想使用该函数,必须使用 $pdo->query() 返回 PDOStatement 对象。
image.png

  1. <?php
  2. //数据库配置信息
  3. $dsn = "mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
  4. $username = "root";
  5. $password = "root";
  6. //创建PDO类的对象
  7. $pdo = new PDO($dsn,$username,$password);
  8. //执行查询的SQL语句,执行成功返回结果集对象(PDOStatement类)
  9. $sql = "SELECT * FROM student";
  10. $PDOStatement = $pdo->query($sql);
  11. //获取查询记录数
  12. $records = $PDOStatement->rowCount();
  13. echo "总记录为{$records}条!";

PDO错误处理

1、PDO支持三种错误模式

ü 静默模式(Silent):错误发生后,不会主动报错,是默认的模式;
ü 警告模式(Warning):错误发生后,通过PHP标准来报告错误;
ü 异常模式(Exception):错误发生后,抛出异常,需要捕捉和处理;
ü 提示:可以通过 PDO::setAttribute() 更改错误模式。

2、静默模式(Slient)

在静默模式下,当有错误发生时,不会显示在页面上;
此时,可以通过PDO的PDO::errorCode()和PDO::errorInfo()两个方法,来获取错误信息。
image.png

  1. <?php
  2. //数据库配置信息
  3. $dsn = "mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
  4. $username = "root";
  5. $password = "root";
  6. //创建PDO类的对象
  7. $pdo = new PDO($dsn,$username,$password);
  8. //执行查询的SQL语句,执行成功返回结果集对象(PDOStatement类)
  9. $sql = "SELECT * FROM student WHERE id=abc";
  10. $PDOStatement = $pdo->query($sql);
  11. //获取错误信息
  12. echo "错误编号:".$pdo->errorCode();
  13. echo "<br>错误信息:";
  14. print_r($pdo->errorInfo());

3、警告模式(Warning)

因为默认报错模式是静默模式(silent),如果想报警告错误,必须使用setAttribute()方法提前设置。
image.png

  1. <?php
  2. //数据库配置信息
  3. $dsn = "mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
  4. $username = "root";
  5. $password = "root";
  6. //创建PDO类的对象
  7. $pdo = new PDO($dsn,$username,$password);
  8. //设置错误报告模式为:警告模式
  9. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
  10. //执行查询的SQL语句,执行成功返回结果集对象(PDOStatement类)
  11. $sql = "SELECT * FROM student WHERE id=abc";
  12. $PDOStatement = $pdo->query($sql);

4、异常模式(Exception)

因为默认报错模式是静默模式(silent),如果想报异常错误,必须使用setAttribute()方法提前设置。
image.png
image.png
image.png
image.png

  1. <?php
  2. //数据库配置信息
  3. $dsn = "mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
  4. $username = "root";
  5. $password = "root";
  6. //创建PDO类的对象
  7. $pdo = new PDO($dsn,$username,$password);
  8. //设置错误报告模式为:异常模式
  9. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  10. try{
  11. //执行查询的SQL语句,执行成功返回结果集对象(PDOStatement类)
  12. $sql = "SELECT * FROM student WHERE id=abc";
  13. $PDOStatement = $pdo->query($sql);
  14. }catch(Exception $error)
  15. {
  16. //输出异常信息
  17. echo "错误编号:".$error->getCode();
  18. echo "<br>错误行号:".$error->getLine();
  19. echo "<br>错误文件:".$error->getFile();
  20. echo "<br>错误信息:".$error->getMessage();
  21. }

SQL语句预处理

1、SQL语句执行过程

ü SQL语句的执行,分成两个阶段:编译和执行。
ü 如果SQL语句,是第1次执行,先编译再执行。编译过程十分复杂,耗用系统资源,相对不太安全;
ü 如果SQL语句(即相同的SQL语句),是第2次执行,直接从缓存中读取,无疑执行效率是最高的,也是比较安全的,可以有效避免SQL注入等安全问题;
image.png

ü 先提取相同结构的sql部分!(将数据部分,可变的部分去掉)
ü 编译这个相同的结构!将编译结果保存!
ü 再将不同的数据部分进行替换!
ü 执行即可!

ü 在SQL语句中,使用命名参数和问号参数,来代替可变的数据。
ü 使用占位符“:value”和“?”来代替可变的数据。
image.png

(3)预编译相同结构的SQL语句

ü 描述:执行预编译的SQL语句结构,并返回一个PDOStatement对象。
ü 语法:public PDOStatement PDO::prepare ( string $statement )
返回:执行成功返回PDOStatement对象,失败返回FALSE。
image.png

(4)给占位符绑定数据

ü 描述:绑定一个值到预处理的 SQL 语句中的对应命名占位符或问号占位符。
ü 语法:bool PDOStatement::bindValue ( mixed $parameter , mixed $value )
ü 参数:
þ $parameter,参数标识符。对于使用命名占位符的预处理语句,应是类似 :name 形式的参数名。对于使用问号占位符的预处理语句,应是以1开始索引的参数位置。
þ $value,绑定到参数的值;
ü 返回:成功时返回 TRUE, 或者在失败时返回 FALSE。
image.png

ü 描述:执行一条预处理语句
ü 语法:bool PDOStatement::execute( )
ü 返回:成功时返回 TRUE, 或者在失败时返回 FALSE。
image.png

3、实例:PDO的SQL语句预处理

image.png

  1. <?php
  2. //数据库配置信息
  3. $dsn = "mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
  4. $username = "root";
  5. $password = "root";
  6. //创建PDO类的对象
  7. $pdo = new PDO($dsn,$username,$password);
  8. //制作相同结构的SQL语句,数据部分用占位符代替
  9. $sql = "INSERT INTO student(name,salary,bonus,city) VALUES(?,?,?,?)";
  10. //预编译相同结构的SQL语句(含有占位符)
  11. $PDOStatement = $pdo->prepare($sql);
  12. //给问号(?)占位符绑定数据:1对应第1个问号,2对应第2个问号,以此类推...
  13. $PDOStatement->bindValue(1,'张四五');
  14. $PDOStatement->bindValue(2,9000);
  15. $PDOStatement->bindValue(3,900);
  16. $PDOStatement->bindValue(4,'山西省');
  17. //执行绑定数据预处理SQL语句
  18. $PDOStatement->execute();