PHPMySQL扩展(优缺点)

设计开发允许PHP应用与MySQL数据库交互的早期扩展。mysql扩展提供了一个面向过程 的接口;

并且是针对MySQL4.1.3或更早版本设计的。因此,这个扩展虽然可以与MySQL4.1.3或更新的数 ;

据库服务端 进行交互,但并不支持后期MySQL服务端提供的一些特性。

PHP的mysqli扩展

mysqli扩展,我们有时称之为MySQL增强扩展,可以用于使用 MySQL4.1.3或更新版本中新的高级特性;

mysqli扩展在PHP 5及以后版本中包含;

mysqli扩展有一系列的优势,相对于mysql扩展的提升主要有:面向对象接口、 prepared语句支持、多语句执行支持、事务支持、增强的调试能力、嵌入式服务支持。

PHP数据对象(PDO)

PHP数据对象,是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口可以,使得你的PHP应用不去关心具体要 连接的数据库服务器系统类型。也就是说,如果你使用PDO的API,可以在任何需要的时候无缝切换数据库服务器。

下面是我这个星期做过的几种数据库连接的方式:

Mysql连接:

1
2
3
4
5
6
7
8
9
10
11
<?php
 
$conn = @ mysql_connect("localhost""root"""or die("数据库连接错误");
 
mysql_select_db("bbs"$conn);
 
mysql_query("set names 'utf8'");
 
echo "数据库连接成功";
 
?>

Mysqli连接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
 
$conn = mysqli_connect('localhost''root''''bbs');
 
if(!$conn){
 
die("数据库连接错误" . mysqli_connect_error());
 
}else{
 
echo"数据库连接成功";
 
}
 
?>

Pdo连接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
 
try{
 
$pdo=new pdo("mysql:host=localhost;dbname=bbs","root","");
 
}catch(PDDException $e){
 
echo"数据库连接错误";
 
}
 
echo"数据库连接成功";
 
?>

以下是我在网站看到的Mysql、Mysqli、Pdo三种方式的区别对比

*********************************************************************************************************************************
PHP-MySQL 是 PHP 操作 MySQL 资料库最原始的 Extension ,PHP-MySQLi 的 i 代表 Improvement ,

提更了相对进阶的功能,就 Extension 而言,本身也增加了安全性。

而 PDO (PHP Data Object) 则是提供了一个 Abstraction Layer 来操作资料库

1.mysql与mysqli

mysqli是php5提供的新函数库,(i)表示改进,其执行速度更快.当然也更安全

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是一个允许以对象的方式或者过程操作数据库的,它的使用方式也很容易。这里就几个常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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()来解决这个问题,不过这麽一搞,整个叙述会变得複杂且丑陋,而且如果栏位多了,可以想见会是怎样的情形…

1
2
3
4
5
6
7
8
9
10
11
<?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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?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 就出现了

2.PDO与mysql

PDO是PHP5.1之后才支持的,他为访问数据库采用了一致性的接口。但是国内众多的开源程序都是

使用MySQL的extension所提供的function连接数据库,进行查询。PDO功能强大为何国内成熟的PHP系统都不使用呢?

问过几个朋友为啥用PDO,答案是“快”,PDO连接数据库会快么?为什么使用PDO?他们两种方式有什么区别?首先还是比较关心的性能问题.写了1个脚本测试向MySQL插入100万条数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
 
$link
= mysql_connect("localhost""root""root"or
die('mysql connect error');
 
$num
= 100000;
 
$dsn
"mysql:host=127.0.0.1;dbname=performace_test";
 
$db
new
PDO($dsn'root''root'array(PDO::ATTR_PERSISTENT => true));
 
mysql_query('TRUNCATE TABLE `performace_test`.`myquery`',$link);  //Truncate Table
 
$query
"INSERT INTO `performace_test`.`myquery`(`goods_id`,`cat_id`,`click_count`,`goods_number`,`goods_weight`,`goods_sn`,`goods_name`,`goods_reason`,`brand_name`,`goods_thumb`,`brand_id`,`is_on_sale`,`wap_cod`,`wap_title`,`wap_detail`,`wap_flag`,`wap_onsale`,`shop_price`,`cost_price`,`channel_rate`,`channel_onsale`,`add_time`,`is_main`,`last_update`,`brand_logo`) VALUES ( ’80′,’298′,’65′,’100′,’0.125′,’SMT000080′,’健康′,”,’健康120’,'images/201004 /thumb_img/80_thumb_G_1272071721054.jpg’,’1′,’0′,’0′,NULL,NULL,NULL,’0′,’2980.00′,’0.00′,’1.250000′,’1′,’1271612064′,’0′,’1297624384′,’1293649512083026412.jpg’)";
 
$start_time
= microtime(true);
 
for($i=0;$i<$num;$i++)
 
{
 
mysql_query($query,$link);
 
}
 
echo
"USE MySQL extension: ". (microtime(true)-$start_time);
 
mysql_query(‘TRUNCATE TABLE `performace_test`.`myquery`’,$link);  //Truncate Table
 
$start_time
= microtime(true);
 
for($i=0;$i<$num;$i++)
 
{
 
$db->exec($query);
 
}
 
echo
"\r\nUSE PDO : ". (microtime(true)-$start_time);
 
?>

USE MySQL extension: 95.233189106s

USE PDO : 99.1193888187s

在链接MySQL上几乎没有区别。PDO的性能损失完全可以忽略不计。

但是却有非常多的操作却是MySQL扩展库所不具备的:

1:PDO真正的以底层实现的统一接口数库操作接口

2:PDO支持更高级的DB特性操作,如:存储过程的调度等,mysql原生库是不支持的.

3:PDO是PHP官方的PECL库,兼容性稳定性必然要高于MySQL Extension,可以直接使用 pecl upgrade pdo 命令升级.

PHP6默认也是使用PDO进行数据库链接,MySQL Extension会作为辅助。所以我们在日常项目中,如果环境允许,尽可能去使用PDO来进行MySQL数据库操作。

MYSQL MYSQLI PDO的更多相关文章

  1. PHP 数据库连接 (Mysql Mysqli PDO)

    1.PHP与Mysql扩展(本扩展自 PHP 5.5.0 起已废弃,并在将来会被移除),PHP原生的方式去连接数据库,是面向过程的 <?php $mysql_conf = array( 'hos ...

  2. php连接MySQL数据库的三种方式(mysql/mysqli/pdo)

    引言 PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案 ...

  3. php的mysql\mysqli\PDO(三)PDO

    原文链接:http://www.orlion.ga/1153/ PDO是一种数据库抽象层,不止可以访问mysql还可以访问其他数据库. 一.__construct() PDO::__construct ...

  4. php的mysql\mysqli\PDO(二)mysqli

    原文链接:http://www.orlion.ga/1147/ mysqli有面向对象风格和面向过程风格,个人感觉还是用面向对象风格比较好(毕竟是面向对象) 1.mysqli::_construct( ...

  5. php的mysql\mysqli\PDO(一)mysql

    原文链接:http://www.orlion.ga/1140/ 工作中数据库的操作都被封装好了,这些怎么用的都快忘了干脆写篇博客重新复习下,以后要是再忘记了可以看这篇文章. PHP 5.5.0 起已废 ...

  6. SQL注入实验,PHP连接数据库,Mysql查看binlog,PreparedStatement,mysqli, PDO

    看到有人说了判断能否sql注入的方法: 简单的在参数后边加一个单引号,就可以快速判断是否可以进行SQL注入,这个百试百灵,如果有漏洞的话,一般会报错. 下面内容参考了这两篇文章 http://blog ...

  7. mysqli和mysql和pdo查询

      mysql mysql_connect($db_host, $db_user, $db_password); mysql_select_db($dn_name); $result = mysql_ ...

  8. PHP操作mysql(mysqli + PDO)

    [Mysqli面向对象方式操作数据库] 添加.修改.删除数据 $mysqli ','test'); $mysqli->query('set names utf8'); //添加数据 $resul ...

  9. 封装数据库mysql, mysqli

    <?php header("content-type:text/html;charset=utf-8"); class db{    //私有的静态属性    private ...

随机推荐

  1. js文件报错Syntax error on token "Invalid Regular Expression Options", no accurate correction

    Syntax error on token "Invalid Regular Expression Options", no accurate correction 1.选中报错的 ...

  2. win2008server R2 x64 部署.net core到IIS

    1.下载sdk 和.NET Core Windows Server Hosting   https://www.microsoft.com/net/download  2.出现HTTP 错误 500. ...

  3. 单机版 RedisPoolUtil({基本操作封装工具类})【一】

    <!--集成的RedisJAR--> <!--引入jedis需的jar包--> <dependency> <groupId>redis.clients& ...

  4. 分享知识-快乐自己:java代码 操作 solr

    POM 文件: <!-- solr客户端 --> <dependency> <groupId>org.apache.solr</groupId> < ...

  5. Redis-benchmark使用总结

    Redis-benchmark为Redis性能测试工具. 指令说明: Usage: redis-benchmark [-h <host>] [-p <port>] [-c &l ...

  6. codeforces 29D Ant on the Tree (dfs,tree,最近公共祖先)

    D. Ant on the Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. C++中抽象类和多继承

    C++中没有java中接口的概念,但是可以使用抽象类来模拟java中的接口. 工程上的多继承 工程开发中的多继承几乎是不被使用的 多继承带来的代码的复杂性,远远大于其代码带来的便利性. 多继承对代码的 ...

  8. Java中日期和时间的相关问题

    1.java.lang.System类 System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位 ...

  9. 解决苹果手机Safari浏览器下 字体显示为 蓝色的 问题

    解决苹果手机 Safari浏览器下   字体显示为蓝色的 问题 近期测试同学测试,wap站上,底部文字在苹果8上面 ,使用 Safari浏览器打开,一直显示 蓝色字体 其他正常,寻找半天无解,最后 阳 ...

  10. 第K大子集-LH

    题解:搜索+二分 对于每个数有选与不选两种情况.然后我们先搜前一半的状态,每个数选还是不选. 有2^17种,然后我将每种状态拍一个序先存着.然后我再搜后一半的状态,2^18种. 假设后一半某一种情况的 ...