【PHP&&mysqli】

msyqli和mysql只有一个字母的差别,真正的含义是msyql的增强版扩展。

MySQL可以处理满足程序员对MySQL数据库操作的各种需要了,为什么还需要mysqli呢?因为mysqli支持面性对象编程,PHP的开发者为了适应当前的发展,不得不对PHP进行升级,并使其慢慢向面向对象看齐。

虽然mysqli支持面向对象,但是mysqli扩展库考虑到PHP老程序员,同时也提供了面向过程的编程风格,这就造成了PHP中的一大奇景:同一个方法既有面向过程风格的,又有面向对象风格的。

比如:关闭数据库连接的方法:

面向对象函数库:
bool mysqli::close(void)
$mysqli=new MySQLi(xx);
$mysqli->close();

面向过程的函数库:
bool mysqli_close(mysql $link)
$conn=mysqli_connect(xxx,xx)
mysqli_close($conn);

同样的,我们首先应该熟练掌握对数据库的增删查改的操作。

值得一提的是,mysqli在连接数据库的时候就必须指定连接那个数据库,而mysql则需要先连接数据库,再选择具体的数据库,使用mysql_select_db()方法。

在案例中学习mysqli

提醒:mysqli_connect_error()方法只能在PHP5.3.0以上的版本中使用

一、crud操作

interface.php

 1 <?php
 2     require_once "mysqli_tool.php";
 3     $mysqli=new mysqli_tool("localhost","root","5a6f38","users");
 4     if(mysqli_connect_error())
 5     {
 6         die("连接数据库失败!");
 7     }
 8     //先查询一次
 9     echo "查询操作:";
10     printf_all($mysqli);
11
12
13     //进行插入操作
14     $sql="insert into user1(name,password,email,age) values (‘艳荣‘,md5(‘sssx‘),‘[email protected]‘,23)";
15     echo "数据插入操作:";
16     $mysqli->update($sql);
17     printf_all($mysqli);
18
19     //进行修改操作
20     $num=$mysqli->getinsertid();
21     $sql="update user1 set email=‘[email protected]‘where id=‘".$mysqli->getinsertid()."‘";
22     $mysqli->update($sql);
23     echo "对刚插入的数据进行修改操作:";
24     printf_all($mysqli);
25
26     //进行删除操作
27     echo "对刚插入的数据进行删除操作:";
28     $sql="delete from user1 where id=‘".$num."‘";
29     $res=$mysqli->update($sql);
30     printf_all($mysqli);
31
32     function printf_all($mysqli)
33     {
34         echo ",查询后结果是:<br/>";
35         $sql="select * from user1 order by id";
36         $mysqli->search($sql);
37         while($row=$mysqli->getres()->fetch_row())
38         {
39             foreach($row as $key=>$value)
40             {
41                 echo "$value--";
42             }
43             echo "<br/>";
44         }
45         echo "<br/><br/><br/>";
46         $mysqli->close_res($mysqli->getres());
47     }
48
49     $mysqli->close_conn($mysqli->getconn());
50 ?>

mysqli_tool.php

 1 <?php
 2     class mysqli_tool
 3     {
 4         private $host,$name,$pw,$db_name,$mysqli;
 5         private $conn,$res;
 6         public function __construct($host,$name,$pw,$db_name)
 7         {
 8             $this->host=$host;
 9             $this->name=$name;
10             $this->pw=$pw;
11             $this->db_name=$db_name;
12             $this->mysqli=new mysqli($this->host,$this->name,$this->pw,$this->db_name);
13             $this->mysqli->query("set names utf8");
14         }
15         //查询功能
16         public function search($sql)
17         {
18             $this->res=$this->mysqli->query($sql,$this->conn);
19             if(!$this->res)
20             {
21                 die("数据查询失败!");
22             }
23             else
24             {
25                 if($this->mysqli->affected_rows==0)
26                 {
27                     echo "没有符合条件的数据!";
28                 }
29                 else
30                 {
31                     return $this->res;
32                 }
33             }
34         }
35
36         public function update($sql)
37         {
38             $this->res=$this->mysqli->query($sql,$this->mysqli->conn);
39             //echo "受影响的行数是:".$this->mysqli->affected_rows."<br/>";
40             if(!$this->res)
41             {
42                 echo "数据更新失败!";
43             }
44         }
45
46         public function getinsertid()
47         {
48             return $this->mysqli->insert_id;
49         }
50         public function getconn()
51         {
52             return $this->conn;
53         }
54         public function getres()
55         {
56             return $this->res;
57         }
58         public function close_conn($conn)
59         {
60             $this->mysqli->close();
61         }
62         public function close_res($res)
63         {
64             $this->res->free();
65         }
66     }
67
68 ?>

