Author:极客小俊 一个专注于web技术的80后

我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人!

CSDN@极客小俊,CSDN官方首发原创文章

个人博客: cnblogs.com

前言

主要说两个方面

  1. PHP数据库驱动的简介
  2. PHP连接数据库的不同方式案例比较

PHP数据库驱动简介


这里的驱动是指的一段特定类型的数据库服务器进行交互的软件代码。驱动可能会调用一些库。类似于Java中的数据库驱动的概念

其实也就是数据库厂商提供的数据库操作二进制代码库!

例如: Oracle中的oci.dll、

PHP数据库驱动

数据库驱动位于PHP和数据库进行通信的最底层,这一层就是数据库驱动层, 不同的数据库厂商都会在基于某个框架的前提下实现自己的驱动,用以提供基本功能、以及特定数据库的高级功能

PHP连接器

在数据库驱动层之上是 连接器、或者叫适配器抽象层,或者通俗点叫连接层、用于PHP代码和数据库进行连接,

比如PHP开发者可以使用PDO(PHP Database Object)、或者直接使用扩展接口(mysql、mysqli) 这些暴露出来的API函数来与底层数据库进行通信。

数据库驱动层、连接器 、PHP代码应用层 图如下

小知识:文件类型数据库

  1. 文件型是一种基于文件的数据库引擎,而且使用文件I/O(输入/输出)函数来存储和读取来自磁盘上文件的数据库。
  2. 它普遍也比关系型数据库(例如Mysql)小很多! (例如典型的文件型数据库SQLite命令行版本的大小小于200KB)
  3. 同时,文件型数据库支持你所熟悉的大部分SQL命令,同时具有易于携带的特点

PHP连接数据库的不同方式、以及不同业务场景下的优缺点

1.使用扩展API接口与数据库通信


PHP代码是由一些可选扩展组成的核心功能

PHP 的MySQL数据库相关扩展,比如mysqli,mysql都是基于PHP扩展框架实现的

这些扩展的作用就是暴露一个API给PHP程序员, 允许扩展自己的功能可以被程序员使用

当然,也有一部分基于PHP扩展框架 开发的扩展不会给PHP程序员暴露API接口。

比如说PDO MySQL驱动扩展,就没有向PHP程序员暴露API接口,但是向它上层的PDO层提供了一个接口

在实际编程中,使用频度最多的还是以扩展API的方式去连接数据库

mysql扩展

小伙伴是不是经常修改php.ini文件的时候看见了extension=php_mysql.dll 这个东西呢 它就是一个mysql扩展,

这是开发时允许PHP应用与MySQL数据库交互的早期扩展 , mysql扩展提供了一个面向过程的接口,并且是针对MySQL4.1.3或更早版本设计的。

mysql扩展的位置是在早期的5.x版本的PHP目录下的ext/mysql.dll

因此,这个扩展虽然可以与MySQL4.1.3或更新的数据库服务端进行交互,但并不支持后期最新的MySQL服务端提供的一些特性以及功能, 所以后来大家在现在的php7.x当中就看不见mysql.dll这个扩展了 被官方取消了!

  1. //连接数据库
  2. $link = mysql_connect('主机地址', '数据库用户名', '密码') or die('Could not connect: ' . mysql_error());
  3. echo 'Connected successfully';
  4. //选择数据库
  5. mysql_select_db('数据库名称') or die('错误信息');
  6. // 执行 SQL 查询
  7. $query = 'SELECT * FROM 表名称';
  8. $result = mysql_query($query) or die('错误信息' . mysql_error());
  9. // 以 HTML 打印查询结果
  10. echo "<table>\n";
  11. //循环的从结果集当中一条一条的获取数据 渲染遍历输出!
  12. while ($line = mysql_fetch_array($result, MYSQL_ASSOC))
  13. {
  14. echo "\t<tr>\n";
  15. foreach ($line as $col_value)
  16. {
  17. echo "\t\t<td>$col_value</td>\n";
  18. }
  19. echo "\t</tr>\n";
  20. }
  21. echo "</table>\n";
  22. //释放结果集
  23. mysql_free_result($result);
  24. //关闭连接
  25. mysql_close($link);

mysqli扩展

mysqli扩展,我们有时称之为MySQL增强扩展,可以用于使用MySQL4.1.3或更新版本中新的高级特性, 所以大家能够在php7.x的ext扩展目录中找到php_mysqli.dll 这个扩展, mysqli扩展在PHP 5及以后版本中都会包含!

