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

Stella981
• 阅读 500

PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 、PHP的mysqli扩展 、PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案。

PHP的MySQL扩展是设计开发允许php应用与MySQL数据库交互的早期扩展。MySQL扩展提供了一个面向过程的接口,并且是针对MySQL4.1.3或者更早版本设计的。因此这个扩展虽然可以与MySQL4.1.3或更新的数据库服务端进行交互,但并不支持后期MySQL服务端提供的一些特性。由于太古老,又不安全,所以已被后来的mysqli完全取代;

PHP的mysqli扩展,我们有时称之为MySQL增强扩展,可以用于使用 MySQL4.1.3或更新版本中新的高级特性。其特点为:面向对象接口 、prepared语句支持、多语句执行支持、事务支持 、增强的调试能力、嵌入式服务支持 、预处理方式完全解决了sql注入的问题。不过其也有缺点,就是只支持mysql数据库。如果你要是不操作其他的数据库,这无疑是最好的选择。

PDO是PHP Data Objects的缩写,是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口可以使得你的PHP应用不去关心具体要连接的数据库服务器系统类型,也就是说,如果你使用PDO的API,可以在任何需要的时候无缝切换数据库服务器,比如从Oracle 到MySQL,仅仅需要修改很少的PHP代码。其功能类似于JDBC、ODBC、DBI之类接口。同样,其也解决了sql注入问题,有很好的安全性。不过他也有缺点,某些多语句执行查询不支持(不过该情况很少)。

官文对于三者之间也做了列表性的比较:

 

PHP的mysqli扩展

PDO

PHP的mysql扩展

引入的PHP版本

5.0

5.0

3.0之前

PHP5.x是否包含

是  

MySQL开发状态

活跃

在PHP5.3中活跃

仅维护

在MySQL新项目中的建议使用程度

建议 - 首选

建议

不建议

API的字符集支持

服务端prepare语句的支持情况

客户端prepare语句的支持情况

存储过程支持情况

多语句执行支持情况

大多数

是否支持所有MySQL4.1以上功能

大多数

 从官方给出的这份结果上来看,优先推荐msqli,其次是PDO 。而“民间”给出的结果很多是倾向于使用PDO,因为其不担有跨库的优点,更有读写速度快的特点。

'127.0.0.1:3306',     'db'      => 'test',     'db\_user' => 'root',     'db\_pwd'  => 'root',     ); $mysql\_conn = @mysql\_connect($mysql\_conf\['host'\], $mysql\_conf\['db\_user'\], $mysql\_conf\['db\_pwd'\]); if (!$mysql\_conn) {     die("could not connect to the database:\\n" . mysql\_error());//诊断连接错误 } mysql\_query("set names 'utf8'");//编码转化 $select\_db = mysql\_select\_db($mysql\_conf\['db'\]); if (!$select\_db) {     die("could not connect to the db:\\n" .  mysql\_error()); } $sql = "select \* from user;"; $res = mysql\_query($sql); if (!$res) {     die("could get the res:\\n" . mysql\_error()); } while ($row = mysql\_fetch\_assoc($res)) {     print\_r($row); } mysql\_close($mysql\_conn); ?>

2.PHP与Mysqli扩展,面向过程、对象

'127.0.0.1:3306',     'db'      => 'test',     'db\_user' => 'root',     'db\_pwd'  => 'joshua317',     ); $mysqli = @new mysqli($mysql\_conf\['host'\], $mysql\_conf\['db\_user'\], $mysql\_conf\['db\_pwd'\]); if ($mysqli->connect\_errno) {     die("could not connect to the database:\\n" . $mysqli->connect\_error);//诊断连接错误 } $mysqli->query("set names 'utf8';");//编码转化 $select\_db = $mysqli->select\_db($mysql\_conf\['db'\]); if (!$select\_db) {     die("could not connect to the db:\\n" .  $mysqli->error); }$sql = "select uid from user where name = 'joshua';"; $res = $mysqli->query($sql); if (!$res) {     die("sql error:\\n" . $mysqli->error); }  while ($row = $res->fetch\_assoc()) {         var\_dump($row);     } $res->free(); $mysqli->close(); ?>

2.PHP与PDO扩展,面向过程、对

'127.0.0.1:3306',     'db'      => 'test',     'db\_user' => 'root',     'db\_pwd'  => 'joshua317',     ); $pdo = new PDO("mysql:host=" . $mysql\_conf\['host'\] . ";dbname=" . $mysql\_conf\['db'\], $mysql\_conf\['db\_user'\], $mysql\_conf\['db\_pwd'\]);//创建一个pdo对象 $pdo->exec("set names 'utf8'"); $sql = "select \* from user where name = ?"; $stmt = $pdo->prepare($sql); $stmt->bindValue(1, 'joshua', PDO::PARAM\_STR); $rs = $stmt->execute(); if ($rs) {     // PDO::FETCH\_ASSOC 关联数组形式     // PDO::FETCH\_NUM 数字索引数组形式     while ($row = $stmt->fetch(PDO::FETCH\_ASSOC)) {         var\_dump($row);     } } $pdo = null;//关闭连接 ?>

转自于:https://www.cnblogs.com/joshua317/articles/5989781.html

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
2年前
39.安装PH5-PH7
11.10/11.11/11.12 安装PHP511.13 安装PHP7php中mysql,mysqli,mysqlnd,pdo到底是什么 http://blog.csdn.net/u013785951/article/details/60876816查看编译参数 http://ask.apelearn.com/question/1295
Wesley13 Wesley13
2年前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数NOW()相同的格式返回日期和时间?我知道如何使用date()做到这一点,但是我问是否有一个仅用于此的函数。例如,返回:2009120100:00:001楼使用此功能:functiongetDatetimeNow(){
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究