PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】


Posted in PHP onNovember 04, 2019

本文实例讲述了PHP连接MySQL数据库的三种方式。分享给大家供大家参考,具体如下:

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,因为其不担有跨库的优点,更有读写速度快的特点。

1.PHP与Mysql扩展(本扩展自 PHP 5.5.0 起已废弃,并在将来会被移除),PHP原生的方式去连接数据库,是面向过程的

<?php
$mysql_conf = array(
  'host'  => '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扩展,面向过程、对象

<?php
$mysql_conf = array(
  'host'  => '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();
?>

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

<?php
$mysql_conf = array(
  'host'  => '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;//关闭连接
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用文本文件制作留言板提示(上)
Oct 09 PHP
php用数组返回无限分类的列表数据的代码
Aug 08 PHP
ThinkPHP中实例Model方法的区别说明
Aug 21 PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 PHP
php fsockopen伪造post与get方法的详解
Jun 14 PHP
php打开文件fopen函数的使用说明
Jul 05 PHP
json的键名为数字时的调用方式(示例代码)
Nov 15 PHP
wordpress网站转移到本地运行测试的方法
Mar 15 PHP
php中类和对象:静态属性、静态方法
Apr 09 PHP
PHP设计模式之适配器模式原理与用法分析
Apr 25 PHP
ThinkPHP框架实现FTP图片上传功能示例
Apr 08 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
Sep 05 PHP
php ZipArchive实现多文件打包下载实例
Oct 31 #PHP
Laravel框架实现抢红包功能示例
Oct 31 #PHP
laravel框架实现后台登录、退出功能示例
Oct 31 #PHP
TP5框架简单登录功能实现方法示例
Oct 31 #PHP
Laravel框架实现即点即改功能的方法分析
Oct 31 #PHP
laravel 框架实现无限级分类的方法示例
Oct 31 #PHP
tp5框架的增删改查操作示例
Oct 31 #PHP
You might like
PHP ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
用Php编写注册后Email激活验证的实例代码
2013/03/11 PHP
php模板原理讲解
2013/11/13 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
jquery的Tooltip插件 qtip使用详细说明
2010/09/08 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
JavaScript函数定义方法实例详解
2019/03/05 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
Python3.x和Python2.x的区别介绍
2013/02/12 Python
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
利用Python找出序列中出现最多的元素示例代码
2017/12/08 Python
python实现简单遗传算法
2018/03/19 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
Django框架 信号调度原理解析
2019/09/04 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
护士自荐信怎么写
2015/03/06 职场文书
繁星春水读书笔记
2015/06/30 职场文书
适合青年人白手起家的创业项目分享
2019/08/16 职场文书
用基于python的appium爬取b站直播消费记录
2021/04/17 Python