mysqli扩展有一系列的优势,相对于mysql扩展的提升主要有如下:

  1. . 面向对象接口 可以理解成有面向对象的方式来书写代码
  2. . prepared语句支持(即参数编译预处理,可以有效防御SQL注入的发生)
  3. . 多语句执行支持
  4. . 事务支持
  5. . 增强的调试能力
  6. . 嵌入式服务支持
  7. . 在提供了面向对象接口的同时也提供了一个面向过程的接口。

所以这也大大提高了开发者的可选择性. 和性能的优越性

mysqli扩展是使用PHP扩展框架构建的,它的在PHP目录下的ext/mysqli.dll中

使用案例

  1. $con = new mysqli("数据库主机名", "用户名", "密码", "数据库名称");
  2. /* check connection */
  3. //判断返回的值是否大于0 大于0就说明有错误
  4. if (mysqli_connect_errno())
  5. {
  6. printf("Connect failed: %s\n", mysqli_connect_error());
  7. exit();
  8. }
  9. //预处理SQL
  10. $sql = "select name from users where name = ? and pass = ?";
  11. $cmd = $con->prepare($sql);
  12. //接收数据
  13. $name = $_GET['name'];
  14. $pass = $_GET['pass'];
  15. //向sql查询添加绑定参数
  16. $cmd->bind_param("ss", $name, $pass);
  17. //执行准备好的预处理查询语句
  18. $cmd->execute();
  19. //将变量绑定到准备好的语句以进行结果存储, 其实就是拿一个变量来保存结果
  20. $cmd->bind_result($result);
  21. //将准备好的语句的结果提取到绑定变量中
  22. $cmd->fetch();
  23. //判断结果是否已经存在? 存在就打印出来
  24. if($result)
  25. {
  26. var_dump($result);
  27. }

mysqli除了可以使用参数编译预处理来进行数据库的信息通信交互,同时也兼容使用面向过程的编码方式

这个就看开发者的个人习惯而定了 你喜欢这么使用就怎么使用

使用案例

  1. /* 连接数据库服务器 */
  2. $link = mysqli_connect(
  3. '连接MySQL地址', /* The host to connect to 连接MySQL地址 */
  4. '用户名', /* The user to connect as 连接MySQL用户名 */
  5. '密码', /* The password to use 连接MySQL密码 */
  6. '连接数据库名称'); /* The default database to query 连接数据库名称*/
  7. //判断是否成功 失败输出失败错误代码
  8. if (!$link)
  9. {
  10. printf("Can't connect to MySQL Server. Errorcode: %s ", mysqli_connect_error());
  11. exit;
  12. }
  13. /* 向服务器发送查询SQL语句请求*/
  14. if ($result = mysqli_query($link, 'SELECT * from 表名称'))
  15. {
  16. /* 返回查询的结果 并遍历结果集 一条一条的循环遍历输出 */
  17. while( $row = mysqli_fetch_assoc($result) )
  18. {
  19. printf("%s (%s) ", $row['字段名'], $row['字段名']);
  20. }
  21. /* 结束查询释放内存*/
  22. mysqli_free_result($result);
  23. }
  24. /* 关闭连接*/
  25. mysqli_close($link);

PHP还支持很多其他的数据库连接扩展,使用方法都类似,只要遵循函数调用规范即可!

更多详情参考官方文档: https://www.php.net/manual/zh/refs.database.php

2.使用PDO抽象层与数据库通信


PDO中文简称数据对象, 英文全称:PHP Database Object

PDO数据库访问抽象层是统一各种数据库的访问接口、是PHP应用中的一个数据库抽象层规范

PDO提供了一个统一的API接口, 可以使得你的PHP应用不去关心具体要连接的数据库服务器系统类型

通俗点说, 也就是如果你使用PDO的API,可以在任何需要的时候 无缝切换数据库服务器,比如从Firebird到MySQL,仅仅需要修改很少的PHP 代码就可以办到! 是不是很方便呢 ?

小提示: 利用 PDO 扩展自身并不能实现任何数据库功能, 注意是功能! 必须使用一个具体数据库的PDO驱动来访问想要的数据库服务(它只是一个接口规范)

但是一个接口提供的兼容性越强,它的定制性、特异性就相应越弱(这个应该不难理解吧)

PDO接口API的主要缺点是会限制让你不能使用MySQL服务端提供所有的数据库高级特性。