二、事务回滚操作

如果不能回滚,非常有可能是存储引擎的问题,详情:mysql myisam和innodb的区别

 1 <?php
 2
 3
 4
 5 //有疑问:不能实现回滚的原因是什么?数据库的存储引擎不符合要求,不支持事务处理
 6     //创建数据库连接对象
 7     $mysqli=new mysqli(‘localhost‘,‘root‘,‘5a6f38‘,‘users‘);
 8     //将mysql数据库的自动提交设置false
 9     $mysqli->autocommit(false);
10     //设置sql指令
11     $sql1="update account set account=account-2 where name=‘zhangsan‘";
12     $sql2="update account set account=account+2 where name=‘lisi‘";
13     //执行指令
14     $r1=$mysqli->query($sql1);
15     $r2=$mysqli->query($sql2);
16     //判断结果
17     if(!$r1||!$r2)
18     {
19         //两个sql语句执行中至少有一个错误,回滚处理
20         $mysqli->rollback();
21         echo "转账失败!回滚处理!";
22     }
23     else
24     {
25         $mysqli->commit();
26         $mysqli->close();
27         echo "转账成功!";
28     }
29 ?>

三、批量查询

mysqli相对于mysql扩展库,有一个比较大的改进:支持批量查询

实例代码如下:

 1 <?php
 2     //1.创建msyqli对象
 3     $mysqli=new mysqli("localhost","root","5a6f38","users");
 4     if(mysqli_connect_error())
 5     {
 6         die("数据库连接失败:".mysqli_connect_error());
 7     }
 8     //2.创建批量查询语句
 9     $sqls="select * from user1;";
10     $sqls.="show columns from user1";
11     //3.处理结果
12     $res=$mysqli->multi_query($sqls);
13     if($res)//如果条件成立说明至少有一个结果被返回
14     {
15         do
16         {
17             echo "*********************查询到的新表******************<br/>";
18             echo "<br/>标志变量<br/>";
19             $result=$mysqli->store_result();//$result是mysqli result对象
20             while($row=$result->fetch_row())
21             {
22                 foreach($row as $value)
23                 {
24                     echo "--$value";
25                 }
26                 echo "<br/>";
27             }
28             $result->free();
29             if(!$mysqli->more_results())//如果没有下一个查询,则停止取下一个查询的结果。
30             {
31                 break;
32             }
33             echo "<br/><br/>";
34
35         }
36         while($mysqli->next_result());//指针后移,并判断是否为空
37     }
38     else
39     {
40         echo "数据查询失败!";
41     }
42     $mysqli->close();
43 ?>

四、预编译技术

大概有很多人没听说过这个东西,其实我也是不太明白,毕竟sql是一种解释型的语言,不需要编译就可以被dbms执行,但是在这里我们权且将它当做可以被编译,这样理解起来的话就比较容易了。

问题的提出:

现在要向数据库中添加100条数据,我们该怎么实现?

方法1:使用for循环,依次添加100次

方法2:使用批量查询技术,将100个sql语句拼接起来之后最后打包执行。

方法3:使用预编译技术。

这里我们使用预编译技术,使用预编译技术有什么好处?

1.防止sql注入

2.执行速度快

有和两条好处就足够了。

预编译流程:将sql语句发送到dbms,由dbms编译好并保存起来。我们只需要将数据发送到dbms即可,而不需要将整条sql语句发送到dbms,这样就大大提高了执行效率,这对于大量数据的插入尤其明显。

下面将展示各种查询操作,但要先强调:使用完之后要多关闭一个资源:dbms存储的预编译文件。

基本流程:预编译文件-》绑定参数-》执行-》绑定参数-》执行。。。。

使用预编译技术实现批量插入:

 1 <?php
 2     //创建mysqli对象
 3     $mysqli=new mysqli("localhost","root","5a6f38","users");
 4     //创建预编译对象
 5     $sql="insert into user1 (name,password,age,email) values (?,?,?,?)";
 6     $mysqli_stmt=$mysqli->prepare($sql);
 7
 8
 9     //创建参数并绑定
