深入分析mysql与mysqli的不同之处

 更新时间:2016年11月25日 16:34  点击:1682
php中mysql与mysqli对于数据库的连接操作是有所区别的,从最基于的区别来看是ysqli 连接是永久连接,而mysql是非永久连接了,下面我们来深入的分析它们两的区别哦。

首先,两个函数都是用来处理数据库操作的。

mysqli 连接是永久连接,而mysql是非永久连接。

mysql连接每当第二次使用时,都会重新打开一个新的进程,而mysqli则只使用同一个进程,可以很大程度的减轻服务器端压力。

其次,mysqli封装了诸如事务等一些高级操作,同时封装了数据库操作过程中的很多可用的方法。

具体查看 http://cn.php.net/mysqli

在实际使用中,较多使用到mysqli的事务。

例子:

 

 代码示例:

$mysqli = new mysqli('localhost','root','','DB_Lib2Test');

$mysqli->autocommit(false);//开始事物

$mysqli->query($sql1);

$mysqli->query($sql2);

if(!$mysqli->errno){

$mysqli->commit();

  echo 'ok';

}else{

echo 'err';

 $mysqli->rollback();

}

第二部分,php中关于mysqli和mysql区别

php-mysql 是 php 操作 mysql 资料库最原始的 extension ,php-mysqli 的 i 代表 improvement ,提更了相对进阶的功能,就 extension 而言,本身也增加了安全性。而 pdo (php data object) 则是提供了一个 abstraction layer 来操作资料库。

例子:

 

 代码示例:

<?php

mysql_connect($db_host, $db_user, $db_password);

mysql_select_db($dn_name);

$result = mysql_query("SELECT `name` FROM `users` WHERE `location` = '$location'");

while ($row = mysql_fetch_array($result, MYSQL_ASSOC))

{

echo $row['name'];

}

mysql_free_result($result);

?>

这种方式不能 Bind Column ,以前例的 SQL 叙述来说,$location 的地方容易被 SQL Injection。后来于是发展出了 mysql_escape_string() (备注:5.3.0之后弃用) 以及 mysql_real_escape_string() 来解决这个问题,不过这麽一搞,整个叙述会变得?杂且丑陋,而且如果栏位多了,可以想见会是怎样的情形…

例子:

 

 代码示例:

<?php

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",

mysql_real_escape_string($user),

mysql_real_escape_string($password));

mysql_query($query);

?>

在 php-mysqli 中有了不少进步,除了透过 bind column 来解决上述问题,而且也多援 transaction, multi query ,并且同时提供了 object oriented style (下面这段 php-mysqli 范例的写法) 和 procedural style (上面 php-mysql 范例的写法)两种写法…等等。

例子:

 

 代码示例:

<?php

$mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);

$sql = "INSERT INTO `users` (id, name, gender, location) VALUES (?, ?, ?, ?)";

$stmt = $mysqli->prepare($sql);

$stmt->bind_param('dsss', $source_id, $source_name, $source_gender, $source_location);

$stmt->execute();

$stmt->bind_result($id, $name, $gender, $location);

while ($stmt->fetch())

{

echo $id . $name . $gender . $location;

}

$stmt->close();

$mysqli->close();

?>

但看到这边又发现了一些缺点,例如得 bind result,这个就有点多馀,不过这其实无关紧要,因为最大的问题还是在于这不是一个抽象(abstraction)的方法,所以当后端更换资料库的时候,就是痛苦的开始…

于是 pdo 就出现了(备注:目前 ubuntu 和 debian 来说,pdo 并没有直接的套件可以安装,而是必须透过 pecl 安装)。

 

 代码示例:

roga@carlisten-lx:~$ pecl search pdo

=======================================

Package Stable/(Latest) Local

PDO 1.0.3 (stable) PHP Data Objects Interface.

PDO_4D 0.3 (beta) PDO driver for 4D-SQL database

PDO_DBLIB 1.0 (stable) FreeTDS/Sybase/MSSQL driver for PDO

PDO_FIREBIRD 0.2 (beta) Firebird/InterBase 6 driver for PDO

PDO_IBM 1.3.2 (stable) PDO driver for IBM databases

PDO_INFORMIX 1.2.6 (stable) PDO driver for IBM Informix INFORMIX databases

PDO_MYSQL 1.0.2 (stable) MySQL driver for PDO

PDO_OCI 1.0 (stable) Oracle Call Interface driver for PDO