比如,PDO不允许使用MySQL支持的多语句执行, 如下图

在PHP5中,PDO目前已经支持大量数据库, 例如

  1. 1. sqlite
  2. 2. mysql
  3. 3. pgsql
  4. 4. mssql
  5. ...

PDO是基于PHP扩展框架实现的,它的源码在PHP目录的ext/php_pdo_*

再一次强调,PDO只是一个接口规范,它自身并不实现任何的数据库功能,开发者必须使用一个具体数据库的"PDO驱动"来访问特定的数据库

php_pdo_mysql扩展

PDO连接MySQL要在php.ini中的配置参数是: extension=php_pdo_mysql.dll 这个配置必须要打开才能连接MySQL服务

基本使用案例如下

  1. $dbhost="主机名";
  2. $dbname="数据库名称";
  3. $dbusr="用户名";
  4. $dbpwd="密码";
  5. $dbhdl=NULL;
  6. $dbstm=NULL;
  7. //连接数据库参数配置
  8. $opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',);
  9. $dsn='mysql:host=' . $dbhost . ';port=3306;dbname=' . $dbname;
  10. try
  11. {
  12. $dbhdl = new PDO($dsn, $dbusr, $dbpwd, $opt);
  13. //设置属性 错误报告 和 错误抛出异常
  14. $dbhdl->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
  15. }
  16. catch (PDOExceptsddttrtion $e)
  17. {
  18. //return PDOException
  19. print "Error!: " . $e->getMessage() . "<br>";
  20. die();
  21. }
  22. // 执行SQL语句,将结果集作为PDOStatement对象返回
  23. $dbstm = $dbhdl->query('SELECT * from p8_ad_user LIMIT 0,1');
  24. //从包含的结果集当中取出所有行并且返回数组
  25. $rows = $dbstm->fetchAll(PDO::FETCH_ASSOC);//也可以使用$rows = $dbhdl->Fetch();
  26. //打印结果
  27. print_r($rows);
php_pdo_pgsql扩展

extension=php_pdo_pgsql.dll

PDO连接PostgreSQL 要在php.ini中的配置参数是: extension=php_pdo_pgsql.dll 这个配置必须要打开才能连接PostgreSQL 服务

这个其实我也没怎么常用!

基本使用案例如下

  1. $host = "主机地址";
  2. $user = "用户名";
  3. $pass = "密码";
  4. $db = "数据库名称";
  5. $cursor = "cr_123456";
  6. try
  7. {
  8. //连接配置
  9. $dbh = new PDO("pgsql:host=$host;port=5432;dbname=$db;user=$user;password=$pass");
  10. echo "Connected<p>";
  11. }
  12. catch (Exception $e)
  13. {
  14. echo "Unable to connect: " . $e->getMessage() ."<p>";
  15. }
  16. $dbh->beginTransaction();
  17. //执行查询
  18. $query = "SELECT * from p8_ad_user LIMIT 0,1";
  19. $dbh->query($query);
  20. $query = "FETCH ALL IN \"$cursor\"";
  21. echo "begin data<p>";
  22. //遍历结果
  23. foreach ($dbh->query($query) as $row)
  24. {
  25. echo "$row[0] $row[1] $row[2] <br>";
  26. }
  27. echo "end data";

这里只简单的说一说Mysql、PostGreSQL的案例,事实上,PDO这种抽象层方式可以访问目前主流的大多数的数据库

3.使用ODBC抽象层与数据库通信

ODBC基本介绍

ODBC在PHP的手册上基本上都全是英文的 所以对一些英文不好的小白可能不太友好 ,在这里我也简单的说一下

ODBC的英文全称 (Open Database Connectivity) 是一种开放数据库互连 也就是一个应用程序编程接口(Application Programming Interface,简称API),使我们有能力连接到某个数据源、它为编写关系数据库的客户软件提供了一种统一的接口。

使用ODBC API 的应用程序可以与任何具有ODBC驱动程序的关系数据库进行通信、

ODBC 是为客户应用程序访问关系数据库时提供的一个标准的接口、对于不同的数据库,ODBC 提供了统一的 API,使用该 API 来访问任何提供了 ODBC 驱动程序的数据库

图解如下

总的来说和之前说的扩展API接口、PDO抽象层 略有不同,使用ODBC连接数据库要稍微麻烦一点

