PDO和MySQLi区别与选择?

当用PHP访问数据库时,除了PHP自带的数据库驱动,我们一般还有两种比较好的选择:PDO和MySQLi。在实际开发过程中要决定选择哪一种首先要对二者有一个比较全面的了解。本文就针对他们的不同点进行分析,并对多数据库类型支持、稳定性、性能等等方面进行对比。


 
PDO MySQLi
Database support 12 different drivers MySQL only
API OOP OOP + procedural
Connection Easy Easy
Named parameters Yes No
Object mapping Yes Yes
Prepared statements 
(client side)
Yes No
Performance Fast Fast
Stored procedures Yes Yes

一、连接

// PDO
$pdo = new PDO("mysql:host=localhost;dbname=database", ‘username‘, ‘password‘);

// mysqli, procedural way
$mysqli = mysqli_connect(‘localhost‘,‘username‘,‘password‘,‘database‘);

// mysqli, object oriented way
$mysqli = new mysqli(‘localhost‘,‘username‘,‘password‘,‘database‘);

二、API 支持

PDO和MySQLi都是通过面向对象的形式提供API,但是同时MySQLi也提供了面向过程的API,这种形式对于新手来说更容易理解。如果你对原生的php mysql 驱动熟悉,你会发现很轻松得就能使用MySQLi的接口来替换原来的数据访问。用PDO的好处是,PDO支持多种数据库,而MySQLi只支持MySQL,一但你掌握了就你可以随心所欲的使用连接多种数据库。

三、数据库的支持

PDO比MySQLi最大的优点就是PDO支持很多种数据库,而MySQLi只支持MySQLi。要看PDO支持哪些数据库用下面的代码:

var_dump(PDO::getAvailableDrivers());

支持多数据库有什么好处呢?当你的程序以后想从mysql换成sql server或者oracle时,PDO的优势就能体现出来了,因为换数据库对于程序接口是透明的,php代码改动很小,如果你是用MySQLi,那么所有用到数据库的地方都要重写,这样的改动我也只能呵呵了。

四、命名参数支持

PDO命名参数及参数绑定:

$params = array(‘:username‘ => ‘test‘, ‘:email‘ => $mail, ‘:last_login‘ => time() - 3600);

$pdo->prepare(‘
    SELECT * FROM users
    WHERE username = :username
    AND email = :email
    AND last_login > :last_login‘);

$pdo->execute($params);

而MySQLi的参数绑定:

$query = $mysqli->prepare(‘
    SELECT * FROM users
    WHERE username = ?
    AND email = ?
    AND last_login > ?‘);

$query->bind_param(‘sss‘, ‘test‘, $mail, time() - 3600);
$query->execute();

我们从上面对比就可以看出PDO是通过命名参数进行值的绑定,而MySQLi的参数绑定是通过点位符“?”并严格按这个问号的顺序来绑定值。这样虽然代码显得没有PDO那种通过名字对应那么长,但是有一个不好的地方是可读性和可维护性都降低了,参数个数比较少的时候还不觉得,当参数上了10多个或者更多的情况就比较痛苦了,你必须要按问号的顺序来一个一个对应来赋值,万一其中一个位错了,后面的都跟着错了。

不幸的是MySQLi不支持PDO那样的命名参数绑定。

五、对象映射(Object Mapping)

基于数据库的开发一般都是从数据库中读取数据然后把这些数据用一个对象来承载。PDO和MySQLi都支持对象映射,假设有一个User类,它有一些属性对应到数据库。

class User {
    public $id;
    public $first_name;
    public $last_name;

    public function info()
    {
        return ‘#‘.$this->id.‘: ‘.$this->first_name.‘ ‘.$this->last_name;
    }
}

如果没有对象映射,我们要读取数据之后,一个一个字段的赋值,这是很繁琐的。

下面请看二者使用对象的代码:

$query = "SELECT id, first_name, last_name FROM users";

// PDO
$result = $pdo->query($query);
$result->setFetchMode(PDO::FETCH_CLASS, ‘User‘);

while ($user = $result->fetch()) {
    echo $user->info()."\n";
}
// MySQLI, procedural way
if ($result = mysqli_query($mysqli, $query)) {
    while ($user = mysqli_fetch_object($result, ‘User‘)) {
        echo $user->info()."\n";
    }
}
// MySQLi, object oriented way
if ($result = $mysqli->query($query)) {
    while ($user = $result->fetch_object(‘User‘)) {
        echo $user->info()."\n";
    }
}

六、安全性

二者都可以防止sql注入。我们先看一个例子。

$_GET[‘username‘] = "‘; DELETE FROM users; /*"

当用户输入的username参数的值为上面的值("‘; DELETE FROM users; /*"),如果你没有对这个值做任何处理,用户就成功将delete语句注入,那么user表的记录就会被全部删除。

6.1、手动转义

// PDO, "manual" escaping
$username = PDO::quote($_GET[‘username‘]);

$pdo->query("SELECT * FROM users WHERE username = $username");

// mysqli, "manual" escaping
$username = mysqli_real_escape_string($_GET[‘username‘]);

$mysqli->query("SELECT * FROM users WHERE username = ‘$username‘");

上面采用了PDO和MySQLi的API自带的函数对获取到的参数的值进行了转义。

6.2、prepared statement参数绑定

下面推荐更加高效安全的prepared statement参数绑定的方式:

// PDO, prepared statement
$pdo->prepare(‘SELECT * FROM users WHERE username = :username‘);
$pdo->execute(array(‘:username‘ => $_GET[‘username‘]));

