相关文章:PHP的mysql扩展整理,操作数据库的实现过程分析  PHP PDO扩展整理,包括环境配置\基本增删改查\事务\预处理

介绍

mysqli是PHP程序与mysql数据库进行数据交互的桥梁,它支持面向过程和面向对象两种方式 .

面向过程方式

现在面向对象编程已经成为了主流,mysqli面向过程化的编程方式可能已经没有太多实用价值,但是通过面向对象的和面向过程两种方式实现同一段代码,对体会对象和过程两种编程思想还是很有意义,个人觉得这个比较十分有趣!

流程图:

实例:

<?php
header("content-type:text/html;charset:utf-8");
//第一步:创建数据库连接并选中要操作的具体数据库
$conObj =@mysqli_connect('localhost','root','root','test','3306');
if (mysqli_connect_errno()){
die("连接失败,错误信息如下".mysqli_connect_error);
} //第二步:设置字符集
mysqli_set_charset($conObj,'utf-8'); //第三步:执行sql语句
$sql = 'select* from `class`';
$res = mysqli_query($conObj,$sql); //第四步:取出查询结果
while($row = mysqli_fetch_assoc($res)){
echo '<pre>';
var_dump($row);
} //第五步:关闭结果集并释放数据库连接
mysqli_free($res);
mysqli_close($conObj);

与mysql方式的区别:

面向过程的mysqli与mysql方式相比大同小异,没有什么本质区别.无非就是每个函数的名字都要加上个i,connect()方法的参数值不同等等

了解面向过程方式的详细信息请点击:  PHP的mysql扩展整理,操作数据库的实现过程分析

面向对象方式

面向过程方式是直接动手操作数据库连接的

面向对象方式则是把所有需要的函数都放在MySQLi类中,MySQLi类的构造函数可以完成数据库连接的功能,实例化MySQLi类的同时,也就完成了数据库连接

MySQLi的构造方法和mysqli_connect()方法实现的功能完全相同:

$conObj =new MySQLi('localhost','root','root','test','3306');

完成实例化之后,直接调用MySQLi类封装的各种方法就可以完成对数据库的一系列操作

几乎每一个mysqli面向过程的函数都对应着MySQLi类里的一个成员方法,通过比较两个流程图就可以看出来:

实例:

<?php
header("content-type:text/html;charset:utf-8");
//第一步:创建数据库连接对象
$conObj =@new MySQLi('localhost','root','root','test','3306');
if ($conObj->connect_errno){
die("连接失败,错误信息如下".$conObj->connect_error);
} //第二步:设置字符集
$conObj ->set_charset('utf-8'); //第三步:执行sql
$sql = 'select* from `class`';
$res = $conObj->query($sql); //第四步:取出查询结果
while($row =$res->fetch_assoc()){
echo '<pre>';
var_dump($row);
} //第六步:释放结果集,关闭连接
$res->free();
$conObj->close();

结果集处理

fetch_all() 抓取所有的结果行并且以关联数据,数值索引数组,或者两者皆有的方式返回结果集。
fetch_array() 以一个关联数组,数值索引数组,或者两者皆有的方式抓取一行结果。
fetch_object() 以对象返回结果集的当前行。
fetch_row() 以枚举数组方式返回一行结果
fetch_assoc() 以一个关联数组方式抓取一行结果。
fetch_field_direct() 以对象返回结果集中单字段的元数据。
fetch_field() 以对象返回结果集中的列信息。
fetch_fields() 以对象数组返回代表结果集中的列信息。

事务

介绍:

一组数据库命令一起执行,只要有一条不被执行,其他命令也不会执行,在该命令之前的命令会被回滚,数据返回初始的状态(要么都成功,要么都失败)

作用:

1.在操作数据库时能够保护数据的一致性

2.多个程序并发操作数据库时起到"隔离"作用

操作步骤

1.执行多个sql语句:

$sql = "update `class` set salary=salary+100 where sname='雷小军'";
$sql2 = "update `class` set salary=salary-200 where sname='马小云'";
$rise = $conObj->query($sql);
$down = $conObj->query($sql2);

2.开启事务:

$conObj->query('start transaction');

3.进行判断,如果如果执行成功,一起提交,如果失败,回滚:

if ($rise && $down){
echo '提交';
$conObj->commit();
}
else{
echo '失败';
$conObj->rollback();
}

完整实例如下

通过事务进行调整两名员工的工资:

<?php
header("content-type:text/html;charset:utf-8"); $conObj =new MySQLi('localhost','root','root','test','3306');
if ($conObj->connect_errno){
die("连接失败,错误信息如下".$conObj->connect_error);
}
$conObj ->set_charset('utf-8'); $conObj->query('start transaction'); $sql = "update `class` set salary=salary+100 where sname='雷小军'";
$sql2 = "update `class` set salary=salary-200 where sname='李铁柱'";
$rise = $conObj->query($sql);
$down = $conObj->query($sql2); if ($rise && $down){
echo '成功';
$conObj->commit();
}
else{
echo '失败';
$conObj->rollback();
} $conObj->close();

