PHP-MySQL是PHP操作MySQL数据库最原始的Extension ,PHP-MySQLi的i代表Improvement ,提供了更加高级的功能,就Extension而言,本身也增加了安全性。而PDO(PHP Data Object) 则是提供了一个 Abstraction Layer来操作数据库。我们通过代码来初步比较它们之间的差异。

  先来看一段PHP-MySQL的通用代码:

<?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注入(SQL注入后续会有文章讲到)。所以后来发展出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 = 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(); ?>

  可以看出这只中方式已经把PHP-MySQL的问题解决了,当然用MySQL是没有问题了,如果有一天我的数据库换成了oralce,postgresql,那就不好办了,代码需要大改。所以就PDO就出来了,它把数据库的操作抽象出来了,而不需要管底层用的是何种数据库。示例代码如下:

<?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; ?>

  这样做的好处有很多:

  1. PDO连接数据库时通过Connection String(如例子中的"mysql:host=$db_host;dbname=$db_name")来决定连接哪种数据库。

  2. PDO可以通过PDO::setAttribute来设置连接时的参数,像是Persistent Connection, 返回错误的方式(Exception, E_WARNING, NULL),甚至是返回类名称的大小等等。
  2. PDO支持Bind Column,除了基本的 Prepare, Execute 以外,也可以Bind单一列,并且知道列类型。
  4. PDO 是 Abstraction Layer,所以更换数据库所需修改的代码量很少。

当然还有DBI方式,如ActiveRecord 以及 Propel ORM(Object-Relational Mapping)都非常好用。

如ActiveRecord,如果现在要用PHP操作这样的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的依赖性!

PHP-MySQL,PHP-MySQLi,PDO的差异的更多相关文章

  1. PHP操作mysql(mysqli + PDO)

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

  2. mysql、mysqli、PDO一句话概括比较

    mysql.mysqli.PDO一句话概括比较 1 mysql扩展 (注:原始的,较差) 2 mysqli扩展(面向过程式) (注:比上面多了更多功能) 3 mysqli扩展(面向对象式) (注:比上 ...

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

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

  4. PHP中MySQL、MySQLi和PDO的用法和区别

    PHP的MySQL扩展(优缺点) 设计开发允许PHP应用与MySQL数据库交互的早期扩展.mysql扩展提供了一个面向过程 的接口: 并且是针对MySQL4.1.3或更早版本设计的.因此,这个扩展虽然 ...

  5. PHP中MySQL、MySQLi和PDO的用法和区别【原创】

    对于一个初学PHP的自己,对数据库的连接有着很大的疑惑,从Java转到PHP.数据库连接变了,以前只知道JDBC连接数据库,或者直接用框架调用,对于的PHP的数据库连接方式,及其应用.不是很了解,于是 ...

  6. MYSQL MYSQLI PDO

    PHP的MySQL扩展(优缺点) 设计开发允许PHP应用与MySQL数据库交互的早期扩展.mysql扩展提供了一个面向过程 的接口: 并且是针对MySQL4.1.3或更早版本设计的.因此,这个扩展虽然 ...

  7. mysql数据库查询pdo的用法

    最早的php对mysql数据库查询是mysql和mysqli方法,后来php的新版本进一步封住了该方法,于是又pdo,抛开php框架,使用pdo查询数据,使用也是相当简便 <?php ini_s ...

  8. mysql和mysqli的区别

    看书.看视频的时候一直没有搞懂mysqli和mysql到底有什么区别.于是今晚“谷歌”一番,整理一下.需要的朋友可以参考下.   一: PHP-MySQL 是 PHP 操作 MySQL 数据库最原始的 ...

  9. PHP数据库连接mysql与mysqli的区别与用法

    一.mysql与mysqli的概念相关: 1.mysql与mysqli都是php方面的函数集,与mysql数据库关联不大. 2.在php5版本之前,一般是用php的mysql函数去驱动mysql数据库 ...

  10. PHP API中,MYSQL与MYSQLI的持久连接区别

    转载自:http://www.cnxct.com/some-differences-between-mysql-and-mysqli-of-persistent-connection/ 很久很久以前, ...

随机推荐

  1. C#学习基础概念二十五问

    C#学习基础概念二十五问 1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal ...

  2. 【10】css hack原理及常用hack

    [10]css hack原理及常用hack 原理:利用不同浏览器对CSS的支持和解析结果不一样编写针对特定浏览器样式.常见的hack有1)属性hack.2)选择器hack.3)IE条件注释 IE条件注 ...

  3. oracle11gR2下scott用户以及表的建立

    目录 oracle11gR2下scott用户以及表的建立 找到系统带的sql文件(utlsample.sql) 根据SQL的内容操作 新建用户并授权 scott登录 表操作 查询表(使用pl/sql) ...

  4. 二、harbor部署之部署harbor

    1 harbor部署之安装docker 1.yum install -y docker #安装docker 2 harbor部署之安装docker-compose 1.首先检查centos有没有安装p ...

  5. CF Educational Codeforces Round 21

    A. Lucky Year time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  6. 九度oj 题目1536:树的最小高度

    题目描述: 给定一棵无向树, 我们选择不同的节点作为根节点时,可以得到不同的高度(即树根节点到叶子节点距离的最大值), 现在求这棵树可能的最低高度. 输入: 输入可能包含多个测试案例. 对于每个测试案 ...

  7. AS创建工程结构

  8. 【bzoj4930】棋盘 费用流

    题目描述 给定一个n×n的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置(x,y),(u,v)能互相攻击当前仅 当满足以下两个条件: 1:x=u或y=v 2:对于(x,y)与(u,v)之间 ...

  9. 【Luogu】P1967货车运输(最大生成森林+倍增LCA)

    题目链接 倍增LCA是个什么蛇皮原理啊,循环完了还得再往上跳一次才能到最近公共祖先 合着我昨天WA两次就是因为这个 建最大生成森林,因为图不一定是联通的,所以不一定是一棵树.这个地方用克鲁斯卡尔就好了 ...

  10. BZOJ 2882 工艺 ——后缀自动机 最小表示法

    先说后缀自动机的做法. 直接把S串复制一遍成SS,然后建立后缀自动机,go边相当于在当前字符的后面插入,而son边可以看作在字符串前面加一个字符. 所以贪心的走字典序最小的边即可,而且根据后缀自动机的 ...