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

 <?php
require_once "mysqli_tool.php";
$mysqli=new mysqli_tool("localhost","root","5a6f38","users");
if(mysqli_connect_error())
{
die("连接数据库失败!");
}
//先查询一次
echo "查询操作:";
printf_all($mysqli); //进行插入操作
$sql="insert into user1(name,password,email,age) values ('艳荣',md5('sssx'),'1649653731@qq.com',23)";
echo "数据插入操作:";
$mysqli->update($sql);
printf_all($mysqli); //进行修改操作
$num=$mysqli->getinsertid();
$sql="update user1 set email='2632979128@sohu.com'where id='".$mysqli->getinsertid()."'";
$mysqli->update($sql);
echo "对刚插入的数据进行修改操作:";
printf_all($mysqli); //进行删除操作
echo "对刚插入的数据进行删除操作:";
$sql="delete from user1 where id='".$num."'";
$res=$mysqli->update($sql);
printf_all($mysqli); function printf_all($mysqli)
{
echo ",查询后结果是:<br/>";
$sql="select * from user1 order by id";
$mysqli->search($sql);
while($row=$mysqli->getres()->fetch_row())
{
foreach($row as $key=>$value)
{
echo "$value--";
}
echo "<br/>";
}
echo "<br/><br/><br/>";
$mysqli->close_res($mysqli->getres());
} $mysqli->close_conn($mysqli->getconn());
?>

mysqli_tool.php

 <?php
class mysqli_tool
{
private $host,$name,$pw,$db_name,$mysqli;
private $conn,$res;
public function __construct($host,$name,$pw,$db_name)
{
$this->host=$host;
$this->name=$name;
$this->pw=$pw;
$this->db_name=$db_name;
$this->mysqli=new mysqli($this->host,$this->name,$this->pw,$this->db_name);
$this->mysqli->query("set names utf8");
}
//查询功能
public function search($sql)
{
$this->res=$this->mysqli->query($sql,$this->conn);
if(!$this->res)
{
die("数据查询失败!");
}
else
{
if($this->mysqli->affected_rows==0)
{
echo "没有符合条件的数据!";
}
else
{
return $this->res;
}
}
} public function update($sql)
{
$this->res=$this->mysqli->query($sql,$this->mysqli->conn);
//echo "受影响的行数是:".$this->mysqli->affected_rows."<br/>";
if(!$this->res)
{
echo "数据更新失败!";
}
} public function getinsertid()
{
return $this->mysqli->insert_id;
}
public function getconn()
{
return $this->conn;
}
public function getres()
{
return $this->res;
}
public function close_conn($conn)
{
$this->mysqli->close();
}
public function close_res($res)
{
$this->res->free();
}
} ?>

二、事务回滚操作

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

 <?php

 //有疑问:不能实现回滚的原因是什么?数据库的存储引擎不符合要求,不支持事务处理
//创建数据库连接对象
$mysqli=new mysqli('localhost','root','5a6f38','users');
//将mysql数据库的自动提交设置false
$mysqli->autocommit(false);
//设置sql指令
$sql1="update account set account=account-2 where name='zhangsan'";
$sql2="update account set account=account+2 where name='lisi'";
//执行指令
$r1=$mysqli->query($sql1);
$r2=$mysqli->query($sql2);
//判断结果
if(!$r1||!$r2)
{
//两个sql语句执行中至少有一个错误,回滚处理
$mysqli->rollback();
echo "转账失败!回滚处理!";
}
else
{
$mysqli->commit();
$mysqli->close();
echo "转账成功!";
}
?>

三、批量查询

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

实例代码如下:

 <?php
