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

原文地址:https://www.cnblogs.com/wanglijun/p/9458890.html

时间: 2024-08-22 14:40:47

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", '

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中活跃 仅

php的mysql\mysqli\PDO(二)mysqli

原文链接:http://www.orlion.ga/1147/ mysqli有面向对象风格和面向过程风格,个人感觉还是用面向对象风格比较好(毕竟是面向对象) 1.mysqli::_construct() mysqli::__construct ([ string $host = ini_get("mysqli.default_host") [, string $username = ini_get("mysqli.default_user") [, string $

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',

PHP学习之Mysql 和Mysqli区别

(1)Mysql和Mysqli的区别是: mysqli连接是永久连接,而mysql是非永久连接.      mysql连接:每当第二次使用的时候,都会重新打开一个新的进程.      mysqli连接:一直都只使用同一个进程.      好处:这样就可以很大程度的减轻服务器压力. (2)mysql_connect与mysql_pconnect与mysqli_connect:    mysql_pconnect打开的连接不会关闭(即使调用mysql_close也不会关闭,因为对其无效),    类

PDO(PHP Data Object),Mysqli,以及对sql注入等问题的解决

这篇是上一篇 http://www.cnblogs.com/charlesblc/p/5987951.html 的续集. 看有的文章提到mysqli和PDO都支持多重查询,所以下面的url会造成表数据被删. http://localhost:8080/test.php?id=3;delete%20from%20users 可是我在mysql版本的函数,上面的sql都不能执行.是不是不支持多重查询了? 这篇文章 http://www.runoob.com/php/php-mysql-connect