前言

这篇文章会对PHP的MySQL扩展库,MySQLI的扩展库,SQL批量执行,事务控制等等进行一些简单的讲解。

MySQL扩展

PHP中MySQL扩展,虽然因为安全的原因,在PHP5.6及往上不在支持MySQL扩展库,但是还是要学习的,通过编写案例的方式来讲解。

案例

先说下操作数据库的大体思路吧,就是先获取连接-》选择数据库-》设置操作编码-》发送sql指令-》对返回的结果进行处理-》释放资源,断开连接。案例是一个在线词典查询。下面是创建表的sql语句:

 create database worddb
    create table words(
         id int primary key auto_increment,
         enword varchar(32) not null,
         chword varchar(256) not null
         );
    insert into words(enword,chword) values ('boy','男孩')
    insert into words(enword,chword) values ('school','学校') 

因为是练习,所以就插入了两条数据。接下来就是编写SQL工具类,代码如下:

 conn=mysql_connect($this->host,$this->user,$this->password);
            if (!$this->conn){
                die("连接数据库失败!".mysql_error());
            }
            mysql_select_db($this->db,$this->conn);
            mysql_query("set names utf8");
        }
        //完成select
        function execute_dql($sql){
            $res=mysql_query($sql) or die(mysql_error());
            return $res;
        }
    	//完成insert,update,delete
        function execute_dml($sql){
            $b=mysql_query($sql,$this->conn);
            if (!$b){
                return 0;
            }else{
    			//因为有些情况执行成功,但没有行数影响,所以在判断一下。
                if (mysql_affected_rows($this->conn)>0){
                    return 1;
                }else{
                    return 2;
                }
            }
        }
    }
    ?> 

之后就是前端页面的编写了,代码如下,有点丑:

 
	
		在线词典
	

	
	
	

字典

查询英文

请输入英文:

查询中文

请输入中文:

接下来就是后端逻辑代码了,如下:

 回到主页面";
    }
    if ($type=="search1") {
        if (isset($_POST[yingyu])) {
            $en_word = $_POST[yingyu];
        } else {
            echo "请输入";
            echo "回到主页面";
        }
        $sql = "select chword from words where enword='" . $en_word . "' limit 0,1";
        //查询,调用sql工具类
        $SqlTool = new SqlTool();
        $res = $SqlTool->execute_dql($sql);
        if ($row = mysql_fetch_assoc($res)) {
            echo $en_word . "对应的中文为" . $row['chword'];
        } else {
            echo "查询没有这个词条.
";
            echo "回到主页面";
        }
    	//释放资源
        mysql_free_result($res);
    }else if($type == "search2") {
        if (isset($_POST[hanyu])) {
            $ch_word = $_POST[hanyu];
        } else {
            echo "请输入";
            echo "回到主页面";
        }
        $sql = "select enword from words where chword like '%" . $ch_word . "%'";
    
        //查询,调用sql工具类
        $SqlTool = new SqlTool();
        $res = $SqlTool->execute_dql($sql);
        if (mysql_num_rows($res) != 0) {
            while ($row = mysql_fetch_assoc($res)) {
                echo "
".$ch_word . "对应的英文为" . $row['enword'];
            }
        } else {
            echo "查询没有这个词条.
";
            echo "回到主页面";
        }
    	//释放资源
        mysql_free_result($res);
    }
    ?> 

现在来测试一下吧,首先打开前端页面,如下图:

接下来输入boy进行查询,结果如下,查询成功:

因为是案例,所以直接将前端传过来的参数没有做任何处理直接拼接到SQL语句中,这样是非常危险的!!,存在SQL注入攻击,现在我来演示一下,在输入框中输入:
boy' and updatexml(1,concat(0x7e,(select user()),0x7e),1)#
结果如下图直接报出使用者!!

所以在开发功能时,要秉持“外部参数皆不可信原则”进行开发

MYSQLI扩展

其实mysqli扩展是mysql扩展的加强版,因为历史原因,有一些老程序员擅长面向过程写法,所以PHP设计者为mysqli设计了两套方案,一套面向对象,一套面向过程,甚至一个聊本里可以混着用,不过那样很怪,下面的案例都是采用面向对象的那套方案。

案例

做一个小功能吧,向数据库中插入数据。先设计一下SQL表,语句如下:

 create database day1;
    use day1;
    create table user1 (
    id int(6) unsigned auto_increment primary key,
    name varchar(20) not null,
    password varchar(256) not null,
    email varchar(80)  not null,
    age int(128) not null
     );
    
    INSERT INTO user1(name,password,email,age) VALUES('Lucia','13568','12345@.com',30); 

