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 相关文章推荐
PHP 批量删除 sql语句
Jun 05 PHP
初学CAKEPHP 基础教程
Nov 02 PHP
PHP中for与foreach的区别分析
Mar 09 PHP
php的array数组和使用实例简明教程(容易理解)
Mar 20 PHP
php中mkdir函数用法实例分析
Nov 15 PHP
Laravel 5框架学习之数据库迁移(Migrations)
Apr 08 PHP
ThinkPHP中数据操作案例分析
Sep 27 PHP
深入浅析yii2-gii自定义模板的方法
Apr 26 PHP
Joomla使用Apache重写模式的方法
May 04 PHP
php使用高斯算法实现图片的模糊处理功能示例
Nov 11 PHP
Windows 下安装 swoole 图文教程(php)
Jun 05 PHP
PHP 数组黑名单/白名单实例代码详解
Jun 04 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+MySQL的聊天室设计
2006/10/09 PHP
PHP代码审核的详细介绍
2013/06/13 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
2013/06/29 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
jquery实现div拖拽宽度示例代码
2013/07/31 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
AngularJS 实现按需异步加载实例代码
2015/10/18 Javascript
JavaScript实现cookie的写入、读取、删除功能
2015/11/05 Javascript
通过jquery实现页面的动画效果(实例代码)
2016/09/18 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
2016/10/10 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
微信小程序静默登录的实现代码
2020/01/08 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
详细分析python3的reduce函数
2017/12/05 Python
利用ctypes获取numpy数组的指针方法
2019/02/12 Python
python树的同构学习笔记
2019/09/14 Python
python创建学生管理系统
2019/11/22 Python
Python实现ATM系统
2020/02/17 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
设计模式的基本要素是什么
2014/04/21 面试题
如何写好优秀的创业计划书
2014/01/30 职场文书
党员承诺书怎么写
2014/05/20 职场文书
设备售后服务承诺书
2014/05/30 职场文书
经济贸易专业自荐信
2014/06/11 职场文书
材料物理专业求职信
2014/09/01 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书
Nginx的rewrite模块详解
2021/03/31 Servers
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA