mysql与Pdo_PDO和MySQLi区别与选择?
当用PHP访问数据库时,除了PHP自带的数据库驱动,我们一般还有两种比较好的选择:PDO和MySQLi。
在实际开发过程中要决定选择哪一种首先要对二者有一个比较全面的了解。
本文就针对他们的不同点进行分析,并对多数据库类型支持、稳定性、性能等等方面进行对比。
一、连接
//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类,它有一些属性对应到数据库。
classUser {public $id;public $first_name;public $last_name;public functioninfo()
{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种数据库驱动和命名参数绑定是其最大优点,通过上面的对比,
我相信你也知道了你在自己的项目中会使用哪一种连接数据库了?
九、数据库备份
$host = "localhost";$user = "root"; //数据库账号
$password = "root"; //数据库密码
$dbname = "compa"; //数据库名称
header("Content-type:text/html;charset=utf-8");//这里的账号、密码、名称都是从页面传过来的
if (!mysql_connect($host, $user, $password)) //连接mysql数据库
{echo '数据库连接失败,请核对后再试';exit;
}if (!mysql_select_db($dbname)) //是否存在该数据库
{echo '不存在数据库:' . $dbname . ',请核对后再试';exit;
}mysql_query("set names 'utf8'");$mysql = "set charset utf8;\r\n";$q1 = mysql_query("show tables");while ($t = mysql_fetch_array($q1))
{$table = $t[0];$q2 = mysql_query("show create table `$table`");$sql = mysql_fetch_array($q2);$mysql .= $sql['Create Table'] . ";\r\n";$q3 = mysql_query("select * from `$table`");while ($data = mysql_fetch_assoc($q3))
{$keys = array_keys($data);$keys = array_map('addslashes', $keys);$keys = join('`,`', $keys);$keys = "`" . $keys . "`";$vals = array_values($data);$vals = array_map('addslashes', $vals);$vals = join("','", $vals);$vals = "'" . $vals . "'";$mysql .= "insert into `$table`($keys) values($vals);\r\n";
}
}$filename = $dbname . date('Ymjgi') . ".sql"; //存放路径,默认存放到项目最外层
$fp = fopen($filename, 'w');fputs($fp, $mysql);fclose($fp);echo "数据备份成功";
感谢网友提供的信息原文:https://www.cnblogs.com/feng18/p/6523646.html;
mysql与Pdo_PDO和MySQLi区别与选择?相关推荐
- php mysql什么意思_php MySQLi是什么意思?
php MySQLi的意思是:1.mysqli是mysql系统函数的增强版,更稳定更高效更安全:2.mysqli与mysql都是php方面的函数集:3.mysqli是永远连接函数,mysqli多次运行 ...
- MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
深入理解MySQL的数据库引擎的类型 作者: 字体:[增加 减小] 类型:转载 本篇文章是对MySQL的数据库引擎的类型进行了详细的分析介绍,需要的朋友参考下 你能用的数据库引擎取决于mysql在 ...
- php mysql_connect(),mysqli区别
php mysql_connect(),mysqli区别 由于基础问题,这个东西害我找了一天错误在哪也没找出来,晚上终于好了,总结下: mysql_connect()是面向过程的数据库连接方式,mys ...
- MySQL 和 Redis 事务的区别
目录 MySQL 和 Redis 事务的区别 事务的四大特性 命令行执行事务的命令 实现原理 Go 语言开启事务代码 MySQL 和 Redis 事务的区别 redis 事务不支持原子性和持久性,并且 ...
- php 抽象类 接口 区别,PHP中抽象类、接口的区别与选择分析
本文实例分析了PHP中抽象类.接口的区别与选择.分享给大家供大家参考,具体如下: 区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关键字extends.当然接口也可以通过 ...
- mysql社区版与cluster 区别_MySQL版本Enterprise/Community/Cluster等版本的区别
MySQL分为多种版本如Community.Enterprise.Cluster和Workbench等,MySQL不同版本有什么区别?LAMPLNMP分享: MySQL版本区别 ● MySQL Com ...
- SQL Server 和 MySql 语法和关键字的区别
(1) MySQL的ifnull()函数对应sql的isnull()函数; (2) mysql的存储过程中变量的定义去掉@; (3) mysql的每句结束要用";" ...
- 网页静态化和网页伪静态化之间的区别与选择
网页静态化和网页伪静态化,如果我们是一个不懂网站的人估计听到这些词可能会比较头晕,王晟璟在刚开始接触并尝试建设自己的个人博客网站的时候也是如此,看了很多关于这方面的资料也还是云里雾里的,不过后面终于整 ...
- php里面sql是什么意思,MySQL和SQL是什么?MySQL和SQL之间的区别有哪些
MySQL和SQL之间的区别有哪些?很多PHP的初学者,对MySQL,MyAdmin和SQL有什么区别并不是很清楚?下面 第一PHP社区 就带领大家来学习一下MySQL和SQL之间的区别.[推荐阅读: ...
最新文章
- cydia收费插件源_Cydia消失了怎么办 Cydia错误汇总介绍【图文】
- C++中输入输出的十六进制八进制
- BZOJ 4734 UOJ #269 [清华集训2016]如何优雅地求和 (多项式)
- 博士申请 | 荷兰代尔夫特理工大学陶倩教授招收医学人工智能全奖博士生
- 10的n次方 java_为大家一共一个10的n次方的算法
- 获取百度地图、高德地图经纬度坐标
- AOP核心概念,连接点(JoinPoint)切入点(Pointcut)通知(Advice)通知类切面(Aspect)
- #379 – 将ToolTip当做放大器使用(Using a Tooltip As a Magnifier)
- Hulu热招|广告智能团队
- K-means(tri)利用三角不等式性质加速k-means
- 2018年ACM-ICPC亚洲区域赛(焦作)赛后总结
- 读Zepto源码之Deferred模块
- 教师招聘计算机面试技能测试,教师招聘面试中技能测试指什么
- html表单自动编号,Q&A|如何实现会员自动编号?
- fstream、ifstream、ofstream
- 初学python 没有动手没有发言权
- linux聊天python_Python socket C/S结构的聊天室应用
- python写的小巧的(14行有效代码)随机密码生成小脚本工具
- SpringCloud Alibaba实战第八课 缓存设计、网关认证、重构策略
- linux php环境搭建教程,linux php环境搭建教程
热门文章
- qt.targets(66,3):元素<Import>中的“Project”特性的值无效
- Android开发之ApiCloud模块开发之模块引用第三方库的问题
- mysql不被其他ip访问_mysql数据库无法被其他ip访问的解决方法
- 计算机模拟 博弈 善意,从两本奇书看人与人的重复博弈
- Undefined symbols for architecture i386问题解决方法
- python123 helloworld_python入门
- 宝塔面板怎么下载php,宝塔面板下怎么安装Mosquitto-php扩展
- 别给小偷可乘之机!日本山形县警方呼吁民众“锁门”
- 在Shell中使用alias
- iOS新上线注意事项