//1.创建msyqli对象
$mysqli=new mysqli("localhost","root","5a6f38","users");
if(mysqli_connect_error())
{
die("数据库连接失败:".mysqli_connect_error());
}
//2.创建批量查询语句
$sqls="select * from user1;";
$sqls.="show columns from user1";
//3.处理结果
$res=$mysqli->multi_query($sqls);
if($res)//如果条件成立说明至少有一个结果被返回
{
do
{
echo "*********************查询到的新表******************<br/>";
echo "<br/>标志变量<br/>";
$result=$mysqli->store_result();//$result是mysqli result对象
while($row=$result->fetch_row())
{
foreach($row as $value)
{
echo "--$value";
}
echo "<br/>";
}
$result->free();
if(!$mysqli->more_results())//如果没有下一个查询,则停止取下一个查询的结果。
{
break;
}
echo "<br/><br/>"; }
while($mysqli->next_result());//指针后移,并判断是否为空
}
else
{
echo "数据查询失败!";
}
$mysqli->close();
?>

四、预编译技术

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

问题的提出:

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

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

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

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

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

1.防止sql注入

2.执行速度快

有和两条好处就足够了。

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

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

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

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

 <?php
//创建mysqli对象
$mysqli=new mysqli("localhost","root","5a6f38","users");
//创建预编译对象
$sql="insert into user1 (name,password,age,email) values (?,?,?,?)";
$mysqli_stmt=$mysqli->prepare($sql); //创建参数并绑定
$name="lisi";
$password="6f6f6f";
$age=40;
$email="1659653731@qq.com";
$mysqli_stmt->bind_param("ssis",$name,$password,$age,$email); //执行函数
execute_prepared($mysqli_stmt,$mysqli); //创建参数并绑定
$name="zhangsan";
$password="6f6f6f";
$age=40;
$email="1659653731@qq.com";
$mysqli_stmt->bind_param("ssis",$name,$password,$age,$email); //执行函数
execute_prepared($mysqli_stmt,$mysqli); //反复执行即可完成插入操作 $mysqli->close(); function execute_prepared(&$mysqli_stmt,&$mysqli)
{
//执行语句
$result=$mysqli_stmt->execute();
//验证是否成功
if(!$result)
{
die("操作失败!".$mysqli_stmt->error);
}
else
{
echo "操作成功!<br/>";
//打印验证
printf_all($mysqli);
}
}
function printf_all(&$mysqli)
{
$sql="select * from user1";
$res=$mysqli->query($sql);
while($row=$res->fetch_row())
{
foreach($row as $value)
{
echo "$value&nbsp;&nbsp;&nbsp;";
}
echo "<br/>";
}
$res->free();
}
?>

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

 <?php
//创建mysali对象
$mysqli=new mysqli("localhost","root","5a6f38","users");
if(mysqli_connect_error())
{
die("数据库连接失败!".mysqli_connect_error());
}
//创建预编译对象
$sql="select * from user1 where id>?";
$mysqli_stmt=$mysqli->prepare($sql);
//绑定参数
$id=15;
$mysqli_stmt->bind_param("i",$id);
//绑定结果集
$mysqli_stmt->bind_result($id,$name,$password,$email,$age);
//执行
$mysqli_stmt->execute();
//取出绑定的值
while($mysqli_stmt->fetch())
{
echo "$id&nbsp;&nbsp;&nbsp;$name&nbsp;&nbsp;&nbsp;
$password&nbsp;&nbsp;&nbsp;$email&nbsp;&nbsp;&nbsp;$age<br/>";
}
//释放结果集
$mysqli_stmt->free_result();
//删除在数据库中的预编译文件
$mysqli_stmt->close();
//关闭和数据库的连接
$mysqli->close();
?>

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

 <?php
$database="users";
$sql="select * from user1";
printf_table($database,$sql);
function printf_table($database,$sql)
{
//创建$mysqli对象。
$mysqli=new mysqli("localhost","root","5a6f38",$database);
if(mysqli_connect_error())
{
die("数据库连接失败!失败信息:".mysqli_connect_error());
}
//获取结果集
$res=$mysqli->query($sql);
//获取行数
$row_nums=$res->num_rows;
//获取列数
$column_nums=$res->field_count;
//打印表头信息
echo "<center><table cellpadding='10' cellspacing='1' bgcolor='black'>";
echo "<tr bgcolor='white'>";
while($field=$res->fetch_field())//$field是列属性对象
{
echo "<th>$field->name</th>";
}
echo "</tr>";
//取出表体数据
while($row=$res->fetch_row())
{
echo "<tr bgcolor='white'>";
foreach($row as $value)
{
echo "<td>$value</td>";
}
echo "</tr>";
}
echo "</table></center>";
//释放资源
$res->free();
//断开连接
$mysqli->close();
}
?>