PDO_ODBC 1.0.1 (stable) ODBC v3 Interface driver for PDO

PDO_PGSQL 1.0.2 (stable) PostgreSQL driver for PDO

PDO_SQLITE 1.0.1 (stable) SQLite v3 Interface driver for PDO

pdo_user 0.3.0 (beta) Userspace driver for PDO

当透过 pecl 安装装好后,就可以透过以下方式来操作资料库:

 

 代码示例:

<?php

$dsn = "mysql:host=$db_host;dbname=$db_name";

$dbh = new PDO($dsn, $db_user, $db_password);

$sql = "SELECT `name`, `location` FROM `users` WHERE `location` = ? , `name` = ?";

$sth = $dbh->prepare($sql);

$sth->execute(array($location, $name));

$result = $sth->fetch(PDO::FETCH_OBJ);

echo $result->name . $result->location;

$dbh = NULL;

?>

乍看之下,pdo 的程式码好像也没有比较短,那到底好处是什麽呢?

1. pdo 连接资料库时透过 connection string 来决定连接何种资料库。

2. pdo 可以透过 pdo::setattribute 来决定连线时的设定,像是 persistent connection, 回传错误的方式(exception, e_warning, null)。甚至是回传栏位名称的大小写…等等。

2. pdo 支援 bind column 的功能,除了基本的 prepare, execute 以外,也可以 bind 单一栏位,并且指定栏位型态。

4. pdo 是 abstraction layer 所以就算更换储存媒介,需要花的功夫比起来是最少的。

可惜的是,??管这些东西都已经出现很久了,但还是不够大众化。我想或许是肇因于大家习惯看坊间的书籍学习,但那些书本往往只会介绍最简单最传统的方式。导致很多人还是在用 mysql 这种方直接连资料库。

最喜爱透过 dbi 来连接资料库,像是 activerecord 以及 propel orm(object-relational mapping)。

例如说以 activerecord 为例,如果要实现这样的 sql 叙述…

insert into `users` (id, name, gender, location) values(1, 'roga', 'male', 'tpe')

以 pdo 来写是:

 

 代码示例:

<?php

$sql = "INSERT INTO `users` (id, name, gender, location) VALUES(?, ?, ?, ?)";

$sth = $dbh->prepare($sql);

$sth->execute(array(1, 'roga', 'male', 'tpe'));

?>

但以 ActiveRecord 来说的话,则是:

 

 代码示例:

<?php

$user = new User();

$user->id = 1;

$user->name = 'roga';

$user->gender = 'male';

$user->location = 'tpe';

$user->save();

?>

后者在语法上是不是简洁很多呢,而且也大幅降低对 SQL 语言的依赖性!(不同资料库对 SQL 实作的问题可参考 Comparison of different SQL implementations)

以上是一些简单的介绍,如有疏漏谬误也欢迎大家补充。

mysql是非持继连接函数而mysqli是永远连接函数。也就是说

mysql每次链接都会打开一个连接的进程而mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销

有些朋友在编程的时候,使用new mysqli('localhost', usenamer', 'password', 'databasename');总是报

错,Fatal error: Class 'mysqli' not found in d:...

mysqli类不是php自带的吗?

不是默认开启的,win下要改php.ini,去掉php_mysqli.dll前的;,linux下要把mysqli编译进去。

一:Mysqli.dll是一个允许以对象的方式或者过程操作数据库的,它的使用方式也很容易。这里就几个常见的操作和 mysql.dll做一个对比。

1、mysql.dll(可以理解为函数式的方式):

 

 代码示例:


$conn = mysql_connect('localhost', 'user', 'password'); //连接mysql数据库

mysql_select_db('data_base'); //选择数据库

 

$result = mysql_query('select * from data_base');//这里有第二个可选参数,指定打开的连接

$row = mysql_fetch_row( $result ) ) //为了简单,这里只取一行数据

echo $row[0]; //输出第一个字段的值

mysqli也有过程式的方式,只不过开始贯以mysqli的前缀,其他都差不多。如果mysqli以过程式的方式操作的话, 有些函数必须指定资源,比如说 mysqli_query(资源标识,SQL语句),并且资源标识的参数是放在前面的,而 mysql_query(SQL语句,'可选')的资源标识是放在后面的,并且可以不指定,它默认是上一个打开的连接或资源。

2、mysqli.dll(对象方式):

 

 代码示例:


$conn = new mysqli('localhost', 'user', 'password','data_base');

