PHPmysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理

  相关文章:PHP的mysql扩展整理,操作数据库的实现过程分析

介绍

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

面向过程方式

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

流程图:

实例:

<?php
header("content-type:text/html;charset:utf-8");
//第一步:创建数据库连接并选中要操作的具体数据库
$conObj [email protected]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 [email protected]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();

事务

介绍:

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

作用:

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()方法提交就完事了

原文地址:https://www.cnblogs.com/iszhangk/p/11494488.html

时间: 2024-10-06 06:13:09

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

面向过程与面向对象的本质区别-对面向过程与面向对象的一点感悟

面向过程与面向对象的本质区别 一位计算机界的大师曾说过,"我认为,面向对象的目标从来都不是复用和扩展,而是提供一种处理复杂问题的方法". 面向过程讲究自顶向下逐步求精.找到一个系统的入口然后顺藤摸瓜,分析出每一步以及影响这一步的其他因素,我们就能够定义这个系统. 面向对象认为世界是有很多对象组成的,各个对象之间相互独立,平时并没有什么关系.在某些外力的作用之下对象之间相互协作,表现出一定的行为,最终塑造了这个复杂的世界.面向过程和面向对象都是人们认识和了解这个世界的手段和方法,并无优劣

面向过程,面向对象,函数式对同一个问题的思考方式

我之所以对函数式代码感兴趣是因为函数式代码富有表现力,可以使用简短.紧凑的代码完成工作,同时能对特定的问题给出优雅的解决方案.现代的编程语言不约而同的朝着面向对象.函数式.动态.解释执行的方向发展,例如Ruby,Swift.而另一些语言则更加强调函数式编程,如F#,Scala,这种语言有着强大的类型推断系统,编写的代码洁程度则令人叹为观止. 在F#编写一个两个数相加的函数,在F# Interactive中输入: let add num1 num2=num1*num2;; F# Interacti

面向过程和面向对象及面向对象的三大特征

英文及缩写: 面向过程:procedure oriented programming POP 面向对象:object oriented programming OOP 面向对象和面向过程的历程: 面向过程编程采取的是时间换空间的策略,因为在早期计算机配置低,内存小,如何节省内存则成了首要任务,哪怕是运行的时间更长.随着硬件技术的发展,硬件不再成为瓶颈,相反更好的模拟现实世界.系统的可维护性等问题凸显出来,于是面向对象设计应运而生.当下:应用在PC机上的一般应用系统,由于不太需要考虑硬件的限制,而

面向过程和面向对象

面向过程和面向对象简介 一 .面向过程与面向对象的区别: 前者是一种谓语和宾语的关系:后者是一种主语和谓语的关系 . 二.面向对象的三个特征: 封装 继承 多态 三.类与对象: 对象又称作实例,是实际存在的该类事物的每个个体.类是对某一类事物的描述,是抽象的.概念上的 定义. 面向对象的设计的重点是类的设计. 四.对象的比较: 1 “= =”运算符与equals()方法的区别: 前者辨别实质是否相等:后者辨别长相是否相等. 五. 实现类的封装性: 1不能让外面的类随意修改一个类的成员变量: 2在

面向过程 VS 面向对象

面向过程 VS 面向对象 编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种不同的方式, 对这些不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式. 不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路, 大多数语言只支持一种编程范式,当然也有些语言可以同时支持多种编程范式. 两种最重要的编程范式分别是面向过

面向过程与面向对象编程的区别和优缺点

面向过程与面向对象编程的区别 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了: 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为. 可以拿生活中的实例来理解面向过程与面向对象,例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1.开始游戏,2.黑子先走,3.绘制画面,4.判断输赢,5.轮到白子,6.绘制画面,7.判断输赢,8.返回步骤2,9.输出最后结果.

面向过程、面向对象及面向对象的三大特征

面向过程:procedure oriented programming POP 面向对象:object oriented programming OOP 了解面向对象,我们来了解一下面向对象中的核心概念类和对象 类:类是对某一类事物的描述,是抽象的.概念上的定义. 对象:现实世界中客观存在的事务就称为对象.在java中,万物皆对象,对象是用来描述客观事物的一个实体,由一组属性和方法构成. 类与对象的关系:类是多个对象进行综合抽象的结果,是实体对象的概念模型,而一个对象是一个类的实例. 面向过程到

C++基础知识(六)--类--成员函数的定义--对象的创建与使用--从面向过程到面向对象

一.类 1.类是一种数据类型,将数据与对数据的操作(函数)放到一起.一个类中的数据通常只能通过本类提供的方法进行处理,这些方法成为该类与外部的接口,对象之间通过消息进行通讯. 2.如果在类的起始点无访问说明符,系统默认为私有(private) 3.类是一种数据类型,定义时系统不为类分配存储空间,所以不能对类的数据成员进行初始化.类中的任何数据成员也不能使用关键字extern,auto,register等关键字限定其存储类型 二.成员函数的定义 1.函数定义:通常在类定义中,成员函数仅做声明,函数

两大编程思想(面向过程,面向对象)

1. 面向过程编程(POP) 面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了. 例如:把大象装进冰箱(面向过程,就是按照我们分析好的步骤,按照步骤解决问题) 1. 打开冰箱门, 2. 把大象装进去, 3. 关上冰箱门 2. 面向对象编程(OOP) 面向对象:是把事务分解成为一个个对象,然后由对象之间分工与合作. 例如:把大象装进冰箱(面向对象是以对象来划分问题,而不是步骤) 先找出对象,并写出这些对象的功能: 1. 大象 (对象)