开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第一阶段:封装数据库操作类(读操作)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/711/detail/12682
封装数据库操作类(读操作)
内容介绍:
一、读取一条记录简介
二、读取一条记录代码详解及测试
三、读取多条记录简介
四、读取多条记录代码详解及测试
一、读取一条记录简介
1.读操作可以将数据分为两种:
(1)读取一条记录
(2)读取多条记录
2.读取操作:读取一条记录,无论何种操作都利用 check() 进行 SQL 执行和错误检查。读取一条数据可能需要获取当前查询结果的列数(该记录的字段数),增加属性保留
二、读取一条记录代码详解
1. 方法一:
#属性:记录查询结果中的列数
Public $columns = 0;
//默认为0列;完成这条数据的读取操作。细节在于是否要取 $columns 里的列数,如果不需要,则该行代码和读取记录列数可去除
#读操作:一条记录
pullic function read_one($sql){
$res = $this->check($sl1);
//读取一条记录执行 SQL 错误检查
#读取记录列数
$this->columns = @mysqli_ field_ count($this->1ink);
//检查结束之后利用 mysqli_ field_ count() 从中取出列数;观察 $res 是否为真,若为真,则 check() 将会返回一个结果及对象,因为本课讲的是查,读取数据
#判定结果,进行加工:成功读取一条记录,失败返回空数组
return $res ? mysqli_ _fetch_ assoc($res) : [];
//读取数据获取了该对象,如果有记录将取出一条记录,否则将会返回空数组。空数组代表没有数据;为了让外部能够获取到有可能是错误信息,可以直接返回 $res ,因为 $res 可能是 false ,所以空数组或者返回错误信息均可,错误信息即为 false 。
}
2. 方法二
#读操作:一条记录
public $columns = 0;
//增加属性 $columns(是否等于0都可以,等于0代表刚开始列数为0)
pullic function read_one($sql){
//每读取一条都执行 SQL 错误检查;得到的结果为执行的最终过程,如果细致做,成功的时候有自增长对应的列数,可先判定(该判定可与方法一逻辑不同,下列数据表示即使没有数据取出也为0条)
$res = $this->check($sql);
#判定结果
if($res){
#说明有结果
$this->columns = @mysqli_ field_ count($this->link);
//读取记录列数;@错误抑制符,避免内部细节出错;从 mysqli_ field_ count()中取出列数,放至属性中保存,所以应增加属性 columns;成功读取一条记录
}
#没有结果
return false;
//return $res,因为 $res 也是 false ,但使用 return false 比 return $res 快,所以自行决断;完成读取一条记录
}
}
3. 测试
(1)代码:
#接上述代码(类外测试)
$s1 = new SqL(); #使用默认数据库信息
$db =array(
'host' => ' 192.168.0.1',
‘user ' => 'admin”,
‘pass’=>’admin ' ,
‘dbname' => ' T aobao '
);
$s2 = new SqL ($db) ;#使用外部数据库信息
$s1- >connect();
$s1->charset();
$res = $s1->read_one(‘desc t_40');
echo $s1->errno,$s1->error ;
Var_dump($res) #观察有哪些字段
(2)讲解:
添加代码$res = $s1->read_one(‘desc t_40'); 观察读取是否能够实现,如果能实现则会显示一个数组$res,
添加代码Var_dump($res)
“Field”取出了其中一条“id”字段(不完整, id 只是其中一条字段),但说明数据查询已经正确无误,只要 SQL 正确,就能实现操作
三、读取多条记录简介
读取操作:读取多条记录:可能外部需要知道查询结果的总记录数以及查询结果的列数(属性已定义)
在学习的过程中会发现属性的增加
四、读取多条记录代码详解及测试
1.代码
#读取多条记录,在学习的过程中会发现属性的增加
#属性:记录查询结果的行数
public $rows = 0;
//读操作;使用的方法由外部选择,下述只负责读取多条记录
public function read_a11($sql){
$res = $this->check($sql);
//执行过程与执行一条类似;执行 SQL 错误检查,使用 check() 检查有无语法问题并执行
#如果有问题,错误检查
#判定结果,进行加工
if(!$res) return $res;
//如果没有结果(错误),$res 是 false,就直 接 return 返回 false (错误),否则说明有结果;完成多维数组:将总记录数提取出,然后把它循环遍历放至 $list[] 里,最后返回 $list[];如果外部得到 false,则应该检查 errno 和 error ,因为 false 是 check()所传递的,所以 check() 里已经记录了错误信息
#记录结果数量
#结果正确
$this->rows = @mysqli_num_rows($res);
$this->columns =@mysqli_field_count($this->link);
//结果正确,取出行数(取行函数:mysqli_num_rows(),对 $ros 结果及对象取行,而非从链接取行)和列数(取列函数 mysqli_field_count());为保证安全可加入@;上述俩行代码只取出了辅助性的东西,核心是循环取出所有记录
#循环取出所有记录:形成二维数组
$list = [];
while($row = my
sqli_fetch_assoc($res)) $list[] = $row;
//根据需求解析数据;while()表循环,从 mysqli_fetch_assoc()(结果及对象)中取记录,放至二维数组 list 中;因为代码只有一行,所以未写对应循环和大括号,只需要保持代码逻辑正确即可省略大括号
#所有记录都存入 list 后,返回结果
return $list;
}
}
2. 测试:
(1)代码:
#接上述代码(类外测试)
$s1 = new SqL(); #使用默认数据库信息
$db =array(
'host' => ' 192.168.0.1',
‘user ' => 'admin”,
‘pass’=>’admin ' ,
‘dbname' => ' T aobao '
);
$s2 = new SqL ($db) ;#使用外部数据库信息
$s1- >connect();
$s1->charset();
$res = $s1->read_all(‘desc t_40');
echo $s1->errno,$s1->error ;
#上三行代码为受影响的行数,并在下述代码中打印出
echo $s1-> insert_ id();
Var_dump($res) #观察有哪些字段
(2)讲解:
读取操作:读取多条记录的内容结束。
测试:发现 read_one 和 read_all (所有)本质是名字不同。不考虑内部实现
所以 $res = $s1->read_one(‘desc t_40');改为 $res = $s1->read_all(‘desc t_40');
Array(5):说明有5个对应数据
五个字段:第一个:id,第二个:name,第三个:gender,第四个:age,第五个:classname
因为有五个字段即可证明查操作无问题,所以可以测试写操作
加入代码$res = $s1->write("insert into t_40 values(null, 'name ','男',18,'classname ')");
//字段一:null;字段二:name;字段三:男(因为gender中只有男,女,保密);字段四:18(age);字段五:classname (班级名)
$res = $s1->write("insert into t_40 values(null, 'name ','男',18,'classname ')");
改错代码( SQL 语句出错,观察是否可执行):$res = $s1->write("insertinto t_40 values(null, 'name ','男',18,'classname ')");
执行结果告知:
将错误信息输出,错误点为 insertinto
将代码改正确:$res = $s1->write("insert into t_40 values(null, 'name ','男',18,'classname ')");
因为代码正常情况下为自增长id,所以需要增加代码 echo $s1-> insert_ id();
Id 为15,说明 id 已经获取
若有疑虑可再次刷新发现 id 为16,所以说明自增长 id 可以得到
此时就完成了整个对应内容的书写,基本上增删改查的功能需求都结束了。
当然业务并没有很完整,在完成本课内容之后,可以先实现测试的功能性,在操作的过程中已经完成了实现测试的功能性。