本帖最后由 西安前端组 于 2017-12-21 11:47 编辑
一、PDO扩展技术1、什么是PDO 全称php dataobject:PHP数据对象 PDO是PHP数据对象(PHP Data Object)的缩写。 PDO扩展为PHP访问数据库,提供了一个数据访问抽象层,使用统一的数据操作方式,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据。 PDO为一个PHP访问数据库的轻量型接口,访问数据库需要使用具体的数据库驱动。如PDO的MySQL驱动来完成。 2、为什么需要PDO ①支持多种数据库操作, ②支持面向对象,事务,防止sql注入等操作 3、开启PDO扩展 php.inià开启pdo_mysql.dll扩展à重启à检测 二、PDO类
1、与PDO相关的几个类 PDO类:PDO的核心,用于数据库连接、发送sql语句等 PDOstatement类:用于解析结果集,实现预处理,事务处理等特殊功能 PDOException异常类:用于捕获PDO异常 2、PDO类 开辟内存空间à执行构造函数 ①构造函数 PDO::__construct($dsn,$user,$pass) $dns格式mysq:host=locallhost,dbname=project 实例: [PHP] 纯文本查看 复制代码 header("content-type:text/html;charset=utf-8");
$pdo= new PDO('mysql:host=localhost;dbname=test01',’root’,’mysql’);
②手工关闭pdo对象,PDO中没有mysql_close(); $pdo=null; 或者 unset($pdo), 3、pdo执行操作(增加,修改,删除) intPDO::exec(string $statement) 主要功能:实现对sql语句的执行操作, ①增加操作 1、设置响应头信息 2、连接PDO数据库 3、组装sql语句 [PHP] 纯文本查看 复制代码 $sql = ‘insertinto tale_name values(‘’,’’’,’)’;
4、执行sql语句 [PHP] 纯文本查看 复制代码 $num = $pdo->exec($sql);
echo ‘共插入’.$num.’条语句’,
可以实现插入最后一条数据的ID stringPDO::lastInsterId() echo$pdo->lastInsterId();
②修改操作 前面步骤一致: 第三步组装sql [PHP] 纯文本查看 复制代码 $sql =’update table_name set name = ‘张三’;
执行sql语句 [PHP] 纯文本查看 复制代码 $num =$pdo->exec($sql); //共修改了$num
③删除操作 [PHP] 纯文本查看 复制代码 $num =$pdo->exec($sql); //共删除了$num
4、PDO的查询操作 PDO::query(string$statement) 主要功能:实现对SQL语句的查询操作,返回PDOStatement对象 参数说明: $statement:代表要执行的查询语句 //执行代码 $stmt = $pdo->query($sql);
[PHP] 纯文本查看 复制代码 intPDOstatement::rowCount(void) 返回总行数
intPDOStatement::columnCount(void); 返回总列数 5、PDO中的遍历操作 第一种遍历方法[PHP] 纯文本查看 复制代码 mixed PDOStatement::fetch(int$fetch_style) 数据遍历输出,遍历一条,指针向下移动一位
PDO::FETCH_ASSOC 把一条记录遍历到关联数组中
PDO::FETCH_NUM 把一条记录遍历到索引型数组中
PDO::FETCH_BOTH 把一条记录遍历到混合型数组中
PDO::FETCH_OBJ把一条记录遍历到对象中
PDO::FETCH_BOUND(bindcolumn) 数据绑定,把某个变量绑定到结果集中的某个列 [PHP] 纯文本查看 复制代码 示例一:PDO::FETCH_ASSOC
//5、获取总记录数
$count=$stmt->rowCount();
//遍历到关联数组中
for($i=0;$i<$count;$i++){
$row=$stmt->fetch(PDO::FETCH_ASSOC);
}
示例二:PDO::FETCH_BOUND(bindColumn) [PHP] 纯文本查看 复制代码 //5、使用bindColumn实现列绑定
$stmt=$stmt->bindColumn(1,$id); //把变量$id 绑定到结果集的第1列
$stmt=$stmt->bindColumn(2,$user); //把变量$user 绑定到结果集的第2列
$stmt=$stmt->bindColumn(3,$pass); //把变量$pass绑定到结果集的第3列
//6、遍历结果集
for($i=1;$i<$count;$i++){
//指定fetch绑定方式为PDO::FETCH_BOUND;否则bindCoulmn不会生效
$stmt->fetch(PDO::FETCH_BOUND);
//输出$id/$user/$pass的值
echo $id;
echo$user;
echo$pass;
}
第二种遍历方法 array PDOStatement::fetchAll(); 主要功能:把数据表的记录返回到一个二维数组中 示例代码: [PHP] 纯文本查看 复制代码 $data=stmt->fetchAll(PDO::FETCH_ASSOC); //遍历$data
第三种遍历方法[PHP] 纯文本查看 复制代码 string PDOStatement::fetchColumn([int$column_number = 0]);
主要功能:遍历结果集当前行的某一列信息
参数说明:
$column_number: 第几列,默认从0开始
//5、获取总记录数
$count=$stmt->rowCount();
for($i=0;$i<$count;$i++){
echo$stmt->fetchColumn(0);
}
三、PDO的预处理
1、为什么需要预处理 sql语句一致的话,服务器带宽浪费 预处理语句在sql语句与形式相同的情况下,只有参数不同所采用的一种数据处理机制,极大减少带宽的浪费 可以防止sql注入 2、mysql中的预处理[PHP] 纯文本查看 复制代码 //1、创建预处理语句
prepare 预处理指令 from sql语句(insert/delete/update/select)
//2、设置参数
set @value= value;
//3、执行预处理
execute 预处理指令 using @value(多个用,隔开);
3、PDO扩展中的预处理功能要学到的知识点: PDOStatementPDO::prepare(string $statement):定义预处理语句 boolPDOStatement::execute([array $input_parameters]):执行预处理语句 示例代码: [PHP] 纯文本查看 复制代码 $sql = ‘insert into table values(null,:name,:pass,:time)’;
//4、定义预处理语句
$stmt=$pdo->prepare($sql);
//5、使用execute实现参数传递
$data=array(
‘:name’=>’’,
‘:pass’=>’’,
‘:time’=>’’,
);
$stmt->excute($data);
如果使用问号:
$data=array(
1=>’’,
2=>’’
);
问题:在预处理功能使用时,应该使用文本标识还是使用问号呢? 答:没有严格规定,都可以使用,唯一不同是语法不同 ①如果使用文本标识,那么数据传递时,要求数组是关联数组, ②如果使用问号标识,那么数据传递时,要求数组是一个索引数组,索引从0开始
4、使用bindParam实现参数绑定(推荐)bool bindParam(mixed $parameter,mixed&$variable) ①绑定变量的名到占位符,变量被执行时候更改会改变 ②如果使用问号标识,那么在绑定的时候索引是从1开始的 bindValue() 绑定变量的值到占位符 bindColumn() 绑定一列到一个 PHP 变量 主要实现对参数的绑定 参数说明: $parameter要绑定的参数 $variable 要设置的参数值,按引用传递 四、PDO中的事务处理1、什么是事务处理 处理操作量大,复杂度高的数据,比如,银行转账,购物车下单 2、事务处理的应用场景 两人借钱,银行转账,细节步骤说明 所谓的事务处理就是要么交易成功,则提交,要么交易失败,则回滚! 3、mysql中的事务处理IM:mysql必须引擎为InnoDB ①开启事务 1)标准事务:start transaction; 当提交或回滚一个事务之后,事务结束,接下来的操作不在事务之中 2)语句事务:setautocommit=0; 当提交或回滚一个事务之后,事务不会终止,后面的操作仍处于事务之中 示例代码:(理解事务的过程) ②提交事务 commit; ③回滚事务 rollback; 4、PDO中的事务处理功能[PHP] 纯文本查看 复制代码 ①开启事务 boolPDO::beginTtransaction(void)
$pdo->beginTransaction();
②提交事务 bool PDO::commit(void)
$pdo->commit();
③回滚事务 bool pdo::roolback(void)
$pdo->roolback();
五、PDO中的异常类1、什么是异常 在指定的错误(异常)情况发生时候改变脚本的正常流程,这种情况称为异常。 2、异常发生时的执行流程 ①当前代码被保存 ②代码被切换到预定义的异常处理函数 ③或者重新开始执行,或者终止脚本执行,或从代码另外的位置继续执行脚本 3、PDO中的异常捕获try{ //手工抛出异常 throw new PDOExeception(‘错误的文本信息’,’错误号’); }catch(PDOExeception $e){ }
错误号 getCode() 错误行号: getLine(); 错误文本信息 getMessage(); 示例代码:略 4、PDO中的逻辑错误 手工抛出异常 throw new PDOException(‘错误的文本信息’,’错误号’);
5、使用PDO属性实现捕获逻辑异常bool PDO::setAttribute(int $attribute,mixed$value); 设置属性 $attribute 设置的属性 $value 设置的属性值 PDO::ATTR_ERRMODE: PDO异常级别 ①PDO::ERRMODE_SILENT:常规错误 默认 ②PDO::ERRMODE_WARNING:警告错误 ③PDO::ERRMODE_EXCEPTION:异常错误 示例代码: 六、PDO中属性的获取与设置1、属性的获取与设置设置:set 获取:get 属性:attribute bool PDO::setAttribute(int $attribute,mixed$value);设置属性 bool PDO::getAttribute(int $attribute); 获取属性 2、PDO中常用的属性[PHP] 纯文本查看 复制代码 PDO::ATTR_ERRMODE 已经说明
①PDO::ATTR_AUTOCOMMIT 语句事务,值0,1
自动提交,常用于事务处理,
$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
②PDO::ATTR_CASE
结果集大小写,
参数值(PDO::CASE_LOWER,PDO::CASE_UPPER,PDO::NATURAL 正常返回)
$pdo->getAttribute(PDO::CASE_UPPER);
③PDO::ATTR_PERSISTENT 长连接
短连接:连接à发送sql语句à执行sql语句à关闭
长连接:连接àa发送sql语句à执行sql语句àb发送sql语句à执行sql语句…
|