//这里的连接是new出来的,最后一个参数是直接指定数据库,不用mysql_select_db()了

//也可以构造时候不指定,然后 $conn -> select_db('data_base')

$result = $conn -> query( 'select * from data_base' );

$row = $result -> fetch_row(); //取一行数据

echo row[0]; //输出第一个字段的值

二、mysql_fetch_row(),mysql_fetch_array()

这两个函数,返回的都是一个数组,区别就是第一个函数返回的数组是只包含值,我们只能$row[0],

$row[1],这样以数组下标来读取数据,而mysql_fetch_array()返回的数组既包含第一种,也包含键值

对的形式,可以这样读取数据,(假如数据库的字段是 username,passwd):

 

 代码示例:

$row['username'], $row['passwd']

而且,如果用($row as $kay => $value)来操作的话,还以直接取得数据库的字段名称。

更主要的是mysqli是php5提供的新函数库,(i)表示改进,其执行速度更快。

PHP连接MSSQL显示中文时为乱码主要是因为编码问题了,我们只要懂得一对于数据库与页面的编码统一处理就可以解决了,下面一起来看看下文。

因为一直在使用 windows 下的 PHP 开发,用的是 mysql 数据库,偶尔也会遇到查询记录的乱码,那是因为 php 编码不支持中文进行导致的,直接将其进行编码解码即可解决,所以在 windows 平台下还是比较容易解决的。

今天在帮一个客户进行 liunx 下维护 mssql 数据库的操作,因站点被攻击的原因,一直无法进行打开站点,折腾了很久,终于连接上mssql了,今天来了尝试下查询,么问题!

可是出来的记录 中文 显示是?号或者就是一堆黑框框,这是典型的编码不对,于是查看了下php.ini关于mssql的这一块配置,发现有一项配置”mssql.charset”这一项,我配置成 “utf8”,成功解决乱码。

因为我的程序页面用的是utf8所以配置成这样,如果是GBK/GB2312 就配置长相应的编码就应该能解决,当然遇到这样的问题还是要看相应情况的,这里还是建议如果能修改配置文件尽可能的去修改配置文件,因为这样才能一劳永逸的解决掉问题。

例子

 代码如下 复制代码

$serverName = "127.0.0.1,1433";
$connectionInfo = array( "UID"=>"sa",
"PWD"=>"123456",
"Database"=>"NopCommerce",
"CharacterSet"=>"UTF-8"); // 这一行是重点
$conn = sqlsrv_connect($serverName, $connectionInfo);

注意事项:

编码常用的是utf8-general-ci
不只是表要统一,要统一的总共有四处
一是:数据库类型,其中包括,数据库,表,字段三处都要统一,可以检查一下
二是:文件的编码类型,你若用dw或editplus可以查看页面编码,不同需修改
三是:访问数据库时的设置既set NAMES utf8;
四是:浏览器显示方式,添加meta属性<meta charset=utf-8>
不管用GBK,GB2312,这四处必须统一,看你缺少了哪一步

用PHP操作MSSQL比在ASP连接MYSQL要简单,所以,当需要MSSQL与MYSQL并存时,用PHP连接MSSQL来操作MYSQL与MSSQL并存比较简单好用.如果是ASP连接MYSQL,需要安装一个MYSQL驱动,默认windows的ODBC没有安装,很遗憾...
1.在web服务器上至少安装了mssql的客户端
2.打开php.ini把;extension=php_mssql.dll前面的分号去掉
有必要话:需要制定extension_dir
3.推荐使用php<=4.0.9<=5.0.3目前我还没有连接成功过4.010和5.0.3
4.数据库的连接分页可以到phpe.net上获取到相应的class

PDO是mysql数据库操作的一个公用类了,我们不需要进行自定类就可以直接使用pdo来操作数据库了,但是在php默认配置中pdo是未开启所以我们必须先在php.ini中开启它才可以使用,下文我会讲到。

PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,
这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据。

PDO支持的PHP版本为PHP5.1以及更高的版本,而且在PHP5.2下PDO默认为开启状态,
下面是在php.ini中PDO的配置:

extension=php_pdo.dll

为了启用对某个数据库的支持,需要在php配置文件中将相应的扩展打开,例如要支持MySQL,需要开启下面的扩展

extension=php_pdo_mysql.dll

这里是使用PDO对mysql进行基本的增删改查操作

程序代码:

 代码如下 复制代码

header("content-type:text/html;charset=utf-8");