因为一会儿要插入数据,所以先插入一条,构造好后,打开数据库,查询,发现没有问题

接下来构造mysqli工具类代码如下:

mysqli=new mysqli($this->host,$this->user,$this->pass,$this->db);
        if ($this->mysqli->connect_error){
            echo "连接失败";
        }
        $this->mysqli->query("set names utf8");
    }
	//进行select
    public function execute_dql($sql){
        $res=$this->mysqli->query($sql) or die($this->mysqli->error);
        return $res;
    }
	//进行update,insert,delete
    public function execute_dml($sql){
        $res=$this->mysqli->query($sql) or die($this->mysqli->error);
        if (!$res){
            return 0;
        }else{
            if ($this->mysqli->affected_rows>0){
                return 1;//成功
            }else{
                return 2;//没有行数收影响
            }
        }
    }
}
?> 

下面就是前端页面了,这里我用表单向后端提交数据,代码如下:

 
	
	
	
添加联系人
姓名: 密码: email: 年龄:     

效果如下图:

然后就是后端的逻辑设计了,代码如下:

 execute_dml($sql);
    if ($res==1){
        echo "添加成功";
    }else{
        if ($res==0){
            echo '添加失败';
        }else{
            echo "行数没有变化";
        }
    }
    ?> 

现在测试一下,我们在表单页面输入 小明,12345678,123@qq.com,25 数据,如下图:

然后提交表单,看看有没有插入到数据库中。
我们发现成功插入到数据库中如下:

关于mysqli扩展就说到这里。

MySQL批量执行SQL语句

上面简单介绍了MySQL扩展和MySQLI扩展,接下来说一说批量执行sql语句。
先提一个需求,如果我们像数据库批量添加用户,如果按照之前的办法一条一条的发送sql语句来处理,这样很占用资源,并且效率低。所以采用批量执行sql语句的方式。接下来用两个案例来讲解,因为增加,修改,删除操作返回的是布尔值,而查询操作返回的是结果集,所以分来来处理比较好。

批量执行dml语句

因为dml返回的是布尔值,所以处理起来也比较好处理。先创建表,顺便插入一条数据如下:

 create database test;
    use test;
    create table users(
         id int(8) unsigned auto_increment primary key,
         name varchar(128) not null,
         password varchar(256) not null);
    insert into users(name,password) values('test','13579'); 

下面就是批量执行dml操作的代码:

 connect_error){
        echo "连接失败";
    }
    $sqli="insert into users(name,password) values ('小利',md5('13568'));";
    //批量执行dml操作时,注意上一级句的;和下一句的.两个符号
    $sqli.="insert into users(name,password) values ('小利',md5('13568'));";
    $sqli.="insert into users(name,password) values ('小利和小峰',md5('13568'))";
    
    $b=$mysqli->multi_query($sqli);
    if (!$b){
        echo "插入失败";
    }else{
        echo "ok!";
    }
    $mysqli->close();
    ?> 

然后访问页面,返回ok,说明插入到数据库了,现在打开数据库查看,果然插入进去了,如下图:

批量执行dql操作

批量执行dql操作的作用是一次性取回多个结果集,下面看案例代码:

 connect_error){
        echo "连接失败";
    }
    $sqli="select * from users;";
    $sqli.="select * from lsp";
    //因为multi_query这个函数比较傻,不会去判断有没有下一个结果集,所以最后再用more_results函数检查一下。
    if ($mysqli->multi_query($sqli)){
        do{     //从mysqli中取出第一个结果集
            $result=$mysqli->store_result();
                //显示mysqli $res对象
                while ($row=$result->fetch_row()){
                    foreach ($row as $key=>$val){
                        echo "--$val";
                    }
                    echo "
";
                }
                    $result->free();
                //判断有没有下一个结果集,如果没有退出循环
                if (!$mysqli->more_results()){
                    break;
                }
                echo "
*************新得结果集
";
        } while ($mysqli->next_result());
    }
    ?> 

结果如下图:

关于MySQL的批量执行sql语句就说到这里。

MySQL事务控制

上面简单介绍了MySQL扩展库,MySQLI扩展库,批量执行SQL语句,接下来说一说MySQL事务控制。

数据库配置

说MySQL事务控制之前,先查看并修改数据库引擎,查看引擎的命令如下:

show engines

我们发现,只有InnoDB是支持事务的,所以先查看一下现在得数据库引擎:

发现是MyISAM,我们将它修改为InnoDB,打开配置文件my.ini,将“default-storage-engine=MYISAM”改为你想设定的,然后重启即可。修改成功后,然后下一步就是代码实现。

案例

