PDO 读操作|学习笔记

简介: 快速学习 PDO 读操作

开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第三阶段PDO 读操作】学习笔记,与课程紧密联系,让用户快速学习知识。  

课程地址:https://developer.aliyun.com/learning/course/713/detail/12735


PDO 读操作

 

内容介绍:

一、介绍

二、步骤

三、小结

 

一、介绍

1、目标:

掌握PDO对查询操作的实现,如何利用PDO将数据库中的数据查询出来,理解类中产生其他类对象的原理(本质上已经学习过:工厂模式就是调用方法来产生其他类的对象),实现数据库的查询操作。

2、概念:

查询操作:通过执行SQL指令后从数据库获得相应的数据,然后对数据加工变成PHP可识别的格式(数组可以,对象也可以,但是若是对象中的数据没有显出则不能操作)

(1)PDO:.query()方法只能执行SQL,并不能直接解析结果,返回一个PDOStatement类对象(如果成功就返回PDOStatement类对象,如果错误就返回false)

(2)PDOStatement::fetch()系列方法从对象中实现数据获取(拿到一个PDOStatement类对象,PDOStatement类对象下有一些fetch()方法可以获取数据)

有两个常用方法:

fetch:获取一条记录

fetchAll:获取全部记录,不需要再循环获取,能够自己提供方法。

在fetch中有一个参数:

(3)FETCH_STYLE:通过常量设计的方式实现获取数据的不同效果。从数据库中获取数据时获取表可以是索引数组或关联数组,甚至为对象。所以FETCH_STYLE可以控制拿到数据的模式。

 

二、步骤

1、初始化数据库连接

2、组织SQL指令并通过PDO:.query()执行

3、检查可能出现的SQL语法错误

4、通过PDOStatement类按照具体需求实现数据解析

 

三、示例

1、查询是建立在连接之上,因此需要使用到前面封装的初始化功能

function pdo_init(){

$pdo = @new PDO( 'mysql: host=localhost;port=3306; dbname=db_2' , ' root' , ' root');

if( ! $pdo){

exit('数据库连接认证失败! ');

}

#返回得到的PDO对象

return $pdo;

}

2、查询的SQL也是可能出现问题的部分,因此同样需要进行错误检查︰另外PDO查询使用的是PDO:.query()方法实现。

整个代码与之前exec部分相似,内容也相同,只是调用方法不同。所以此时解决方法:编写统一方法判定是写操作还是查操作,然后调用不同的方法,该方法对于用户比较简单,用户不需要考虑sql该调用哪种方法,可以直接调用执行;另一种方式是写操作与读操作分开,exec执行写操作,query执行查询操作返回对象。为了不改动先前代码,应该在此处增加一个方法进行query查询。