$dsn="mysql:dbname=test;host=localhost";
$db_user='root';
$db_pass='admin';

try{
 $pdo=new PDO($dsn,$db_user,$db_pass);
}catch(PDOException $e){
 echo '数据库连接失败'.$e->getMessage();
}

//新增
$sql="insert into buyer (username,password,email) values ('ff','123456','admin@admin.com')";
$res=$pdo->exec($sql);
echo '影响行数:'.$res;


//修改
$sql="update buyer set username='ff123' where id>3";
$res=$pdo->exec($sql);
echo '影响行数:'.$res;

//查询
$sql="select * from buyer";
$res=$pdo->query($sql);

foreach($res as $row){
 echo $row['username'].'<br/>';
}

//删除
$sql="delete from buyer where id>5";
$res=$pdo->exec($sql);
echo '影响行数:'.$res;

下面是一个站长写的一个非常简单实用的数据库操作类了,这里面主要功能是数据库连接,查询数据,删除数据,更新数据等等,这个类的特点时不限制mysql而是直接执行由外部给出的sql语句了。

例子

 代码如下 复制代码

<?php
class SqlTool{
private $conn;
private $host=”localhost”;
private $user=”root”;
private $password=”";
private $db=”bbs”;
function sqlTool(){
$this->conn=mysql_connect(“$this->host”,”$this->user”,”$this->password”);
mysql_select_db($this->db,$this->conn);
mysql_query(“set names gbk”);
}
function executedql($sql){
$res=mysql_query($sql);
return $res;
}
function executedml($sql){
$b=mysql_query($sql);
if(!$b){
echo “操作失败”;
}else{
if(mysql_affected_rows($this->conn)>0){
echo “操作成功”;
}else{
echo “没有影响到行数”;
}
}
mysql_close($this->conn);
}
}
?>

利用php提交员工编号给mysql,然后由mysql把数据接受并利用delete进行数据删除操作了,下面我来给大家分享几个例子。

delete 语句的示例:

 代码如下 复制代码

delete from friends where user_name = 'simaopig';

语法结构中,我们就可以看出,和 update 语法一样,我们是可以省略 where 子句的。不过这是一个很危险的行为。因为如果不指定 where 子句,delete 将删除表中所有的记录,而且是立即删除

1.删除指定编号的员工信息

 代码如下 复制代码

<html>
<head>
</head>
<body>
<center>员工信息表</center>
<table border="1" align='center'>
<thead><tr><th>编号</th><th>姓名</th><th>年龄</th></tr></thead>
<tbody>
<?php
header("Content-type:text/html; charset=utf-8");
$_SESSION['arr']=array('1'=>array('name'=>'张三','age'=>18),'2'=>array('name'=>'李四','age'=>19),'3'=>array('name'=>'王五','age'=>20));
if(!empty($_POST['num'])){
unset($_SESSION['arr'][$_POST['num']]); //删除指定id的员工信息
}
if(isset($_SESSION['arr'])){
foreach ($_SESSION['arr'] as $k => $v) {
echo "<tr><td>".($k)."</td><td>".$v['name']."</td><td>".$v['age']."</td></tr>";
}
}
 
?>
</tbody>
</table>
 
<form method='post' action=""><br>
<center>
<b>输入员工编号:</b>
<input type="text" name="num" size='5'><br>
<input type='submit' value='删除' name='sub' class='btn'>
</center>
</form>
</body>
</html>

2.员工信息批量删除例子

关键技术
本实例的关键点是while()循环语句的灵活运用。根据提交的参数值,执行while()循环语句,在循环体重执行删除操作,完成数据的循环删除操作。
设计过程
(1)创建PHP脚本文件。首先,连接MySQL数据库服务器,连接MySQL中名称为db_while的数据库,并设置页面的编码格式。然后,定义循环变量变量$a和$b,将第1层while循环中的循环条件设置为$b<$a,然后,再次利用while语句循环输出数据表中的数据,并执行数据的删除操作,其代码如下:

 代码如下 复制代码

<?php
if($_POST[sub]){ //通过POST方式获取参数
 $conn=mysql_connect("localhost","root","111"); //连接mysql数据库
 mysql_select_db("db_while",$conn); //连接数据库
 mysql_query("SET NAMES GBK");//定义编码格式
 $a=$_POST[te];//接收文本框参数
 $b=0;//定义变量
while($b<$a){//while循环
 $rs=mysql_query("select * from tb_while");//执行查询操作
 while($rst=mysql_fetch_array($rs)){//将查询结果保存在数组中
$sql="delete * from tb_while where id=$b"; //sql语句
mysql_query($sql);//执行删除操作
echo"姓名为".$rst[name]."的员工已被删除<br>";//输出被删除的员工姓名
$b++
 }
 }

}
?>