使用ODBC需要对目标数据库服务器的操作系统进行一些配置,即创建ODBC数据源,然后才可以进行ODBC连接, 就如同上面的图中 我们要在接口驱动程序管理器中配置ODBC数据源, 比如我们要使用ODBC连接MySQL就要先安装MySQL的ODBC驱动程序!

MySQL ODBC驱动安装和配置数据源

第一步

  1. 驱动程序下载地址https://dev.mysql.com/downloads/connector/odbc/
  2. 选择适合自己电脑版本(我的操作系统是Win10,64位)

进入下载界面后,我们不登录(Login)也不注册(Sign Up)。直接点左下角的【No thanks,just start my download.】即可开始下载。

下载完安装包后,双击打开安装包,按照默认选项进行安装即可。

第二步

配置数据源

打开控制面板\所有控制面板项\管理工具\ODBC 数据源

在控制面板下的管理工具,找到ODBC数据源后 双击打开

在【用户DSN】选项卡中单击【添加】按钮,然后选择MySQL ODBC 8.0 Unicode Driver 单击完成!

注意 :这里要说明一下“MYSQL ODBC 8.0 ANSI Driver”和“MySQL ODBC 8.0 Unicode Driver”的区别:

①MySQL ODBC 8.0 ANSI Driver 只针对有限的字符集的范围;

②MySQL ODBC 8.0 Unicode Driver 提供了更多字符集的支持,也就是提供了多语言的支持

单击完成后会弹出填写配置信息对话框

前两个选项可根据项目功能信息填写, 然后按具体情况填写TCP/IP Server和Port, 然后是MySQL用户名、密码、数据库名称。

  1. Data Source Name //数据源名称,可自拟(最好跟项目功能挂钩)
  2. Description //关于此数据源的描述,主要功能等,可不填写
  3. TCP/IP Server //服务器名称,可以是机器名,也可以是IP地址;若是本地可填写“localhost”
  4. Port //MySQL服务的端口号,默认是3306,也可在安装MySQL时自己设定
  5. User //用户名,默认是root,也可在安装MySQL时自己设定
  6. Password //密码
  7. Database //数据库名称

填写完后可点击【Test】按钮,测试一下连接是否配置成功!如果成功会有连接成功的提示!

若测试成功,再点击 OK 按钮即可!在用户DSN处即可查看到最新创建的ODBC

到这里就配置好了 MySQL ODBC驱动程序了

PHP用ODBC连接MySQL

首先检查PHP目录下的php.ini中,extension=odbc 扩展是否打开!

代码案例如下:

  1. $dsn="Driver={MySQL ODBC 8.0 Unicode Driver};Server=localhost;Database=shop;charset=utf8";
  2. $conn_odbc = odbc_connect($dsn, "root", "密码");
  3. //如果SQL命令执行成功,则返回ODBC结果标识符
  4. $row = odbc_do($conn_odbc,"SELECT * FROM test4");
  5. //获取数据总条数
  6. $odbc_num_rows = odbc_num_rows($row);
  7. echo "找到记录数量:".$odbc_num_rows;
  8. echo "<br>";
  9. //从标识当中判断是否有行
  10. if (odbc_fetch_row($row)){
  11. //获取结果数据
  12. echo '名称:'.odbc_result($row,"brand");
  13. echo '<br>';
  14. echo '颜色:'.odbc_result($row,"color");
  15. }

特别注意: 编码的一定要统一!

总结

差不多了吧。。以上就是PHP连接数据库的不同方式

  1. 目前PHP开发中主流使用的连接数据库的技术是
  2. 1. Mysqli扩展API
  3. 2. PDO抽象层

"点赞" "评论" "收藏"


大家的支持就是我坚持下去的动力!


如果以上内容有任何错误或者不准确的地方,欢迎在下面 留个言指出、或者你有更好的想法,欢迎一起交流学习