10     $name="lisi";
11     $password="6f6f6f";
12     $age=40;
13     $email="[email protected]";
14     $mysqli_stmt->bind_param("ssis",$name,$password,$age,$email);
15
16     //执行函数
17     execute_prepared($mysqli_stmt,$mysqli);
18
19     //创建参数并绑定
20     $name="zhangsan";
21     $password="6f6f6f";
22     $age=40;
23     $email="[email protected]";
24     $mysqli_stmt->bind_param("ssis",$name,$password,$age,$email);
25
26     //执行函数
27     execute_prepared($mysqli_stmt,$mysqli);
28
29     //反复执行即可完成插入操作
30
31     $mysqli->close();
32
33
34
35     function execute_prepared(&$mysqli_stmt,&$mysqli)
36     {
37         //执行语句
38         $result=$mysqli_stmt->execute();
39         //验证是否成功
40         if(!$result)
41         {
42             die("操作失败!".$mysqli_stmt->error);
43         }
44         else
45         {
46             echo "操作成功!<br/>";
47             //打印验证
48             printf_all($mysqli);
49         }
50     }
51     function printf_all(&$mysqli)
52     {
53         $sql="select * from user1";
54         $res=$mysqli->query($sql);
55         while($row=$res->fetch_row())
56         {
57             foreach($row as $value)
58             {
59                 echo "$value&nbsp;&nbsp;&nbsp;";
60             }
61             echo "<br/>";
62         }
63         $res->free();
64     }
65 ?>

使用预编译技术实现批量查询

 1 <?php
 2     //创建mysali对象
 3     $mysqli=new mysqli("localhost","root","5a6f38","users");
 4     if(mysqli_connect_error())
 5     {
 6         die("数据库连接失败!".mysqli_connect_error());
 7     }
 8     //创建预编译对象
 9     $sql="select * from user1 where id>?";
10     $mysqli_stmt=$mysqli->prepare($sql);
11     //绑定参数
12     $id=15;
13     $mysqli_stmt->bind_param("i",$id);
14     //绑定结果集
15     $mysqli_stmt->bind_result($id,$name,$password,$email,$age);
16     //执行
17     $mysqli_stmt->execute();
18     //取出绑定的值
19     while($mysqli_stmt->fetch())
20     {
21         echo "$id&nbsp;&nbsp;&nbsp;$name&nbsp;&nbsp;&nbsp;
22         $password&nbsp;&nbsp;&nbsp;$email&nbsp;&nbsp;&nbsp;$age<br/>";
23     }
24     //释放结果集
25     $mysqli_stmt->free_result();
26     //删除在数据库中的预编译文件
27     $mysqli_stmt->close();
28     //关闭和数据库的连接
29     $mysqli->close();
30 ?>

五、获取表头信息和行数、列数并打印表格

 1 <?php
 2     $database="users";
 3     $sql="select * from user1";
 4     printf_table($database,$sql);
 5     function printf_table($database,$sql)
 6     {
 7         //创建$mysqli对象。
 8         $mysqli=new mysqli("localhost","root","5a6f38",$database);
 9         if(mysqli_connect_error())
10         {
11             die("数据库连接失败!失败信息:".mysqli_connect_error());
12         }
13         //获取结果集
14         $res=$mysqli->query($sql);
15         //获取行数
16         $row_nums=$res->num_rows;
17         //获取列数
18         $column_nums=$res->field_count;
19         //打印表头信息
20         echo "<center><table cellpadding=‘10‘ cellspacing=‘1‘ bgcolor=‘black‘>";
21         echo "<tr bgcolor=‘white‘>";
22         while($field=$res->fetch_field())//$field是列属性对象
23         {
24             echo "<th>$field->name</th>";
25         }
26         echo "</tr>";
27         //取出表体数据
28         while($row=$res->fetch_row())
29         {
30             echo "<tr bgcolor=‘white‘>";
31             foreach($row as $value)
32             {
33                 echo "<td>$value</td>";
34             }
35             echo "</tr>";
36         }
37         echo "</table></center>";
38         //释放资源
39         $res->free();
40         //断开连接
41         $mysqli->close();
42     }
43 ?>

时间: 2024-09-30 06:34:48

