PDO概述

PDO简介

  • PDO是PHP数据对象(PHP Data Object)的缩写。

  • PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口;

  • PDO作用是统一各种数据库的访问接口,PDO让跨数据库的使用更具亲和力;

  • 有了PDO,我们不必再使用mysqli_*函数、oci_*函数或者mssql_*函数,也不必再为它们封装数据库操作类,只需要使用PDO接口中的方法就可以对各种数据库进行操作。

  • PDO是一个第三方的类,默认已经集成到PHP中了

PDO的访问流程图

PDO(PHP数据对象)-LMLPHP

创建PDO类的对象

//$dsn,数据源名称或叫做 DSN,一个 DSN 由 PDO 驱动名和其他信息组成
$dsn = "mysql:host=loccalhost;post=3306;dbname=test;charset=utf8";
$user = "root";
$pwd = "root";
//创建PDO类的对象
$pdo = new PDO($dsn, $user, $pwd);

PDO对象的常用方法

PDO(PHP数据对象)-LMLPHP

  1. PDO::exec()方法

1)描述:执行一条 SQL 语句,并返回受影响的行数

2)语法:int PDO::exec ( string $sql )

3)参数:$sql要被预处理和执行的 SQL 语句。

4)注意:不会从SELECT语句返回结果。

5)返回:返回受修改或删除 SQL 语句影响的行数。如果没有受影响的行,则返回 0。


2、PDO::query()方法

1)描述:执行一条SQL语句,返回一个结果集对象( PDOStatement )。

2)语法:public PDOStatement PDO::query ( string $statement )

3)提示:主要用于SELECT、SHOW语句。

4)返回:执行成功返回PDOstatement对象,执行失败返回FALSE。

3、PDO::lastInsertId()方法

1)描述:返回最后插入行的ID或序列值

2)语法:string PDO::lastInsertId ( void )

3)返回:返回最后插入行的ID

4、PDO::setAttribute()方法

1)描述:设置数据库句柄属性

2)语法:bool PDO::setAttribute ( int $attribute , mixed $value )

3)提示:PDO内置了一些可用的通用属性(详细见手册)

a、PDO::ATTR_CASE:强制列名为指定的大小写。

b、PDO::ATTR_ERRMODE:错误报告

c、PDO::ATTR_DEFAULT_FETCH_MODE: 设置默认的提取模式。

4)返回:成功时返回 TRUE, 或者在失败时返回 FALSE

PDOStatement对象常用方法

PDO(PHP数据对象)-LMLPHP

  1. PDOStatement::fetch()方法

1)描述:从结果集中获取一行,并向下移动指针

2)语法:mixed PDOStatement::fetch ([ int $fetch_style ] )

3)参数:$fetch_style,控制下一行如何返回给调用者。

a、PDO::FETCH_ASSOC,返回一个索引为结果集列名的数组
b、PDO::FETCH_BOTH(默认),返回一个索引为结果集列名和以0开始的列号的数组
c、PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组

4)返回:此函数(方法)成功时返回的值依赖于提取类型。在所有情况下,失败都返回 FALSE 。

2、PDOStatement::fetchAll()方法

1)描述:返回一个包含结果集中所有行的数组

2)语法:array PDOStatement::fetchAll ([ int $fetch_style ] )

3)参数:$fetch_style,控制下一行如何返回给调用者。

a、PDO::FETCH_ASSOC,返回一个索引为结果集列名的数组
b、PDO::FETCH_BOTH(默认),返回一个索引的数组
c、PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组

3、PDOStatement::fetchColumn()方法

1)描述:从结果集中的下一行返回单独的一列

2)语法:string PDOStatement::fetchColumn ([ int $column_number = 0 ] )

3)参数:$column_number你想从行里取回的列的索引数字(以0开始的索引)。如果没有提供值,则PDOStatement::fetchColumn()获取第一列。

4)返回:从结果集中的下一行返回单独的一列,如果没有了,则返回 FALSE 。

5)注意:一个行只能取一个列的数据,不能同时取两个的列的数据。

4、PDOStatement::rowCount()方法

1)描述:返回受上一个 SQL 语句影响的行数