// mysqli, prepared statements
$query = $mysqli->prepare(‘SELECT * FROM users WHERE username = ?‘);
$query->bind_param(‘s‘, $_GET[‘username‘]);
$query->execute();

七、性能

由于PDO能够支持其它非MySQL的数据库,而MySQLi专门针对MySQL设计的,所以MySQLi相对于PDO性能稍微好一些。但是PDO和MySQLi都还是没有PHP原生的MySQL扩展快。但是这样性能比较其实意义不太大,因为它们都是相当快了,如果你的程序性能要求不是特别苛刻话,三者都可以满足你。至于你要选择哪一种就要你根据的实践情况进行权衡。

八、总结

PDO支持12种数据库驱动和命名参数绑定是其最大优点,通过上面的对比,我相信你也知道了你在自己的项目中会使用哪一种连接数据库了?

时间: 2024-10-12 15:25:43

PDO和MySQLi区别与选择?的相关文章

PDO和MySQLi区别和数度;到底用哪个?

当用PHP访问数据库时,除了PHP自带的数据库驱动,我们一般还有两种比较好的选择:PDO和MySQLi.在实际开发过程中要决定选择哪一种首先要对二者有一个比较全面的了解.本文就针对他们的不同点进行分析,并对多数据库类型支持.稳定性.性能等等方面进行对比.   PDO MySQLi Database support 12 different drivers MySQL only API OOP OOP + procedural Connection Easy Easy Named paramete

PDO和MySQLi , MySQL区别与选择?

当用PHP访问数据库时,除了PHP自带的数据库驱动,我们一般还有两种比较好的选择:PDO和MySQLi.在实际开发过程中要决定选择哪一种首先要对二者有一个比较全面的了解.本文就针对他们的不同点进行分析,并对多数据库类型支持.稳定性.性能等等方面进行对比. PDO MySQLi Database support 12 different drivers MySQL only API OOP OOP + procedural Connection Easy Easy Named parameters

PDO vs. MySQLi 选择哪一个?(PDO vs. MySQLi: Which Should You Use?)-转载

用Php访问数据的时候,你选择MySQLi和PDO,在选择之前,你应该知道些什么呢? 这篇文章将会介绍这两种方式的不同点,数据库的支持.稳定性.性能等问题. 概述   PDO MySQLi Database support 12 different drivers MySQL only API OOP OOP + procedural Connection Easy Easy Named parameters Yes No Object mapping Yes Yes Prepared stat

PDO和mysqli对比

PHP中,如何选择PDO和mysqli呢?本文做个简单的比较 1)总的比较   PDO MYSQLI 数据库支持 12种不同的数据库支持 支持MYSQL API OOP OOP和过程 命名参数 支持 不支持 对象映射支持 支持 支持 preparestment 支持 不支持 支持存储过程 支持 支持       2  连接方式  先来看下两者连接数据库的方式: // PDO $pdo = new PDO("mysql:host=localhost;dbname=database", '

atitit.html5 vs 原生 app的区别与选择

atitit.html5  vs 原生 app的区别与选择 1. html5的优点 1 1.1. 最大优势::在跨平台(ios苹果,android安卓等) 1 1.2. 开放性 1 1.3. 快速的更新,热更新 2 1.4. 开发成本上 2 1.5. 碎片化 2 2. 原生app 应用的优点 2 2.1. 对游戏等要求性能的app更好 2 2.2. 原生应用最大的优势就是可以访问设备中的所有功能 2 2.3. 对摄像头.电话本,相机,游戏等操作支持的好,对语音,联系人和日历,也支持比较好. 2

查看Eclipse版本号的方法及各个版本区别 Eclipse选择标准

这篇文章主要介绍了查看Eclipse版本号的方法及各个版本区别 Eclipse选择标准,方便初学者选择适合自己的版本,需要的朋友可以参考下 Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK). 查看Eclipse版本号的方法 1. 找到eclipse安装目录 2. 进入readme文件夹,打

MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比

原文:MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比 1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不是事务安全的,而且不支持外键,如果执行大量的select,insert MyISAM比较适合. 2.InnoDB:支持事务安全的引擎,支持外键.行锁.事务是他的最大特点.如果有大量的update和insert,建议使用InnoD

php pdo和mysqli对比选择

1)总的比较   PDO MySQLi 数据库支持 12种不同的数据库支持 支持MySQL API OOP OOP + 过程 Connection Easy Easy 命名参数 支持 不支持 对象映射支持 支持 支持 预处理语句 (客户端) 支持 不支持 性能 快 快 支持存储过程 支持 支持 2 连接方式 先来看下两者连接数据库的方式: // PDO $pdo = new PDO("mysql:host=localhost;dbname=database", 'username',

PDO PDO_MYSQL MYSQLI MYSQL 的区别

MYSQL,MYSQLI 这两个扩展本身就是访问MYSQL数据库的驱动 PDO则是一个抽象层概念 PDO_MYSQL 和 MySQL Native(mysqlnd)是实现了PDO接口的MYSQL数据库驱动 从下表可以看出他们之间是怎样的并列关系   PHP的mysqli扩展 PDO (使用PDO MySQL驱动和MySQL Native驱动) PHP的mysql扩展 引入的PHP版本 5.0 5.0 3.0之前 PHP5.x是否包含 是 是 是 MySQL开发状态 活跃 在PHP5.3中活跃 仅