【PHP&&mysqli】的相关文章

【php技术】PHP错误类型和屏蔽方法

[php技术]PHP错误类型和屏蔽方法 作者:简单生活 来源:本站 发表时间:2016-10-30 08:58:12 查看:7 次 一.php的错误类型 首先,我们需要知道的是怎么才能显示我们的错误: 通过在代码中添加两行代码: 1.显示除E_STRICT外的所有错误和警告信息 error_reporting(E_ALL); 2. 是否把错误展示在输出上 ini_set('display_errors', 'On'); 有了以上两部操作,我们就可以把我们的错误信息展示在页面上了. 第二,我们需要

【未解决】Linux下PHP安装扩展Mysql的问题

[步骤分析] 1.在PHP源码包下定位到指定位置:源码包/ext/mysqli 注1:网上很多地方红字部分是mysql,其实PHP5以后已经不用mysql了. 2.运行:/usr/local/php/bin/phpize 3. ./configure --with-php-config=/usr/local/php/bin/php-config --with-mysqli=/usr/local/mysql/bin/mysql_config 注1:注意红字部分,网上很多文章都已经过时,导致Conf

【codeforces 718E】E. Matvey&#39;s Birthday

题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串s.两个位置i,j(i!=j)存在一条边,当且仅当|i-j|==1或s[i]==s[j].求这个无向图的直径,以及直径数量. 题解:  命题1:任意位置之间距离不会大于15. 证明:对于任意两个位置i,j之间,其所经过每种字符不会超过2个(因为相同字符会连边),所以i,j经过节点至多为16,也就意味着边数至多

【c/c++】内存分配大小

测试平台:linux 32位系统 用sizeof()运算符计算分配空间大小.单位:字节 1. 数组名与变量名的区别 int main() { char q[] = "hello"; cout << "q:" << sizeof(q) << endl; char *mq = q; cout << "mq:" << sizeof(mq) << endl; const char *

【 js 基础 】Javascript “继承”

是时候写一写 "继承"了,为什么加引号,因为当你阅读完这篇文章,你会知道,说是 继承 其实是不准确的. 一.类1.传统的面向类的语言中的类:类/继承 描述了一种代码的组织结构形式.举个例子:"汽车"可以被看作是"交通工具"的一种特例.我们可以定义一个 Vehicle 类和一个 Car 类来对这种关系进行描述.Vehicle 的定义可能包含引擎.载人能力等,也就是 所有交通工具,比如飞机.火车和汽车等都有的通用的功能描述.在对 Car 类进行定义的

服务 Service【经典案例】

2017-1-19 Activity public class MainActivity extends ListActivity {     private boolean flag;//线程结束条件     public static final String ACTION_TEST_SERVICE = "com.bqt.service.TEST_SERVICE";     private MyServiceConnection conn;     private IBinderI

【N版】openstack——走进云计算(一)

[N版]openstack--走进云计算 一.云计算 云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问,进入可配置的计算资源共享池(资源包括:网络.服务器.存储.应用软件.服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互. 1.1云计算的特点和优势 1)云计算是一种使用模式 2)云计算必须通过网络访问 3)弹性计算,按需付费 1.2在云计算之前的模式或技术 1)IDC托管 2)IDC租用 3)虚拟主机(卖空间的) 4)VPS:虚拟专用

【N版】openstack——认证服务keystone(三)

[N版]openstack--认证服务keystone 一.keystone介绍 1.1keystone Keystone(OpenStack Identity Service)是 OpenStack 框架中负责管理身份验证.服务规则和服务令牌功能的模块.用户访问资源需要验证用户的身份与权限,服务执行操作也需要进行权限检测,这些都需要通过 Keystone 来处理. 用户认证:用户权限与用户行为跟踪 服务目录:提供一个服务目录,包括所有服务项与相关API的端点 主要涉及如下概念: User:  

【N版】openstack——镜像服务glance(四)

[N版]openstack--镜像服务glance 一.openstack之glance镜像服务 1.1glance介绍 glance主要是由三部分组成 glance-api:接收云系统镜像的创建,删除,读取请求,类似nova-api,通过其他模块(glance-registry及image store)来完成诸如镜像的查找.获取.上传.删除等操作,api监听端口9292. glance-registry:云系统的镜像注册服务,用于与mysql数据库交互,存储或获取镜像的元数据(metadata