通过字符串拼接进行批量数据库操作

将多条sql语句赋值给同一个变量,使用字符串连接符,注意除了最后一个sql语句外末尾都要加上分号:

$sql = "update `class` set salary=salary+100 where sname='雷小军';";
$sql .= "update `class` set salary=salary-200 where sname='李铁柱';";
$sql .= "update `class` set salary=salary-200 where sname='马小云'";
$conObj->multi_query($sql)

如果是dml操作,还需要几个特定的方法取到查询结果

multi_query()获取查询的结果集

因为是多个select语句,所以遍历到的结果集也会有多个

会有一个指针指向当前的结果集,store_result()方法将返回指针当前的结果集的内容

more_results()检测指向的当前结果集后面还是否有其他如果more_results()返回的值为真,就调用next_result()

header("content-type:text/html;charset:utf-8");
$conObj =new MySQLi('localhost','root','root','test','3306');
if ($conObj->connect_errno){
die("连接失败,错误信息如下".$conObj->connect_error);
}
$conObj ->set_charset('utf-8');
$sql ="select* from testchage;";
$sql .="select* from class"; if($conObj->multi_query($sql)){
do {
$res = $conObj->store_result();
echo '<br /><pre>*********************<br />';
while($row = $res->fetch_assoc()){
foreach ($row as $val) {
echo '<pre>';
echo "---$val";
}
}
$res->free();
if (!$conObj->more_results()) {
break;
}
}
while ($pro = $conObj->next_result());
}
else{
echo '执行失败'.$conObj->error;
}
$conObj->close();

预处理

介绍:普通方式执行多条sql语句时,每次执行一条sql语句就要编译一次,采用预处理机制无论有多少条sql语句,都只需要编译一次(当前前提是所有的sql语句都必须是结构相同,只有参数不同的)

优点: 1.大大提高了程序的执行速度:

    2.可以防止sql注入攻击

    3.操作更加方便

<?php
header("content-type:text/html;charset:utf-8");
$conObj =new MySQLi('localhost','root','root','test','3306');
if ($conObj->connect_errno){
die("连接失败,错误信息如下".$conObj->connect_error);
}
$conObj ->set_charset('utf-8'); //准备好sql语句,参数使用?填充
$sql ="insert into `class` values(?,?,?,?,?)";
//创建预编译对象,并为其绑定参数
//这个操作实现了预编译,也把sql语句和参数联系了起来,sql语句中每一个?对应这里的bind_param方法的一个参数
$stmt =$conObj->prepare($sql);
$stmt->bind_param('isssd',$id,$sname,$gender,$company,$salary); $id =14;
$sname ='霍华德沃洛维茨';
$gender ='男';
$company='NASA';
$salary=20000;
if ($stmt->execute()){
echo '操作执行成功';
}else{
echo '执行失败,错误信息'.$stmt->error;
} $id =15;
$sname ='伯纳黛特';
$gender ='女';
$company='制药公司';
$salary=20000;
if ($stmt->execute()){
echo '操作执行成功';
}else{
echo '执行失败,错误信息'.$stmt->error;
} $id =16;
$sname ='拉杰什罗摩衍那库斯拉帕';
$gender ='男';
$company='麻省理工';
$salary=20000;if ($stmt->execute()){
echo '操作执行成功';
}else{
echo '执行失败,错误信息'.$stmt->error;
} //第六步:关闭连接
$stmt->close();
$conObj->close();

prepare()方法作用是将sql语句进行预编译

bind_param()方法为预编译对象绑定参数,bind_param()方法有多个参数:

第一个参数是输入的类型,以上面代码为例,bind_param()的第一个参数为isssd,表示sql语句的五个输入参数分别是int(i) string(s) string(s) string(s) double(d)类型

同理如果需要操作的是"id 用户名 密码"三个字段就是'iss':int string string

需要注意的是这里只支持这四种数据类型:

  i:int(整型)

  d:double(浮点型)

  s:string(字符串型)

  b:boolean(布尔类型)

后面的参数就是对sql语句的填充,有几个问号后面就要有几个参数

完成参数绑定之后,后面不管有多少个sql语句,都只需要提供需要的参数然后执行execute()方法提交就完事了