PHP数据库驱动扩展概述与不同方式连接数据库总结的更多相关文章

  1. PHP 数据库驱动、连接数据不同方式学习笔记

    相关学习资料 http://www.php.net/manual/zh/refs.database.php http://www.php.net/manual/zh/internals2.pdo.ph ...

  2. JDBC加载数据库驱动的方式

    JDBC作为数据库访问的规范接口,其中只是定义一些接口.具体的实现是由各个数据库厂商来完成. 一.重要的接口: 1.public interface Driver 每个驱动程序类必须实现的接口.Jav ...

  3. jdbc 加载数据库驱动如何破坏双亲委托模式

    导读      通过jdbc链接数据库,是每个学习Java web 方向的人必然一开始会写的代码,虽然现在各路框架都帮大家封装好了jdbc,但是研究一下jdbc链接的套路还是很意义     术语以及相 ...

  4. PowerDesigner连接Oracle数据库生成数据模型【数据源连接方式】

    1.进入操作系统的管理工具 2.选择ODBC数据源[32位或64位] 3.列表中是当前数据库已有的数据源,右侧点击添加按钮,添加适合自己的数据源 4.在列表中选择索要连接数据库的ODBC驱动[这里我要 ...

  5. 解析Qt4.7.3编译MySql数据库驱动,存中文乱码、过滤转义字符问题

    问题:使用QSqlDataBase类建立连接MySql数据库驱动加载失败 QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available ...

  6. 关系型数据库与HBase的数据储存方式差别

    现在Bigtable型(列族)数据库应用越来越广,功能也非常强大. 可是非常多人还是把它当做关系型数据库在使用,用原来关系型数据库的思维建表.存储.查询. 本文以hbase举例讲述数据模式的变化. 传 ...

  7. jdbc如何注册数据库驱动Driver的?

    1. 先看看原生jdbc执行sql的步骤 // 在程序启动的时候需要注册一次mysql驱动,必须引入 mysql-connnector-java 的包 Class.forName("com. ...

  8. Java-加载数据库驱动,取得数据库连接

    在Java中想要进行数据库操作,最重要的两个步骤就是加载数据驱动,然后取得数据库连接. 1.加载 数据库驱动( Class.forName(String className) ): 因为Java是一种 ...

  9. 关于iBatis.NET连接各数据库时提示没找到数据库驱动的依赖文件

    iBatis.net在连接oracle数据库时使用的是:oracleClient1.0 这个是系统自带的驱动,配置上即可,使用的连接配置为: <database> <provider ...

随机推荐

  1. Java面试题(Spring Boot/Spring Cloud篇)

    Spring Boot/Spring Cloud 104.什么是 spring boot? SpringBoot是一个框架,一种全新的编程规范,他的产生简化了框架的使用,所谓简化是指简化了Spring ...

  2. ZERO:点击影响的量化 & 分清SEO的不可抗力

    http://www.wocaoseo.com/thread-331-1-1.html 这篇文章基于上篇(http://www.wocaoseo.com/thread-332-1-1.html)的理论 ...

  3. 深入理解C++中的new/delete和malloc/free动态内存管理

    malloc/free和new/delete的区别 malloc/free是C/C++标准库的函数:new/delete是C++操作符. malloc/free只是动态分配内存空间/释放空间:new/ ...

  4. 利用Decorator和SourceMap优化JavaScript错误堆栈

    配合源码阅读体验更佳. 最近收到用户吐槽 @cloudbase/js-sdk(云开发Cloudbase的JavaScript SDK)的报错信息不够清晰,比如下面这条报错: 这属于业务型报错,对于熟悉 ...

  5. day45:JS中的json&JS的BOM操作和DOM操作

    目录 1.补充:CSS中的弹性盒子 2.JS中json的序列化 3.JS中的BOM操作 3.1 location操作 3.2 计时器 4.JS中的DOM操作 4.1 创建标签 4.2 查找标签 4.3 ...

  6. Python模拟保护和私有成员

    保护成员:以一个下划线开头.Python不会做特殊处理 私有成员:以两个下划线开头.Python会做mangling

  7. Mybatis入门篇之结果映射,你射准了吗?

    目录 前言 什么是结果映射? 如何映射? 别名映射 驼峰映射 配置文件开启驼峰映射 配置类中开启驼峰映射 resultMap映射 总结 高级结果映射 关联(association) 例子 关联的嵌套 ...

  8. 100个高频Spring面试题

    译   原文:https://www.javacodegeeks.com/2014/05/spring-interview-questions-and-answers.html A:Spring概览 ...

  9. chrome设置跨域访问

    1.新建目录 /usr/local/opt/myChromData 2.输入命令行 open -n /Applications/Google\ Chrome.app/ --args --disable ...

  10. deepin20 安装英伟达闭源驱动

    第一步.安装深度的"显卡驱动器" 在deepin v20 中默认没有显卡驱动管理器,需要命令行安装,命令如下(刚开始一直出错,当我第一次打开应用商店,就可以安装了,好神奇): su ...