【PHP&&mysqli】的更多相关文章

  1. 如何结合自己本地数据库,使用【百度地图】API

    如何结合自己本地数据库,使用[百度地图]API百度地图使用越来越多,官网上的示例数据都是写死的,实际上我们的开发中的数据都是从数据库中取出来的,最近看了很多大神的文章,结合自己本地数据库使用百度地图A ...

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

    [步骤分析] 1.在PHP源码包下定位到指定位置:源码包/ext/mysqli 注1:网上很多地方红字部分是mysql,其实PHP5以后已经不用mysql了. 2.运行:/usr/local/php/ ...

  3. 【AR实验室】mulberryAR : ORBSLAM2+VVSION

    本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 mulberryAR是我业余时间弄的一个AR引擎,目前主要支持单目视觉SLAM+3D渲染,并且支持iOS端,但是该引 ...

  4. 【.net 深呼吸】细说CodeDom(1):结构大观

    CodeDom 是啥东东?Html Dom听过吧,XML Dom听过吧.DOM一般可翻译为 文档对象模型,那 Code + DOM呢,自然是指代码文档模型了.如果你从来没接触过 CodeDom,你大概 ...

  5. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  6. 【前端性能】高性能滚动 scroll 及页面渲染优化

    最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作. 本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的 ...

  7. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  8. 【.net 深呼吸】程序集的热更新

    当一个程序集被加载使用的时候,出于数据的完整性和安全性考虑,程序集文件(在99.9998%的情况下是.dll文件)会被锁定,如果此时你想更新程序集(实际上是替换dll文件),是不可以操作的,这时你得把 ...

  9. 【.net 深呼吸】跨应用程序域执行程序集

    应用程序域,你在网上可以查到它的定义,凡是概念性的东西,大伙儿只需要会搜索就行,内容看了就罢,不用去记忆,更不用去背,“名词解释”是大学考试里面最无聊最没水平的题型. 简单地说,应用程序域让你可以在一 ...

随机推荐

  1. Delphi 中的 procedure of object

    转载:http://www.cnblogs.com/ywangzi/archive/2012/08/28/2659811.html 总结:TMyEvent = procedure of object; ...

  2. Raspberry Pi 配置笔记二

    配置源 http://blog.chinaunix.net/uid-21658993-id-4702322.html deb http://ipv4.mirrors.ustc.edu.cn/raspb ...

  3. faad解码aac

    // faad2.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <cassert> #include <io ...

  4. MQTT V3.1----publish解读

    客户端/服务器的发布消息行为,与PUBLISH相关的消息类型: PUBLISH 客户端发布消息经由服务器分发到所有对应的订阅者那里.一个订阅者可以订阅若干个主题(Topic name),但一个PUBL ...

  5. javascript 数组去重

    2015年5月15日 20:17:05 星期五 原理: .......(说不清楚, 自己看代码吧, 很简单.....) //去重 var hash_already_input = {}; for (v ...

  6. ACM/ICPC 之 差分约束系统两道(ZOJ2770-POJ1201)

    当对问题建立数学模型后,发现其是一个差分方程组,那么问题可以转换为最短路问题,一下分别选用Bellmanford-SPFA解题 ZOJ2770-Burn the Linked Camp //差分约束方 ...

  7. stream的seek方法实例

    using (FileStream outStream = new FileStream(@"D:\12.txt", FileMode.Open)) { using (FileSt ...

  8. [Error] Error parsing XML: unbound prefix

    发生该错误的代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...

  9. JavaScript实现字符串的contains函数

    JavaScript实现字符串的contains函数 / *  * string:原始字符串  * substr:子字符串  * isIgnoreCase:忽略大小写  * / function co ...

  10. 【leetcode】Merge Two Sorted Lists(easy)

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...