PHP mysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理的更多相关文章

  1. PHP PDO扩展整理,包括环境配置\基本增删改查\事务\预处理

    相关文章:PHP的mysql扩展整理,操作数据库的实现过程分析    PHPmysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理 介绍 PDO是一种PHP程序连接数据库的接口 ...

  2. 面向过程 vs 面向对象

    从网上摘录了一些面向过程vs.面向对象的分析,先简单记录如下,稍后会继续整理. 为什么会出现面向对象分析方法? 因为现实世界太复杂多变,面向过程的分析方法无法实现. 面向过程 采用面向过程必须了解整个 ...

  3. python 面向过程和面向对象比较

    面向过程 VS 面向对象 面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式. 优点是:复杂度 ...

  4. python基础(23):面向过程与面向对象的优劣、初识面向对象

    1. 面向过程与面向对象的优劣 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程 ...

  5. 【JAVA】笔记(2)---面向过程与面向对象;类,对象;实例变量,引用;构造方法;

    面向过程与面向对象: 1.面向过程思想的典型栗子是C语言,C语言实现一个程序的流程是:在主函数中一步一步地罗列代码(定义子函数来罗列也是一样的道理),以此来实现我们想要的效果: 2.面向对象思想的典型 ...

  6. JS是面向过程、面向对象还是基于对象?面向对象的代码体现

    一.问题 javascript是面向对象的,还是面向过程的?基于对象是什么意思? 对象: 指的是对某一类事物进行抽象,抽象出这一类事物共同的特征以及行为(也就是属性和方法),那些拥有这一共同属性和方法 ...

  7. C++笔记005:用面向过程和面向对象方法求解圆形面积

    原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 结束了第一个hello world程序后,我们来用面向过程和面向对象两个方法来求解圆的面积这个问题,以能够更清晰的体会面向对象和面向过程. ...

  8. PHP面向过程和面向对象

    php程序编写分为面向过程和面向对象.两者在功能实现上没有区别,但是在代码编写上区别很大,面向过程的代码很乱,不易管理,而面向对象把常用的功能封装为一个类,这样代码清楚多了. 下面举个小例子说明一下: ...

  9. essential C++中关于面向过程和面向对象的说明

    昨天在阅读essential C++中看到了一个关于面向过程和面向对象的区别的例子,感觉挺好的.记录下来.... 这个例子是关于照相机的.照相机有三个性质,一个是控制位置:通常使用3个浮点数据来表示其 ...

随机推荐

  1. PHP核心编程-图像操作

    一 图像操作环境: 1.    开启GD2图像处理并检测 在php.ini开启GD库 2.    画布坐标系说明 二. 图像基本操作(步骤) 1.    创建图像 创建画布(图像资源) 创建的方法: ...

  2. IDEA:将WEB-INF\lib下的Jar包添加到项目中

    打开Project Structure[可以使用快捷键:Ctrl+Alt+Shift+S] 左侧选中Modules,在Dependecies中,点击右侧"+"号,选择JARS or ...

  3. Directx11教程(67) 显示模型文件

    原文:Directx11教程(67) 显示模型文件       在前面的教程中,我们都是通过在ModelClass中直接产生顶点和索引数据,简单的三角形,立方体等等还好说,毕竟比较简单,如何显示复杂的 ...

  4. 如何在 KiCad Eeschema 原理图中高亮网络

    如何在 KiCad Eeschema 原理图中高亮网络 在 KiCad Pcbnew 中高度某个网络很方便,按着 Ctrl + 单击可以高度网络. 以为 Eeschema 也是一样的,按着 Ctrl ...

  5. hdu 2844 混合背包【背包dp】

    http://acm.hdu.edu.cn/showproblem.php?pid=2844 题意:有n种纸币面额(a1,a2,...an),每种面额对应有(c1,c2,...cn)张.问这些钱能拼成 ...

  6. 读取服务器的windows共享。。

    有些windows共享可以直接登录,有些需要帐号密码帐号密码 有些电脑在输入框输入ip没有弹出登录帐号密码的地方 如下方法可以登录 输入:net use \\ip\ipc$ /del 回车.(例如:& ...

  7. 2019-9-2-win10-uwp-随着数字变化颜色控件

    title author date CreateTime categories win10 uwp 随着数字变化颜色控件 lindexi 2019-09-02 12:57:38 +0800 2018- ...

  8. OpenJudge_1477:Box of Bricks

    描述 Little Bob likes playing with his box of bricks. He puts the bricks one upon another and builds s ...

  9. margin负边距的使用(超简单)

    写在开头: 在css的世界中,一切都是框,所有的框都处于流动的状态 margin负边距可以使文档流发生偏移   在没有设置margin-bottom的时候,parent的高度会跟随child的内部元素 ...

  10. Java面向对象----继承概念,super关键字

    继承概念: 继承需要符合的关系  is-a  , 父类通用更抽象,子类更特殊更具体 类之间的关系 继承体现 组合体现 实现接口体现 继承的意义 代码重用 体现不同抽象层次 extends关键字 Sup ...