(2)将该文件存储于MR266文件夹下,命名为index.php。

[!--infotagslink--]

相关文章

  • MySQL性能监控软件Nagios的安装及配置教程

    这篇文章主要介绍了MySQL性能监控软件Nagios的安装及配置教程,这里以CentOS操作系统为环境进行演示,需要的朋友可以参考下...2015-12-14
  • 详解Mysql中的JSON系列操作函数

    新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询、修改等操作,下面就实际体验一下...2016-08-23
  • 深入研究mysql中的varchar和limit(容易被忽略的知识)

    为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql中遇到的一些commen sense类型的问题。 ...2015-03-15
  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • mysql的3种分表方案

    一、先说一下为什么要分表:当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。根据个人经验,mysql执行一个sql的过程如下:1...2014-05-31
  • Windows服务器MySQL中文乱码的解决方法

    我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B。...2015-03-15
  • MYSQL事务回滚的2个问题分析

    因此,正确的原子操作是真正被执行过的。是物理执行。在当前事务中确实能看到插入的记录。最后只不过删除了。但是AUTO_INCREMENT不会应删除而改变值。1、为什么auto_increament没有回滚?因为innodb的auto_increament的...2014-05-31
  • 用VirtualBox构建MySQL测试环境

    宿主机使用网线的时候,客户机在Bridged Adapter模式下,使用Atheros AR8131 PCI-E Gigabit Ethernet Controller上网没问题。 宿主机使用无线的时候,客户机在Bridged Adapter模式下,使用可选项里唯一一个WIFI选项,Microsoft Virtual Wifi Miniport Adapter也无法上网,故弃之。...2013-09-19
  • Centos5.5中安装Mysql5.5过程分享

    这几天在centos下装mysql,这里记录一下安装的过程,方便以后查阅Mysql5.5.37安装需要cmake,5.6版本开始都需要cmake来编译,5.5以后的版本应该也要装这个。安装cmake复制代码 代码如下: [root@local ~]# wget http://www.cm...2015-03-15
  • 忘记MYSQL密码的6种常用解决方法总结

    首先要声明一点,大部分情况下,修改MySQL密码是需要有mysql里的root权限的...2013-09-11
  • MySQL数据库备份还原方法

    MySQL命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:/Program Files/MySQL/MySQL Server 4.1/bin (或者直接将windows的环境变量path中添加该目录) ...2013-09-26
  • Mysql命令大全(详细篇)

    一、连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysql/bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密...2015-11-08
  • node.js如何操作MySQL数据库

    这篇文章主要介绍了node.js如何操作MySQL数据库,帮助大家更好的进行web开发,感兴趣的朋友可以了解下...2020-10-29
  • Navicat for MySQL 11注册码\激活码汇总

    Navicat for MySQL注册码用来激活 Navicat for MySQL 软件,只要拥有 Navicat 注册码就能激活相应的 Navicat 产品。这篇文章主要介绍了Navicat for MySQL 11注册码\激活码汇总,需要的朋友可以参考下...2020-11-23
  • mysql IS NULL使用索引案例讲解

    这篇文章主要介绍了mysql IS NULL使用索引案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-14
  • Mysql索引会失效的几种情况分析

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)  注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 ...2014-06-07
  • 基于PostgreSQL和mysql数据类型对比兼容

    这篇文章主要介绍了基于PostgreSQL和mysql数据类型对比兼容,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-25
  • RHEL6.5编译安装MySQL5.6.26教程

    一、准备编译环境,安装所需依赖包yum groupinstall 'Development' -y yum install openssl openssl-devel zlib zlib-devel -y yum install readline-devel pcre-devel ncurses-devel bison-devel cmake -y二、编译安...2015-10-21
  • Mysql中 show table status 获取表信息的方法

    这篇文章主要介绍了Mysql中 show table status 获取表信息的方法的相关资料,需要的朋友可以参考下...2016-03-12
  • 20分钟MySQL基础入门

    这篇文章主要为大家分享了20分钟MySQL基础入门教程,快速掌握MySQL基础知识,真正了解MySQL,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-12-02