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 statements 
(client side)
Yes No
Performance Fast Fast
Stored procedures Yes Yes

链接

下面是两种连接数据库的方式

[php] view plaincopy

  1. // PDO
  2. $pdo = new PDO("mysql:host=localhost;dbname=database", ‘username‘, ‘password‘);
  3. // mysqli, procedural way
  4. $mysqli = mysqli_connect(‘localhost‘,‘username‘,‘password‘,‘database‘);
  5. // mysqli, object oriented way
  6. $mysqli = new mysqli(‘localhost‘,‘username‘,‘password‘,‘database‘);

(请注意,这两个连接将贯穿全文)

API支持

PDO和MySQLi都提供了面向对象的API,但是MySQLi也提供了面向过程编程的API(就是函数式)所以对于新手非常易于理解,如果你使用原始的MySQL的API,那么迁移到MySQLi也非常容易。另一方面,一旦你选择了PDO,你就可以用在任何你想要使用的数据库上。

数据库支持

PDO比MySQLi的核心优势在于数据库的驱动支持上。再写这篇文章的时候,PDO支持12种数据库驱动,而MySQLi只支持MySQL。

通过下面的代码可以打印出当前PDO支持的数据库驱动

[php] view plaincopy

  1. var_dump(PDO::getAvailableDrivers());

这意味着什么?

如果你选择了使用PDO的方式,当需要换数据库的时候,遇到不存在或者不支持的方法,你只需要更改连接字符串,以及一些查询语句即可,而MySQLi,则需要重新所有的查询以及连接方式。

名称式参数

这是PDO具有的一个非常重要的特性,采用名称式参数比数字式参数更加容易。

[php] view plaincopy

  1. $params = array(‘:username‘ => ‘test‘, ‘:email‘ => $mail, ‘:last_login‘ => time() - 3600);
  2. $pdo->prepare(‘
  3. SELECT * FROM users
  4. WHERE username = :username
  5. AND email = :email
  6. AND last_login > :last_login‘);
  7. $pdo->execute($params);

而MySQLi的方式:

[php] view plaincopy

  1. $query = $mysqli->prepare(‘
  2. SELECT * FROM users
  3. WHERE username = ?
  4. AND email = ?
  5. AND last_login > ?‘);
  6. $query->bind_param(‘sss‘, ‘test‘, $mail, time() - 3600);
  7. $query->execute();

这个问号(?)绑定参数看上去很短,但是相比名称式参数缺少了灵活性,而且迫使开发者必须保证参数的顺序,有时候让人觉得很蛋疼。

而且不幸的是MySQLi并不支持名称式参数。

对象映射

PDO和MySQLi都可以将结果映射成对象。下面自定义一个User类和一些属性,并且字段和数据库的表字段对应。

[php] view plaincopy

  1. class User {
  2. public $id;
  3. public $first_name;
  4. public $last_name;
  5. public function info()
  6. {
  7. return ‘#‘.$this->id.‘: ‘.$this->first_name.‘ ‘.$this->last_name;
  8. }
  9. }

如果没有用对象映射,如果在使用inof()方法前,就要手工的给属性赋值,或者在初始化的时候赋值。

而采用对象映射就可以直接完成

[php] view plaincopy

  1. $query = "SELECT id, first_name, last_name FROM users";
  2. // PDO
  3. $result = $pdo->query($query);
  4. $result->setFetchMode(PDO::FETCH_CLASS, ‘User‘);
  5. while ($user = $result->fetch()) {
  6. echo $user->info()."\n";
  7. }
  8. // MySQLI, procedural way
  9. if ($result = mysqli_query($mysqli, $query)) {
  10. while ($user = mysqli_fetch_object($result, ‘User‘)) {
  11. echo $user->info()."\n";
  12. }
  13. }
  14. // MySQLi, object oriented way
  15. if ($result = $mysqli->query($query)) {
  16. while ($user = $result->fetch_object(‘User‘)) {
  17. echo $user->info()."\n";
  18. }
  19. }

安全问题

最常见的当然是SQL注入了。而这两种连接数据的方式都提供了安全机制。

下面是一个简单通过$_GET方式注入的语句

[php] view plaincopy

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

