PDO介绍
PDO概述
PDO简介
- PDO就是PHP Data Object
- PDO主要用来代替数据库操作类
- PDO就是一个系统类
- PHP同时可以操作多个数据库,例如:MySQL、SQL Server、Oracle、Db2等
- PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,无论使用什么数据库,都可以通过一致的函数(方法)来执行查询和获取数据。
- PDO是一个数据访问抽象层,作用是统一各种数据库的访问接口,与MySQL和MSSQL函数库相比,PDO让跨数据库的使用更具亲和力,与ADODB和MDB2相比,PDO更高效。
1.开启PDO扩展
修改php配置文件php.ini代码如下:
extension=php_pdo_mysql.dll
//获取Apache、MySQL、PHP、GD等配置信息
phpinfo();
2.PDO连接MySQL
- 描述:创建一个表示数据库连接的PDO实例。
- 语法:PDO::__construct(string $dsn[,string $username[,string $password]])
- 参数:
- $dsn数据源名称:包含了连接数据库的基本信息;
- 格式:$dsn=“dbtype:host=主机名;port=端口号;dbname=数据库名;charset=字符集”
- dbtype参数:代表要连接的额数据库类型,例如:mysql、mssql、oracle等;
- host参数:数据库服务器地址,可以是域名,也可以是IP地址;
- port参数:数据库端口号,mysql的端口号:3306;
- dbname参数:数据库名称;
- charset参数:字符集,例如:utf8等;
- $username数据库的用户名
- $password数据库的用户密码
- $dsn数据源名称:包含了连接数据库的基本信息;
例子代码:
<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//创建PDO对象
$pdo=new PDO($dsn,$username);
var_dump($pdo);
PDO对象常用方法
1. exec()
- 描述:执行一条 SQL 语句,并返回受影响的行数
- 语法:int PDO::exec ( string $statement )
注意:执行select语句,将返回0。
例子代码:
<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)插入一条记录
$sql="INSERT INTO student VALUES(null,"小明","男",24)";
$records=$pdo->exec($sql);
echo "共插入{$records}条记录";
2. query()
- 描述:执行SELECT、SHOW语句,并返回一个结果集对象(PDOStatement)
- 语法:public PDOStatement PDO::query ( string $statement )
代码例子:
<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)查询数据并返回结果集对象
$sql="SELECT * FROM student";
$PDOstatement=$pdo->query($sql);
//(4)遍历对象
foreach ($PDOstatement as $arr) {
print_r($arr);
}
3. lastInsertId()
- 描述:获取插入记录的ID号
- 语法:string PDO::lastInsertId (void )
代码例子:
<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)插入一条记录
$sql="INSERT INTO student VALUES(null,"小明","男",24)";
$pdo->exec($sql);
//(4)获取插入的记录的ID值
echo "id=".$pdo->lastInsertId()."记录插入成功";
4.setAttribute()
- 描述:设置属性。
- 语法:bool PDO::setAttribute ( int $attribute , mixed $value )
- 参数:。。。
代码例子:
<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//设置默认的提取数据的模式
$pdo->setAttribute(PDO::ATTR_DEFALT_FETCH_MODE,PDO::FETCH_ASSOC)
//(3)插入一条记录
$sql="INSERT INTO student VALUES(null,"小明","男",24)";
$pdo->exec($sql);
//(4)获取插入的记录的ID值
echo "id=".$pdo->lastInsertId()."记录插入成功";
PDOStatement结果集对象常用方法
1.fetch()
- 描述:从结果集中获取一行,并将指针下移
- 语法:mixed PDOStatement::fetch ([ int $fetch_style] )
- 参数:
- PDO::FETCH_ASSOC:返回一个索引为结果集列名的数组
- PDO::FETCH_BOTH(默认):返回一个索引为结果集列名和以0开始的列号的数组
- PDO::FETCH_BOUND:返回 TRUE ,并分配结果集中的列值给 PDOStatement::bindColumn() 方法绑定的 PHP 变量。
- PDO::FETCH_CLASS:返回一个请求类的新实例,映射结果集中的列名到类中对应的属性名。如果 fetch_style 包含 PDO::FETCH_CLASSTYPE(例如:PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE),则类名由第一列的值决定
- PDO::FETCH_INTO:更新一个被请求类已存在的实例,映射结果集中的列到类中命名的属性
- PDO::FETCH_LAZY:结合使用 PDO::FETCH_BOTH 和 PDO::FETCH_OBJ,创建供用来访问的对象变量名
- PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组
- PDO::FETCH_OBJ:返回一个属性名对应结果集列名的匿名对象
代码例子:
<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)查询数据,并返回结果集对象
$sql="SELECT * FROM student WHERE id=48";
$PDOStatement=$pdo->query($sql);
//(4)从结果集获取一条记录
$arr=$PDOStatement->fetch(PDO::FETCH_ASSOC);
print_r($arr);
2.fetchAll()
- 描述:返回一个包含结果集中所有行的二维数组
- 语法:array PDOStatement::fetchAll ([ int $fetch_style ] )
- 参数:。。。
例子代码:
<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)查询数据,并返回结果集对象
$sql="SELECT * FROM student";
$PDOStatement=$pdo->query($sql);
//(4)从结果集获取一条记录
$arrs=$PDOStatement->fetchAll(PDO::FETCH_ASSOC);
print_r($arrs);
3.fetchColumn()
- 描述:从结果集中的下一行返回单独的一列。
- 语法:string PDOStatement::fetchColumn ([ int $column_number = 0 ] )
- 参数:$column_number是列的索引值,默认为0
代码例子:
<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)查询数据,并返回结果集对象
$sql="SELECT count(id) FROM student";
$PDOStatement=$pdo->query($sql);
//(4)从结果集获取某个列的值
$records=$PDOStatement->fetchColumn(0);
echo "共有{$records}条记录";
4.rowCount()
- 描述:返回受上一个 SQL 语句影响的行数
- 语法:int PDOStatement::rowCount ( void )
例子代码:
<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)查询数据,并返回结果集对象
$sql="SELECT * FROM student";
$PDOStatement=$pdo->query($sql);
//(4)从结果集获取记录数
$records=$PDOStatement->rowCount();
echo "共有{$records}条记录";
PDO错误处理模式
错误处理概述
PDO错误报告模式:静默模式、警告模式、异常模式。
- 静默模式(silent):当PDO执行SQL语句有错时,不显示任何错误(默认);
- 警告模式(warming):当PDO执行SQL语句有错时,用错误 的等级来报告信息;
- 异常模式(exception):当PDO执行SQL语句有错时,先抛出异常,再捕获异常。
1. 静默模式(silent)
获取错误信息函数PDO::errorCode()
和POD::errorInfo()
PDO::errorCode()
:获取错误状态码。如果状态码为“00000”,说明没有错。POD::errorInfo()
获取描述性信息。
例子代码:
<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)查询数据,并返回结果集对象
$sql="SELECT * FROM student WHERE id=abc";
$PDOStatement=$pdo->query($sql);
//(4)输出错误信息
echo "错误状态码".$PDOStatement->errorCode();
echo "<br>错误信息:";
print_r($PDOStatement->errorInfo());
2.警告模式(warming)
要想报告“警告模式错误”,必须先设置错误的报告模式。
例子代码:
<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//设置PDO的报错模式为:警告模式
$pod->setAttribute(PDO::ATTR_ERRMODE,POD::ERRMODE_WARMING);
//(3)查询数据,并返回结果集对象
$sql="SELECT * FROM student WHERE id=abc";
$PDOStatement=$pdo->query($sql);
3.异常模式(exception)
要想报告“异常模式错误”,必须先设置错误的报告模式。
例子代码:
<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//设置PDO的报错模式为:警告模式
$pod->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
//(3)查询数据,并返回结果集对象
try{
//师徒正常运行的程序代码
$sql="SELECT * FROM student WHERE id=abc";
$PDOStatement=$pdo->query($sql);
}catch(PDOException $e){
echo "错误行号:".$e->getLine();
echo "<br>错误文件:".$e->getFile();
echo "<br>错误状态码:".$e->getCode();
echo "<br>错误描述信息".$e->getMessage();
}
SQL语句预处理
SQL语句的执行过程
SQL语句的执行,分成两个阶段:编译和执行。
- 如果SQL语句是第一次执行,先编译再执行。编译过程十分复杂,耗用系统资源,相对不太安全;
- 如果SQL语句(即相同的SQL语句)是第2次执行,直接从缓存中读取,无疑执行效率是最高的,也是比较安全的,可以有效避免SQL注入等安全问题;
PDO预处理的步骤
- 先提取相同结构的SQL部分(将数据部分,可变的部分去掉)
- 编译这个相同的结构,将编译结果保存
- 将不同的数据部分进行替换
- 执行
1.制作相同结构的SQL语句
//(1)使用占位符“:value”来代替真正的数据
$sql="INSERT INTO news(title,content) VALUES(:title,:content)";
//(2)使用占位符“:1”来代替真正的数据
$sql="INSERT INTO news(title,content) VALUES(:1,:2)";
2.预编译相同结构的SQL语句
//(1)使用占位符“:value”来代替真正的数据
$sql="INSERT INTO news(title,content) VALUES(:title,:content)";
//(2)预编译相同结构的SQL语句
$PDOStatement=$pdo->prepare($sql);
3.给占位符绑定真正的数据
/(1)使用占位符“:value”来代替真正的数据
$sql="INSERT INTO news(title,content) VALUES(:title,:content)";
//(2)预编译相同结构的SQL语句
$PDOStatement=$pdo->prepare($sql);
//(3)给占位符绑定真正的数据
$PDOStatement->bindValue(":title","新闻标题");
$PDOStatement->bindValue(":content","新闻内容");
//(1)使用占位符“?”来代替真正的数据
$sql="INSERT INTO news(title,content) VALUES(?,?)";
//(2)预编译相同结构的SQL语句
$PDOStatement=$pdo->prepare($sql);
//(3)给占位符绑定真正的数据
$PDOStatement->bindValue("1","新闻标题");
$PDOStatement->bindValue("2","新闻内容");
4. 执行绑定数据的SQL语句
//(1)使用占位符“:1”来代替真正的数据
$sql="INSERT INTO news(title,content) VALUES(?,?)";
//(2)预编译相同结构的SQL语句
$PDOStatement=$pdo->prepare($sql);
//(3)给占位符绑定真正的数据
$PDOStatement->bindValue("1","新闻标题");
$PDOStatement->bindValue("2","新闻内容");
//(4)执行预编译的SQL语句
$PDOStatement->execute();