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来完成写操作。

相关文章
|
人工智能 并行计算 PyTorch
【Hello AI】手动安装AIACC-Inference(AIACC推理加速)Torch版
AIACC-Inference(AIACC推理加速)支持优化基于Torch框架搭建的模型,能够显著提升推理性能。本文介绍如何手动安装AIACC-Inference(AIACC推理加速)Torch版并提供示例体验推理加速效果。
|
缓存 监控 前端开发
如何确保动态导入的模块被正确加载?
通过以上这些方法的综合运用,可以有效地确保动态导入的模块被正确加载,提高应用的稳定性、性能和用户体验。在实际开发过程中,要根据项目的具体情况和需求,灵活运用这些方法,并不断进行测试和优化。
315 4
|
12月前
|
人工智能 Java 数据处理
《Java 在开源 AI 框架中的中流砥柱角色》
Java 在开源人工智能框架中扮演着不可或缺的角色,凭借其“一次编写,到处运行”的特性、成熟的生态体系和强大的编程能力,广泛应用于数据处理、模型构建和部署集成等环节。它不仅提供了稳定的基础架构,还通过丰富的类库和工具支持高效的开发与维护,极大地促进了开源 AI 框架的繁荣发展和社区活跃度,为人工智能技术的应用和创新注入了强劲动力。
329 14
|
小程序 JavaScript 开发者
微信小程序分包的相关概念和使用
本文介绍了微信小程序分包的概念、优势、配置方法、加载规则、体积限制,以及独立分包和分包预下载的配置,旨在帮助开发者优化小程序的加载速度和开发效率。
|
10月前
|
存储 人工智能 监控
时序数据库 TDengine 化工新签约:存储降本一半,查询提速十倍
化工行业在数字化转型过程中面临数据接入复杂、实时性要求高、系统集成难度大等诸多挑战。福州力川数码科技有限公司科技依托深厚的行业积累,精准聚焦行业痛点,并携手 TDengine 提供高效解决方案。
203 0
|
算法 Python
群智能算法:【WOA】鲸鱼优化算法详细解读
本文详细解读了鲸鱼优化算法(WOA),这是一种受鲸鱼捕食行为启发的新兴群体智能优化算法,具有强大的全局搜索能力和快速收敛速度。文章分为五个部分,分别介绍了引言、算法原理、主要步骤、特点及Python代码实现。通过模拟鲸鱼的捕食行为,该算法能够在复杂的优化问题中找到全局最优解。
|
监控 Linux Shell
Linux命令ionice:优化磁盘I/O优先级
`ionice`是Linux工具,用于调整进程的磁盘I/O优先级,改善系统响应。它设置三种I/O调度类:Idle(低优先级),Best-effort(默认)和Real-time(高优先级)。通过 `-c` 和 `-n` 参数分别设定调度类和优先级。示例:`ionice -c3 -n7 command`(低优先级I/O)和`ionice -c2 -p 1234`(改变PID为1234的进程为Idle类)。使用时注意平衡系统资源,避免干扰其他任务,并结合`iostat`、`iotop`监控性能。
|
数据采集 机器学习/深度学习 人工智能
AI小分子药物发现的百科全书,康奈尔、剑桥、EPFL等研究者综述登Nature子刊
【7月更文挑战第12天】康奈尔、剑桥及EPFL科学家合作,详述AI在药物发现中的突破与挑战[^1]。AI现用于新化合物生成、现有药物优化及再利用,加速研发进程。尽管取得进展,可解释性不足、数据质量和伦理监管仍是待解难题。 [^1]: [论文链接](https://www.nature.com/articles/s42256-024-00843-5)
329 3
|
编译器 芯片
PROTEUS仿真软件的使用及存储器的设计
PROTEUS仿真软件的使用及存储器的设计
492 0
|
算法 索引
二分查找(二)
二分查找(二)