function pdo_query($pdo, $sql){

#调用PDO对象的方法执行读SQL

$stmt = $pdo->query(ssq1);

#错误判定

if(false === $stmt){

#取出错误细信息

echo 'SQL错误:
';

echo '错误代码为: ' . $pdo->errorCode( . '
';

echo '错误原因为: ’ . $pdo->errorInfo()[2];

exit;

#返回执行结果:PDOStatement类对象

return $stmt;

}

#取出错误细信息

演示:

在33pdo_func.php代码中继续输入

#封装执行:读操作(SQL执行和语法错误检查)

粘贴上述代码

再来验证获取得到的是一个对象,输入

$pdo = pdo_init();

$stmt = pdo_query($pdo,’select * from t_28’);

var_dump($stmt);

访问网址33pdo_func.php结果显示为一个PDOStatement对象:

object(PDOStatement)#2(1){[“queryString”]=>string(18)”select * from t_28”}

说明SQL没有语法问题。但是此时获取到的对象中没有数据,不能直接通过对象进行php读取,因此需要进行解析,将对象调用相应的方法实现解析。

image.png

3、此时查询出来的结果是一个对象,不能提供任何PHP可访问的数据结果,还需要对结果进行处理。而我们查询数据的时候通常是两种操作:根据具体条件获取一条记录或者多条记录(根据用户需求,用户SQL查一条则查一条),因此返回的数据是不同的。解决方案也有多种方式:

①创建多个函数来实现不同效果

②创建一个函数,但是通过参数来控制实现不同效果

#数据解析

function pdo_get($stmt, $only = true){

#$stmt是PDO查询得到的对象,$only代表默认只获取一条记录

#安全判定

if(!$stmt instanceof PDOStatement) return false;

# PDOStatement类中提供了两种方法分别去获取一条和多条记录

#判定条件

if($only){

#获取一条记录PDOStatement::fetch():返回一维数组

return $stmt->fetch();

}else{

#获取多条记录PDOStatement ::fetchAll():返回二维数组,一个维度代表一条记录

return $stmt->fetchAll();

演示:

粘贴在代码$pdo = pdo_init();

$stmt = pdo_query($pdo,’select * from t_28’);

var_dump($stmt);上方

删除掉代码var_dump($stmt);

输入var_dump(pdo_get($stmt));

刷新访问页面结果显示:

array(6){[“id”]=>string(1)”2”[0]=>string(1)”2”[“stu_no”]=>string(8)”00000002”[1]=>string(8)”00000002”[“stu_name”]=>string(4)”Jack”[2]=>string(4)”Jack”}

结果是一个关联索引并行的数组。

数据库中select * from t_28

原本只有3个字段,现在有6个字段。

如果需要获取多条记录,修改代码var_dump(pdo_get($stmt,false));

访问页面结果显示如图:

image.png

得到的是一个对应的二维数组,查出了5条记录,每个记录都是数组,同样有关联和索引。

调用方法拿到数组后就可以进行显示数据。删除测试代码:

$pdo = pdo_init();

$stmt = pdo_query($pdo,’select * from t_28’);

var_dump(pdo_get($stmt,false));

以上完成了PDO封装函数实现写操作。

4、此时从功能上来讲,只要顺序调用以上几个方法即可完成

$pdo = pdo_init();  #初始化

#查询

$sql = 'select * from t_40 where条件';

$stmt = pdo_query($pdo , $sql);

#获取一条记录

$row = pdo_get($stmt);

#获取多条记录

$rows = pdo_get($stmt,false);

演示:

接着创建新文件35pdo_read.php实现封装函数实现读操作,编辑代码:

#PDO封装函数实现读操作

#引入函数文件

include ‘33pdo_func.php’;

#连接认证

$pdo = pdo_init();

#准备SQL

$sql = “select * from t_40”;

#执行SQL

$stmt = pdo_query($pdo,$sql);

#解析结果

$row = pdo_get($stmt);

var_dump($row);

访问网址35pdo_read.php,结果显示

array(10) ( ["id”]=> string(1)"1”[0]=> string(1)"1”[“name"=> string(6)"鸣人”[1]=> string(6)"鸣人”[“gender”]=> string(3)"男" [2]=>string(3)"男"[“age”]=>string(2) "21”[3]=> string(2) "21”[“class_name"]=> string(10)"木叶1班”[4]=>string(10)"木叶1班"}

拿到数据,若是想要拿到多条修改代码$row = pdo_get($stmt,false);

刷新页面结果显示:

image.png

5、fetch系列方法默认返回的数据是重复的:数据的索引方式和关联方式各出现一次,而实际在进行开发数据展示时通常是通过数据表字段名字作为下标进行数据查看,所以此时可以通过设定fetch系列的条件fetch_style来实现

mixed PDOStatement ::([int $fetch_style[, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int

$fetch_stylet, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset =0 ]]])

//$fetch_style是有默认值的参数,代表一个模式:显示方式。非常多参数都是通过PDO的类常量控制。

从一个PDOStatement对象相关的结果集中获取下一行。fetch_style参数决定POD如何返回行。

fetch_style:

控制下一行如何返回给调用者。此值必须是PDO:FETCH_*系列常量中的一个,缺省为PDO::ATTR_DEFAULT_FETCH_MODE的值(默认为PDO:.FETCH_BOTH ).

PDO:FETCH_ASSOC:返回一个索引为结果集列名的数组。字段名作为下标的关联数组

PDO::FETCH_BOTH(默认)︰返回一个索引为结果集列名和以0开始的列号的数组。

PDO:FETCH_BOUND:返回TRUE,并分配结果集中的列值给PDOStatement::bindColumn()方法绑定的PHP变量。

PD0..FETCH_CLASS:返回一个请求类的新实例,映射结果集中的列名到类中对应的属性.

想要使用fetch_style可以根据系统提供的方式来修改pdo_get函数,在后面再增加一个默认参数即可。

function pdo_get($stmt , $only = true,$fetch_style = PDO::FETCH_ASSOC){

# fetch_style默认使用关联数组返回

#判定条件

if($only){

#获取一条记录PDOstatement: :fetch():返回一维数组

return $stmt->fetch($fetch_style);

}else{

#获取多条记录PDOStatement::fetchAll():返回二维数组,一个维度代表一条记录

return $stmt->fetchAll($fetch_style);

}

在代码33pdo_func.php中找到代码function pdo_get($stmt,$only=true){}

修改为

function pdo_get($stmt,$only=true,$fetch_style = PDO::FETCH_ASSOC){}

代码不受影响,需要将fetch_style放到return $stmt->fetch()中改变fetch模式,即

return $stmt->fetch(fetch_style);

return $stmt->fetchAll($fetch_style);

在读操作中调用的就为该函数,所以此时并没有传到后面,为默认。

现在每一条记录都有10个字段,再刷新页面查看结果:

image.png每一个记录中有5个字段,并且只有字段对应的值,没有索引对应的值的元素存在。

理论上数据拿到的越全,解析的方式越多越方便,但是意味着效率更低。如果明确就是关联数组,则不需要再获取其它。

以上就介绍了fetch模式。若想要了解更多可以再PHP Manual中找到fetch_style,查看更多具体说明,例如:

PDO:FETCH_NUM:返回一个索引为以0开始的结果集列号的数组

PDOFETCH_OBJ:返回一个属性名对应结果集列名的匿名对象

PDOFETCH_CLASS:返回一个请求类的新实例,映射结果集中的列名到类中对应的属性名。如果fetch_style包含PDO:FETCH_CLASSTYPE(例如: PDO:FETCH_CLASS / PDO:FETCH_CLASSTYPE),则类名由第一列的值决定。

但是使用最多的为:

PDO:FETCH_ASSOC:返回一个索引为结果集列名的数组

以上就是读操作关于模式的处理,保证数据的有效性,减少服务器压力。

 

三、小结

1、查询操作是通过PDO:query()执行查询SQL得到PDOStatement对象,然后PDOStatement对象下有一系列fetch方法可以实现数据查询,得到PHP可以识别的数组数据。(数据可以进行控制,需要数组则为数组,需要对象则为对象:对象相当于查询出的结果变为元素,属性也为键值对,也有名字与值,相当于拿到字段中的名字做属性名,字段取出对应值做属性值。)

2、PDO实现查询通常也需要进行二次封装(不做二次封装会导致在操作中编写多次。若是数据库中信息进行修改,写操作与读操作都需要进行修改),保证SQL执行安全,也方便用户获取目标数据。

相关文章
|
存储 缓存 监控
一文读懂分布式架构知识体系(内含超全核心知识大图)
7月9日 19:00-21:30 阿里云开发者社区首场“Offer 5000”直播开启!15位团队技术大牛在线招人,更有《阿里云技术面试红宝书》助你拿下Offer!马上投递简历:https://developer.aliyun.com/special/offerday01
19309 0
|
12月前
|
SQL 关系型数据库 数据库连接
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
本文介绍了PHP中PDO(PHP Data Objects)扩展的基本概念和使用方法。内容包括PDO类和PDOStatement类的介绍,PDO的简单使用,预定义占位符的使用方法,以及PDOStatement对象的使用。文章还讨论了绑定预定义占位符参数的不同形式,即bindValue和bindParam的区别。通过具体示例,展示了如何使用PDO进行数据库连接、数据查询、数据插入等操作。
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
|
SQL API 数据库
揭秘Ruby数据库交互的黑科技!ActiveRecord模式:为何它让数据库操作如此“随心所欲”?
【8月更文挑战第31天】在Ruby编程中,与数据库交互至关重要。ActiveRecord作为Ruby on Rails框架的核心组件,凭借其简洁高效的特点,成为处理数据库操作的首选。本文深入探讨ActiveRecord模式,介绍其如何简化数据库交互,并通过示例代码展示具体应用。ActiveRecord是一种ORM框架,将数据库表映射为Ruby类,使开发者能通过操作对象间接管理数据库记录。其核心特性包括模型定义、关联管理、数据验证、事务处理及强大的查询接口。通过示例代码,展示了如何定义模型、创建记录、查询记录及处理关联,突显了ActiveRecord在简化数据库操作方面的优势。
258 0
|
8月前
|
人工智能 监控 测试技术
阿里云磐久服务器稳定性实践之路
阿里云服务器质量智能管理体系聚焦自研服务器硬件层面的极致优化,应对高并发交付、短稳定性周期、早问题发现和快修复四大挑战。通过“三个重构”(质量标准、开发流程、交付模式)、“六个归一”(架构、硬件、软件、测试、部件、制造)策略,实现芯片、整机和云同步发布,确保快速稳定上量。此外,全场景测试体系与智能预警、分析、修复系统协同工作,保障服务器在萌芽阶段发现问题并及时解决,提升整体质量水平。未来,阿里云将继续深化大数据驱动的质量管理,推动服务器行业硬件质量的持续进步。
|
11月前
【LVGL快速入门】LVGL开源框架入门教程之框架使用(三)
【LVGL快速入门】LVGL开源框架入门教程之框架使用(三)
472 1
【LVGL快速入门】LVGL开源框架入门教程之框架使用(三)
|
10月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
217 3
|
10月前
|
SQL PHP 数据库
19 PHP如何利用PDO获取结果集
路老师在知乎上分享了关于PHP语言的知识,帮助大家入门并深入了解PHP。本文介绍了PDO中获取结果集的三种方法:`fetch()`、`fetchAll()` 和 `fetchColumn()`,并通过具体案例展示了如何使用这些方法从数据库中获取数据并展示在网页上。
349 5
|
缓存 并行计算 算法
Vulkan 围炉夜话2
Vulkan 围炉夜话
150 13
|
Linux
如何在 Linux 中递归更改文件的权限?
【5月更文挑战第10天】
439 3
|
PHP 开发者
深入理解PHP7的返回类型声明
【5月更文挑战第27天】 在PHP7中,引入了一项新的语言特性——返回类型声明。这一功能允许开发者在函数定义时明确指定函数应返回的数据类型,从而提升代码的可读性和健壮性。本文将深入探讨返回类型声明的概念、用法以及其对现有PHP项目的影响,旨在为PHP开发者提供一份详细的技术解析和实践指南。