我们为什么需要事务控制呢?想一想,如果这是一个转账得场景,是不是需要同时控制住,必须我减金额得同时你加金额,任何一个出错都得转账失败。也就是说要保持一致。这也是要进行事务控制得必要性。下面看案例代码:

 connect_error){
        echo "连接失败";
    }
    //将提交设置为假,因为事物一旦提交就没有机会回滚
    $mysqli->autocommit(false);
    
    $sql1="update  person set money=money-3 where id=1";
    //这里第二条语句我故意写错表名
    $sql2="update  persons set money=money+3 where id=2";
    
    $b1=$mysqli->query($sql1);
    $b2=$mysqli->query($sql2);
    if (!$b1 || !$b2){
        echo "修改失败,回滚".$mysqli->error;
        $mysqli->rollback();
    }else{
        echo "修改成功!";
        $mysqli->commit();
    }
    $mysqli->close();
    ?> 

当我们提交页面后,查询数据库,发现数据没有变化,说明回滚有效果,事务控制起了效果,事务控制就说到这里。以上就是本篇文章的全部内容啦,如有错误,请斧正。

标签:PHPMysql

PHP基础之与MySQL那些事的更多相关文章

  1. PHP 非常实用下载远程图片

    /*** 下载远程图片* @param string $url 图片的绝对url* @param string $f......

  2. php结合GD库实现中文验证码的简单方法

    前言上一次写了一个常见的验证码,现在玩一下中文的验证码,顺便升级一下写的代码流程基本差不多先看GD库开启了没生成中文......

  3. php swoft框架实例用法

    在框架选择上,不少人会觉得swoft才是最强PHP框架,尤其是在常驻内存模式的应用级高性能框架,性能是这一堆页面级框......

  4. PHP方法的返回值示例详解

    前言不仅是PHP,大部分编程语言的函数或者叫方法,都可以用return来定义方法的返回值。从函数这个叫法来看,本身它......

  5. php中__call()方法使用

    <无详细内容>"","where"=>"&quo......

  6. PHP中强制类型转换的示例详解

    前言学过静态语言开发的朋友对类型转换不会陌生,比如Java、C#、C++等。静态语言的好处就是变量强制必须指定类型,......

  7. 前后端(PHP)使用AES对称加密

    前端代码:// 这个是加密用的 function encrypt(text){ var key = CryptoJS......

  8. php的lavarel框架中join和orWhere的用法

    Laravel是一个开源PHP框架,功能强大且易于理解。它遵循模型 - 视图 - 控制器设计模式(MVC)。Lara......

  9. 原生PHP网页导出和导入excel文件实例

    原生PHP实现的网页导出和导入excel文件实例,包括上传也是用的原生。还可在exportExcel方法里设置字体等......

  10. 关于PHP方法参数的那一些事

    前言在所有的编程语言中,方法或者函数,都可以传递一些参数进来进行业务逻辑的处理或者计算。这没什么可说的,但是在PHP......

随机推荐

  1. python实现经典排序算法

    以下排序算法最终结果都默认为升序排列,实现简单,没有考虑特殊情况,实现仅表达了算法的基本思想。冒泡排序内层循环中相邻......

  2. java构造函数的三种类型总结

    我们说构造函数能处理参数的问题,但其实也要分三种情况进行讨论。目前有三种类型:无参、有参和默认。根据不同的参数情况,......

  3. Python优化机制:常量折叠

    英文:https://arpitbhayani.me/blogs/constant-folding-python作者......

  4. python中re模块知识点总结

    一、什么是正则表达式?正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式是对......

  5. 如何实现短信跳转小程序?

    先看效果小程序支持短信跳转小程序了,可以说是打开了一个巨大的流量入口。效果过程分析从短信到网页从网页到小程序那么就涉......

  6. MySQL创建数据库并支持中文字符的操作方法

    我们首先看一下MySQL官方文档:5.7CREATE {DATABASE | SCHEMA} [IF NOT EXI......

  7. 基于Redo Log和Undo Log的MySQL崩溃恢复流程

    在之前的文章「简单了解InnoDB底层原理」聊了一下MySQL的Buffer Pool。这里再简单提一嘴,Buffe......

  8. Java魔法堂:调用外部程序

    前言Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用C/C++来获取,但对于对C......

  9. 前端 javascript 实现文件下载的示例

    在 html5 中,a 标签新增了 download 属性,包含该属性的链接被点击时,浏览器会以下载文件方式下载 h......

  10. 分布式系统限流算法分析与实现

    一、限流的关键作用 对于大型互联网架构中,限流的设计是必不可少的一个环节。在给定的时间内, 客户端请求次数过......