如果我们不对这个参数进行处理,则问题是显而易见的。而且PDO和MySQLi都支持多重查询。这样可能导致若干数据被删除掉。

对$_GET数据处理

[php] view plaincopy

  1. // PDO, "manual" escaping
  2. $username = PDO::quote($_GET[‘username‘]);
  3. $pdo->query("SELECT * FROM users WHERE username = $username");
  4. // mysqli, "manual" escaping
  5. $username = mysqli_real_escape_string($_GET[‘username‘]);
  6. $mysqli->query("SELECT * FROM users WHERE username = ‘$username‘");

从上面的代码可以看出,PDO::quote不仅转义了字符串,而且还加了单引号,而MySQLi只是转义了字符串,需要自己手动加单引号。

下面是prepared statements的方式查询

[php] view plaincopy

  1. // PDO, prepared statement
  2. $pdo->prepare(‘SELECT * FROM users WHERE username = :username‘);
  3. $pdo->execute(array(‘:username‘ => $_GET[‘username‘]));
  4. // mysqli, prepared statements
  5. $query = $mysqli->prepare(‘SELECT * FROM users WHERE username = ?‘);
  6. $query->bind_param(‘s‘, $_GET[‘username‘]);
  7. $query->execute();

推荐采用prepared statements的方式绑定查询来代替PDO::quote() 和 mysqli_real_escape_string().

性能

PDO和MySQLi都有非常好的性能。在非prepared statements的基准测试下,MySQLi略快2.5%,而prepared statements下是6.5%,可以说对于性能无关紧要。如果你真的非常介意这一点点性能的话,而自带的MySQL扩展比两者都快,你可以考虑下它。

总结

最后,综合情况PDO在这场对比中胜出,支持12种不同数据库驱动程序(18种不同的数据库)和………………为以上提到的……

所以结论就是:如果你现在还在使用MySQLi,你可以考虑换了。

原文链接地址参考:

http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use/

时间: 2024-12-26 06:22:12

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

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

React 还是 Vue: 你应该选择哪一个Web前端框架?

学还是要学的,用的多了,也就有更多的认识了,开发中遇到选择的时候也就简单起来了. 本文作者也做了总结: 如果你喜欢用(或希望能够用)模板搭建应用,请使用Vue    如果你喜欢简单和“能用就行”的东西,请使用Vue    如果你的应用需要尽可能的小和快,请使用Vue    如果你计划构建一个大型应用程序,请使用React    如果你想要一个同时适用于Web端和原生App的框架,请选择React    如果你想要最大的生态圈,请使用React    如果你已经对其中一个用得满意了,就没有必要换了

PDO连接mysql8.0报PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers错误

安装mysql8.0之后,尝试使用php连接mysql,总是报PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers错误,网上找了很多资料,然而都没有多大用处. 查找了mysql官方说明文档才知道原来M8.0已经已经把默认字符集升级成ut8mb4了,于是找到my.cnf文件,修改如下: 1 [client] 2 port = 3306 3 socke

一个你爱,一个爱你,你选择哪一个

文/赖忠标 - 小时候可猛了 爱你的每天都会惦记着你 每天都会给你打电话 你爱的每天都会先打电话给他 爱你的从来不会主动挂掉你的电话…… 你爱的有时候甚至连句再见都不肯说 就挂掉了 爱你的看见你受一点点小伤都难受到不行 你爱的看见如果是一点点小伤会骂你笨 爱你的自从认识你以后开始学会照顾你,关心你 你爱的你认识他以后开始为他担心他的一切 爱你的不会让你为任何事担心 而你爱的人不会 所以 你与其选择你爱的人 不如选择爱你的人 因为爱你的人心里至少会时时刻刻想着你 爱是一件没有安全感的事情 越爱一个

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

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和mysqli对比

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

PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)

PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案. PHP的MySQL扩展是设计开发允许php应用与MySQL数据库交互的早期扩展.MySQL扩展提供了一个面向过程的接口,并且是针对MySQL4.1.3或者更早版本设计的.因此这个扩展虽然可以与MySQL4.1.3或更新的数据库服务端进行交互,但并不支持后期MySQL服务端提供的一些特性.由于太古老,又