开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第三阶段:PDO 手册查阅】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/713/detail/12734
PDO 写操作
内容介绍:
一、前言
二、步骤
三、示例
四、小结
一、前言
概念:写操作:即利用PDO实现数据库增删改操作
·操作过程中要考虑到SQL本身可能出现的错误处理,以及对结果的操作处理
·很多代码的执行都需要进行错误检查,为了以后方便可以对代码进行封装处理。先做一层简单的面向过程的封装函数,再进行面向对象的封装。
二、步骤
1、初始化连接资源
2、组织SQL并执行,因为初始化资源时就可以完成大部分事情
3、检查SQL执行结果,判定语法错误
4、返回受影响的行数(必要时返回自增长ID)
三、示例
1、初始化PDO,每次操作都需要用到PDO实例化:封装执行
# 初始化PDO:增加错误抑制符,一致在初始化过程可能出现的错误(信息不对连接不上)
function pdo_init(){
$pdo = @new
PDO( 'mysql :host=localhost;port=3306; dbname=db_2 ; charset=utf8 ' , ' root ' , ' root');
if( ! $pdo){
exit('数据库连接认证失败! ’);
}
#返回得到的PDO对象
return $pdo;
}
简单封装就是将所有的操作都封装到内部针对当前的项目自用,并不是做成工具供他人使用。所以内容需要写死,有主机、端口、数据库名字、字符集。在该过程中针对结果进行返回,如果发生错误返回数据库连接认证失败! ,否则返回连接成功的对象。
演示:编辑文件33pdo_func.php
编辑代码:
<?php
#PDO封装
#封装初始化
function pdo_init(){
#实例化PDO对象
$pdo = new PDO(‘mysql:host=localhost;port=3306;dbname=db_2;charset=utf8’,’root’,’root’) ;
//需要三个参数,第一个为连接信息mysql,第二个为用户名第三个密码
#连接未必成功:需要判定
//没有实例化可以使用对象来判定
if(!$pdo){
exit(‘数据库连接失败!’);
}
#成功 将连接对象返回
return $pdo;
}
$pdo = pdo_init();
var_dump($pdo);
查看调用后是否可以拿到对象,访问网址33pdo_func.php
结果为object(PDO)#1{0}{}
说明当前操作成功。
2、SQL通常应该是外部传入,外部需要的只是结果,不考虑过程,所以在实际开发时要考虑二次封装。即外部传入SQL,内部执行并控制错误,最终返回结果
#封装执行:函数封装需要传入PDO对象(也可以在函数内部实例化对象)
function pdo_exec($pdo , $sql){
#调用PDO对象的方法执行写SQL
$res = Spdo->exec($sql);
#错误判定
if(false == $res){
#取出错误细信息:实际开发是将错误信息记录到系统日志中,返回false
echo 'SQL错误: <br/> ';
echo '错误代码为:' . $pdo->errorCode() . '<br/> ';
echo '错误原因为:’ . $pdo->errorInfo( )[2];
exit;
}
#返回执行结果:受影响的行数(直接是受影响的行数)
return $res;
}
演示:
复制代码添加在$pdo = pdo_init();
var_dump($pdo);
上方
已经验证过对象是否打印成功,接着测试:
注释掉var_dump($pdo);
输入
$res = $pdo_exec($pdo,’update t_28 set stu_name=”Jack” where id = 2’ )
先来查看t_28内容,如图
要求取出id为2的名字修改为另一个。
查看结果是否成功,输入
var_dump($res);
访问页面结果显示int(1),再次执行结果为int(0)。没有报错但是结果为0是因为已经更新过一次再更新没有内容已经为Jack。在判定结果时使用===,if(false == $res),如果不使用===,返回结果为0时就会变为false。
以上验证成功。封装成功后删除掉测试内容:
$pdo = pdo_init();
#var_dump($pdo);
$res = $pdo_exec($pdo,’update t_28 set stu_name=”Jack” where id = 2’ )
var_dump($res);
3、具体实现写操作
#引入文件:封装的PDO文件
include 'pdo. php ';
#假设所有封装都放到了pdo .php中
#初始化
$pdo = pdo_init();
#组织要执行的SQL
$sql = 'delete from t_29';
$res = pdo_exec($pdo ,$sql);
# 结果使用
echo '本次操作共实现数据库操作: '. $res .'条记录! ';
即调用初始化得到对象,写好对应代码,再调用函数执行就可以拿到操作。
演示:
新建文件34pdo_write.php
编辑代码:
<?php
#PDO封装成函数的写操作
#引入文件:封装的PDO文件
include '_33pdo_func. php ';
#假设所有封装都放到了pdo .php中
#初始化
$pdo = pdo_init();
#组织要执行的SQL
$sql = 'delete from t_29' limit 1;
//确定可以删除一条记录,删除完成后调用下述方法执行SQL指令,之后显示操作了多少条记录
$res = pdo_exec($pdo ,$sql);
# 结果使用
echo '本次操作共实现数据库操作: '. $res .'条记录! ';
以上就完成,所以封装使得后续工作变得简便,后续只需要调用封装好的内容即可。
访问网址34pdo_write.php结果显示
本次操作共实现数据库操作:1条记录!
若再来删除,修改代码为$sql = 'delete from t_29 where id =1’;
此时数据库中并没有id为1的记录,所以应该提示为0。刷新网页进行访问结果显示:
本次操作共实现数据库操作:0条记录!
因为记录中没有id=1的记录,但是此时SQL指令并没有语法错误,所以不会报错。但是如果出现语法错误就会报错。
以上是基本的写操作然后返回受影响的行数。
注意:一般写操作都是受影响行数,但是如果是插入操作,有时候需要新增记录的自增长ID,可以通过PDO::lastinsertld()来获取。PDO::lastinsertld()是返回最后插入行的ID或序列值。
#接上述代码
$id = Spdo->lastInsertId();#
实际开发也应封装echo '新增成功!新增的ID为: ' . $id;
演示:
注释掉$sql = 'delete from t_29 where id =1’;
输入$sql = “insert into t_29 values(null,’username’,’password’)”;
再在最后输入
#新增获取自增长ID
echo ‘当前新增操作的自增长id为:’ .$pdo->lastInsertId();
//$pdo对象已经在前面拿到,可以将$pdo->lastInsertId()封装成函数。此处采取直接调用函数。
刷新访问页面结果显示:
本次操作共实现数据库操作:1条记录!当前新增操作的自增长id为:14
在数据库中查找该记录,
结果增加了id为14的记录。
以上就是新增记录的实现。写操作受影响行数,新增如果要获取字段id调用方法PDO::lastinsertld()
四、小结
1、实际使用PDO的时候,都会进行二次封装,因为PDO的操作有很多本身不够完善。
在项目中有很多地方需要用到PDO来实现数据库操作,如果每次都实例化再进行SQL检查就会存在很多重复代码,封装就可以让重复变得简单。一次维护,到处可用。
2、PDO类可以独立完成写操作功能,而不需要使用其他两个工具类
3、PDO的写操作其实本质要注意的是执行SQL时可能出现的错误处理。
实例化通常不会出现错误
4、写操作中唯一不同的是插入操作,因为可能需要获取自增长ID,此时需要多一个步骤(功能)
以上就实现PDO来完成写操作。