PDO 写操作|学习笔记

简介: 快速学习 PDO 写操作,利用PDO类完成一个完整的写操作实现,实现数据库的操作。

开发者学堂课程【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内容,如图

image.png要求取出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

在数据库中查找该记录,

image.png结果增加了id为14的记录。

以上就是新增记录的实现。写操作受影响行数,新增如果要获取字段id调用方法PDO::lastinsertld()

 

四、小结

1、实际使用PDO的时候,都会进行二次封装,因为PDO的操作有很多本身不够完善。

在项目中有很多地方需要用到PDO来实现数据库操作,如果每次都实例化再进行SQL检查就会存在很多重复代码,封装就可以让重复变得简单。一次维护,到处可用。

2、PDO类可以独立完成写操作功能,而不需要使用其他两个工具类

3、PDO的写操作其实本质要注意的是执行SQL时可能出现的错误处理。

实例化通常不会出现错误

4、写操作中唯一不同的是插入操作,因为可能需要获取自增长ID,此时需要多一个步骤(功能)

以上就实现PDO来完成写操作。

相关文章
|
存储 关系型数据库 MySQL
1.MySQL库的操作
1.MySQL库的操作
55 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL操作
MySQL操作
31 1
|
5月前
|
存储 关系型数据库 MySQL
【MYSQL】MYSQL操作库
【MYSQL】MYSQL操作库
53 0
|
5月前
|
关系型数据库 MySQL 数据库连接
【MySQL】库的操作
【MySQL】库的操作
|
11月前
|
关系型数据库 MySQL 数据库
【MySQL学习】MySQL表的增删改查操作2
【MySQL学习】MySQL表的增删改查操作
98 0
|
6月前
|
存储 SQL 关系型数据库
【MySQL】3. 库的操作
【MySQL】3. 库的操作
50 2
|
存储 SQL 关系型数据库
MySQL库的操作(一)
MySQL库的操作
91 0
|
11月前
|
关系型数据库 MySQL 数据库连接
【MySQL学习】MySQL库的操作
【MySQL学习】MySQL库的操作
135 0
|
SQL 存储 关系型数据库
库的操作【MySQL】
库的操作【MySQL】
83 0
|
关系型数据库 MySQL 数据库
MySQL相关操作
MySQL相关操作