开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第三阶段:封装 PDO(写操作)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/713/detail/12746
封装 PDO(写操作)
对外操作需要进行SQL执行:写操作和读操作,因此继续实现
1、增加写SQL操作方法:对外调用
#写操作
//公有方法外部需要传入sql进入
public function my_exec(Sql){
try{
#调用执行:成功返回,错误捕捉
return $this->pdo->exec($sql);
}catch(PDOException Se){
return Sthis->my_exception(Se);
}
}
这条sql有语法错误,需要用异常来进行捕捉。因为pdo的执行会得到一个行数,所以可以把正确的结果直接返回,而如果有错误就捕捉到,捕捉到之后调用自己的方法处理,处理完成之后再把结果告知。
产生错误,给你一个flase,想要看错误就应该进入到
Sthis->error['file']=Se->getFile();
Sthis->error['line']=Se->getLine();
Sthis->error['error']=Se->getMessage();
#返回false,让外部处理
return false;
}
里面去访问属性,查看具体错误信息。此过程上是写操作。上述封装做好后,写操作将变得比较容易,直接调用即可完成,不需要写非常多的代码,关键需要清楚如何捕捉异常,如何调用自己的方法即可。
此地方好像用到的全部是异常捕捉,万一用户想要一种静默模式来处理该如何。所以其实我们的代码是存在问题的。代码并没有考虑太全面,其实说白了就是我想做这个类,我希望用异常处理,是一种写死的写法如果说不想用这种想法,理论上来讲还要做很多判定,每次在可能需要出错的情况下,我们就要判定用户是否设置模式或者选择用户真正模式进行做,可以做3套方法实现或每次进行判定。
#控制属性(增加异常处理模式)
if(!isset($dirvers[PDO:ATTR_ERRMODE]))
$dirvers [PDO:ATTR_ERRMODE]PDO:ERRMODE_EXCEPTION;
#连接认证
try{
#
增加错误抑制符防止意外
$this->pdo @new PDO($type.'host='.$host ';port='.$port.'
dbname='.
$dbname ';charset='.$charset,$user,$pass,$drivers
);
}catch(PDOException $e){
#属性记录错误
/*$this->error['file']$e->getFile();
$this->error['line']$e->getLine();
$this->error['error']=$e->getMessage();
#返回false,让外部处理
return false;*/
#调用异常处理方法实现异常处理
$this->my_exception($e); }
}
异常采用异常模式处理,不是异常采用静默模式处理,警告模式就采用警告模式处理,警告模式和异常模式写就可以不用管。
只有异常跟非异常每次做之前都要做一次判定,比如此地方我要判定,如果确定了模式是异常,就调用异常代码,如果不是就不用异常代码来写。写操作并没有做完,因为写操作可能需要额外对外提供自增长ID
2、完善写操作:增加对外提供自增长id方法
#获取自增长ID
public function my_last_insert_id(){
return Sthis->pdo->lastInsertId();
增加方法获取自增长id
需要注意:
凡是去操作,去调用pdo的时候,其实都是先用属性访问到pdo对象,再去调用下面的方法来实现,但是很明显代码其实有可能出问题,所以捕捉异常。
如何捕捉(因为拿自增长id可能不会得到)拿不到的话可以换一套逻辑比如判定
#获取自增长ID
public function my_last_insert_id(){
#捕捉异常
try{
$id =$this->pdo->lastInsertId();
#主动抛出异常
if(I$id)throw new PDOException('自增长Id不存在!');
#成功
return $id;
}catch(PDOException $e){
return $this->my_exception($e);
如果不存在应该主动抛出异常,拿不到后续代码会出现问题,
提示自增长ID不存在,请检查sql,成功return id 上述代码不执行,抓住错误信息后续代码调用。调用系统写好的方法进行处理。以后要进行处理,只需要统一处理。这样就完成了写操作的受影响行数以及自增长ID的实现。
此代码替换掉前面代码的内容也可以不进行修改。在代码中动用手脚实现最后的效果即可。