2)语法:int PDOStatement::rowCount ( void )

3)返回:返回上一个由对应的 PDOStatement 对象执行SELECT、DELETE、 INSERT、或 UPDATE 语句受影响的行数。

4)提示:要想使用该函数,必须使用$pdo->query()返回 PDOStatement 对象。

PDO错误处理

1、PDO支持三种错误模式

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

2、静默模式(Slient)

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

3、警告模式(Warning)

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

4、异常模式(Exception)

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

SQL语句预处理

1. SQL语句执行过程

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

PDO(PHP数据对象)-LMLPHP

2. PDO的SQL语句预步骤

  • PDO完成预处理需要的步骤

    a、先提取相同结构的sql部分!(将数据部分,可变的部分去掉)

    b、编译这个相同的结构!将编译结果保存!

    c、再将不同的数据部分进行替换!

    d、执行即可!

  • 提取相同结构的SQL语句a、在SQL语句中,使用命名参数和问号参数,来代替可变的数据。

    b、使用占位符":value"和"?"来代替可变的数据。

  • 预编译相同结构的SQL语句

    a、描述:执行预编译的SQL语句结构,并返回一个PDOStatement对象。

    b、语法:public PDOStatement PDO::prepare ( string $statement )

    c、返回:执行成功返回PDOStatement对象,失败返回FALSE。

    	//预编译相同结构的sql语句:含有占位符的sql语句
    
    
    
    
    	$PDOStatement = $pdo->prepare($sql);
    	var_dump($PDOStatement);
    

    结果:

    	object(PDOStatement)#2(1){
    	...
    	insert into student(name,age) values(:name, :age)
    
    	}
    
  • 给占位符绑定数据

    ①描述:绑定一个值到预处理的 SQL 语句中的对应命名占位符或问号占位符。

    ②语法:bool PDOStatement::bindValue ( mixed $parameter , mixed $value )③参数:

    a、$parameter,参数标识符。对于使用命名占位符的预处理语句,应是类似:name形式的参数名。对于使用问号占位符的预处理语句,应是以1开始索引的参数位置。

    b、$value,绑定到参数的值;④返回:成功时返回 TRUE, 或者在失败时返回 FALSE。

  • 执行预处理的SQL语句

    a、描述:执行一条预处理语句

    b、语法:bool PDOStatement::execute( )

    c、返回:成功时返回 TRUE, 或者在失败时返回 FALSE。":value"占位符综合示例:

//$dsn,数据源名称或叫做 DSN,包含了请求连接到数据库的信息。通常,一个 DSN 由 PDO 驱动名、紧随其后的冒号、以及具体 PDO 驱动的连接语法组成
$dsn = "mysql:host=loccalhost;post=3306;dbname=test;charset=utf8";
$user = "root";
$pwd = "root";
//创建PDO类的对象
$pdo = new PDO($dsn, $user, $pwd);

//构建插入的sql语句:提取相同结构部分,数据用占位符代替
$sql = "insert into student(name, age) values (:name, :age)";

//预编译相同结果的sql语句:含有占位符的sql语句
$PDOStatement = $pdo->prepare($sql);
//给站位符绑定真正数据
$PDOStatement->bindValue(":name", "张三");
$PDOStatement->bindValue(":age", 18);
//执行绑定数据的sql
$PDOStatement->execute();

"?"占位符综合示例:

//$dsn,数据源名称或叫做 DSN,包含了请求连接到数据库的信息。通常,一个 DSN 由 PDO 驱动名、紧随其后的冒号、以及具体 PDO 驱动的连接语法组成
$dsn = "mysql:host=loccalhost;post=3306;dbname=test;charset=utf8";
$user = "root";
$pwd = "root";
//创建PDO类的对象
$pdo = new PDO($dsn, $user, $pwd);
$sql = "insert into student(name, age) values (?,?)";
//预编译相同结果的sql语句:含有占位符的sql语句
$PDOStatement = $pdo->prepare($sql);
//给站位符绑定真正数据
$PDOStatement->bindValue("1", "张三");
$PDOStatement->bindValue("2", 18);
//执行绑定数据的sql
$PDOStatement->execute();
11-03 10:47