php mysql数据库驱动程序_PHP数据库驱动扩展概述与不同方式连接数据库总结

article/2025/9/17 1:43:07

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

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

CSDN@极客小俊,原创文章, B站技术分享

个人博客: cnblogs.com

前端html+css+javascript技术讨论交流群: 281499395

后端php+mysql+Linux技术交流群: 855256321

前言

主要说两个方面

PHP数据库驱动的简介

PHP连接数据库的不同方式案例比较

a434b6841715a741ee134ca8814886b7.png

PHP数据库驱动简介

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

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

例如: Oracle中的oci.dll、

PHP数据库驱动

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

PHP连接器

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

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

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

747ef657fe117b6a78aa2a25fc24627e.png

小知识:文件类型数据库

文件型是一种基于文件的数据库引擎,而且使用文件I/O(输入/输出)函数来存储和读取来自磁盘上文件的数据库。

它普遍也比关系型数据库(例如Mysql)小很多! (例如典型的文件型数据库SQLite命令行版本的大小小于200KB)

同时,文件型数据库支持你所熟悉的大部分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这个扩展了 被官方取消了!

//连接数据库

$link = mysql_connect('主机地址', '数据库用户名', '密码') or die('Could not connect: ' . mysql_error());

echo 'Connected successfully';

//选择数据库

mysql_select_db('数据库名称') or die('错误信息');

// 执行 SQL 查询

$query = 'SELECT * FROM 表名称';

$result = mysql_query($query) or die('错误信息' . mysql_error());

// 以 HTML 打印查询结果

echo "

//循环的从结果集当中一条一条的获取数据 渲染遍历输出!

while ($line = mysql_fetch_array($result, MYSQL_ASSOC))

{

echo "\t

\n";

foreach ($line as $col_value)

{

echo "\t\t

$col_value\n";

}

echo "\t

\n";

}

echo "

\n";

//释放结果集

mysql_free_result($result);

//关闭连接

mysql_close($link);

mysqli扩展

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

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

. 面向对象接口 可以理解成有面向对象的方式来书写代码

. prepared语句支持(即参数编译预处理,可以有效防御SQL注入的发生)

. 多语句执行支持

. 事务支持

. 增强的调试能力

. 嵌入式服务支持

. 在提供了面向对象接口的同时也提供了一个面向过程的接口。

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

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

使用案例

$con = new mysqli("数据库主机名", "用户名", "密码", "数据库名称");

/* check connection */

//判断返回的值是否大于0 大于0就说明有错误

if (mysqli_connect_errno())

{

printf("Connect failed: %s\n", mysqli_connect_error());

exit();

}

//预处理SQL

$sql = "select name from users where name = ? and pass = ?";

$cmd = $con->prepare($sql);

//接收数据

$name = $_GET['name'];

$pass = $_GET['pass'];

//向sql查询添加绑定参数

$cmd->bind_param("ss", $name, $pass);

//执行准备好的预处理查询语句

$cmd->execute();

//将变量绑定到准备好的语句以进行结果存储, 其实就是拿一个变量来保存结果

$cmd->bind_result($result);

//将准备好的语句的结果提取到绑定变量中

$cmd->fetch();

//判断结果是否已经存在? 存在就打印出来

if($result)

{

var_dump($result);

}

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

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

使用案例

/* 连接数据库服务器 */

$link = mysqli_connect(

'连接MySQL地址', /* The host to connect to 连接MySQL地址 */

'用户名', /* The user to connect as 连接MySQL用户名 */

'密码', /* The password to use 连接MySQL密码 */

'连接数据库名称'); /* The default database to query 连接数据库名称*/

//判断是否成功 失败输出失败错误代码

if (!$link)

{

printf("Can't connect to MySQL Server. Errorcode: %s ", mysqli_connect_error());

exit;

}

/* 向服务器发送查询SQL语句请求*/

if ($result = mysqli_query($link, 'SELECT * from 表名称'))

{

/* 返回查询的结果 并遍历结果集 一条一条的循环遍历输出 */

while( $row = mysqli_fetch_assoc($result) )

{

printf("%s (%s) ", $row['字段名'], $row['字段名']);

}

/* 结束查询释放内存*/

mysqli_free_result($result);

}

/* 关闭连接*/

mysqli_close($link);

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

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

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

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

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

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

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

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

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

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

1ecc5bd10c7399963937f66171b05c79.png

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

1. sqlite

2. mysql

3. pgsql

4. mssql

...

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

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

php_pdo_mysql扩展

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

基本使用案例如下

$dbhost="主机名";

$dbname="数据库名称";

$dbusr="用户名";

$dbpwd="密码";

$dbhdl=NULL;

$dbstm=NULL;

//连接数据库参数配置

$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',);

$dsn='mysql:host=' . $dbhost . ';port=3306;dbname=' . $dbname;

try

{

$dbhdl = new PDO($dsn, $dbusr, $dbpwd, $opt);

//设置属性 错误报告 和 错误抛出异常

$dbhdl->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

}

catch (PDOExceptsddttrtion $e)

{

//return PDOException

print "Error!: " . $e->getMessage() . "
";

die();

}

// 执行SQL语句,将结果集作为PDOStatement对象返回

$dbstm = $dbhdl->query('SELECT * from p8_ad_user LIMIT 0,1');

//从包含的结果集当中取出所有行并且返回数组

$rows = $dbstm->fetchAll(PDO::FETCH_ASSOC);//也可以使用$rows = $dbhdl->Fetch();

//打印结果

print_r($rows);

php_pdo_pgsql扩展

extension=php_pdo_pgsql.dll

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

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

基本使用案例如下

$host = "主机地址";

$user = "用户名";

$pass = "密码";

$db = "数据库名称";

$cursor = "cr_123456";

try

{

//连接配置

$dbh = new PDO("pgsql:host=$host;port=5432;dbname=$db;user=$user;password=$pass");

echo "Connected

";

}

catch (Exception $e)

{

echo "Unable to connect: " . $e->getMessage() ."

";

}

$dbh->beginTransaction();

//执行查询

$query = "SELECT * from p8_ad_user LIMIT 0,1";

$dbh->query($query);

$query = "FETCH ALL IN \"$cursor\"";

echo "begin data

";

//遍历结果

foreach ($dbh->query($query) as $row)

{

echo "$row[0] $row[1] $row[2]
";

}

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 驱动程序的数据库

图解如下

d728ce33b107e002837c4e701c614ad4.png

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

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

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

第一步

驱动程序下载地址https://dev.mysql.com/downloads/connector/odbc/

选择适合自己电脑版本(我的操作系统是Win10,64位)

f0a480a7b31ba7755b735d20899e9c0f.png

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

21af56fe2f77c4af8d0125ca44238f23.png

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

第二步

配置数据源

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

f0cf627c740b7c685ec8d69427b08ac4.png

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

7582d635fe3424c15b3d7d8e280d1470.png

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

cd0a4b24a5506476ac90f27426a0ca03.png

注意 :这里要说明一下“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用户名、密码、数据库名称。

79ad8d44ca66b14c9fead265c7e064cc.png

Data Source Name: //数据源名称,可自拟(最好跟项目功能挂钩)

Description: //关于此数据源的描述,主要功能等,可不填写

TCP/IP Server: //服务器名称,可以是机器名,也可以是IP地址;若是本地可填写“localhost”

Port: //MySQL服务的端口号,默认是3306,也可在安装MySQL时自己设定

User: //用户名,默认是root,也可在安装MySQL时自己设定

Password: //密码

Database: //数据库名称

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

8bb074bfcd7935dbceac723be62a46e2.png

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

20425492cf85e1a78bed5184cf212b72.png

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

PHP用ODBC连接MySQL

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

代码案例如下:

$dsn="Driver={MySQL ODBC 8.0 Unicode Driver};Server=localhost;Database=shop;charset=utf8";

$conn_odbc = odbc_connect($dsn, "root", "密码");

//如果SQL命令执行成功,则返回ODBC结果标识符

$row = odbc_do($conn_odbc,"SELECT * FROM test4");

//获取数据总条数

$odbc_num_rows = odbc_num_rows($row);

echo "找到记录数量:".$odbc_num_rows;

echo "
";

//从标识当中判断是否有行

if (odbc_fetch_row($row)){

//获取结果数据

echo '名称:'.odbc_result($row,"brand");

echo '
';

echo '颜色:'.odbc_result($row,"color");

}

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

总结

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

目前PHP开发中主流使用的连接数据库的技术是

1. Mysqli扩展API

2. PDO抽象层

9e67ab00107ee27d73ad9d46f6026e3b.png

f18368af0a4f7d766b3d2cb13f9fe905.gif

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

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

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

关注 极客小俊 微信公众号 不定期更新免费技术干货

1452855-20201030233648212-2008036167.png


http://chatgpt.dhexx.cn/article/Qv0H0Whe.shtml

相关文章

linux openldap mysql_linux ldap openldapadmin

LINUX下安装openldap,并用phpldapadmin进行管理 BDB:Berkeley DB,openldap需要使用的数据库(貌似还有别的数据库可用,但这次我要用到它) phpldapadmin:openldap的网页管理软件,需要php支持,所以会有apachep…

mysql +cobar_数据库中间件Cobar功能探究

一、Cobar项目介绍 一)、Cobar背景概述 Cobar是提供分布式数据库服务的中间件,由阿里巴巴中间件团队开发,是阿里巴巴B2B前台应用访问数据库的统一入口,目前已在github上开源。 Cobar的分布式方案是分库和分表,可以按照业务需求将数…

mysql 的基本表的应用_mysql数据库应用(五)----表的基本操作(创建,删除,显示)...

------------------------------表的基本概念------------------------------------------ 表是包含数据库中所有数据的数据库对象 表中的数据库对象包括列,索引,触发器 列:在具体创建表时,必须指定列的名字和数据类型 索引&#…

RC电路的频率响应、选频网络特性测试的分析与仿真

目录 7.1 目的 7.2 分析原理 7.3 仿真分析 7.4 注意事项 7.5 总结与思考 7.1 目的 1. 掌握系统频率特性曲线的测试方法。 2. 了解常用线性系统的选频特性和相移特性。 7.2 分析原理 1.系统的频率响应特性 从理论课程的学习中可知,系统…

RC电路时间常数的定义及计算

转自电子发烧友:http://www.elecfans.com/dianzichangshi/20171101573662.html 时间常数表示过渡反应的时间过程的常数。指该物理量从最大值衰减到最大值的1/e所需要的时间。对于某一按指数规律衰变的量,其幅值衰变为1/e倍时所需的时间称为时间常数。 …

实验报告:RC电路的充放电过程仿真实验

实验人员:田少军 韦其优 实验目的: 掌握Multisim软件对RC电路充放电过程的仿真方法,理解RC电路的充放电过程的特性和规律,加深对电容器和电阻器的使用和理解。 实验原理: RC电路是由一个电容和一个阻值串联而成的电…

RC电路充放电时间的计算

V0是电容上的初始电压值 V1是电容最终可以充到或者放到的电压值 Vt是t时刻电容上的电压值 VtV0(V1-V0)x[1-exp(-t/RC)] 这里的exp是以e为底的指数函数 上面的公式还可以写成 tRCxln[(V1-V0)/(V1-Vt)] 1.电压为E的电池通过R向初值为0的电容C充电,V00,V1E…

模拟电路知识点总结(详细版)--放大电路的频率效应(RC电路)

一、高通电路 1.1传输特性 A u A_u Au​ R R 1 j ω C \frac{R}{R \frac {1} { j \omega C}} RjωC1​R​   (补充知识:j是复数域中的一个旋转因子) 详细求解思路:   求解 A u A_u Au​就是要求输入与输出的关系。 所以 A…

RC电路 波形分析

在模拟及脉冲数字电路中,常常用到由电阻R和电容C组成的RC电路,在些电路中, 电阻R和电容C的取值不同、输入和输出关系以及处理的波形之间的关系,产生了RC电路的 不同应用,下面分别谈谈微分电路、积分电路、耦合电路、脉…

RC电路分析计算

RC电路有一个电容和一个电阻组成,可以是并联或者串联,可用作滤波,移相等。下面以RC串联电路为例计算分析电路的电流电压特性和频率特性。 RC串联电路 如上图所示,假设RC电路电源电压为Us,电容大小为C,电容两…

RC电路一阶线性微分方程

电路中一阶线性微分方程 在高等数学中,一阶微分方程求解过程需要先算出齐次的通解,然后再根据初始条件算出特解,计算与推理过程很是复杂。在我们学习电路的时候再遇到这个东西时,会因为之前复杂的求解方式严重打击自信心&#xf…

RC并联电路传递函数用MATLAb,RC电路(一)RC串联、并联电路详解

由电阻R和电容C组成的电路称为阻容电路,简称RC电路,这是电子电路中十分常见的一种电路,RC电路的种类和变化很多,需要认真学习,深入掌握。 RC串联电路 下图所示是RC串联电路,RC串联电路由一个电阻R1和一个电容C1串联而成。在串联电路中,电容C1在电阻R1后面或前面是一样的…

详解电路设计中的RC电路

​ 目录 一、什么是RC电路 二、RC充、放电电路 (1)RC充电电路 (2)RC放电电路 三、RC积分电路 (1)RC积分电路的作用 (2)电路图 四、RC微分电路 (1)R…

RC电路的充放过程C语言实现,RC电路的瞬态和稳态过程

RC电路的瞬态和稳态过程 以指数衰减方式进行运动变化,不仅在交流电路中有,在静电学及放射性衰变、原子核裂变中同样出现。在核物理与放射性研究中,半衰期是放射元素的一个特性常数,它与外界条件、元素状态、元素质量无关。在考古学、医学、环境保护学中,放射性元素半衰期这…

RC电路

(1)RC 串联电路   电路的特点:由于有电容存在不能流过直流电流,电阻和电容都对电流存在阻碍作用,其总阻抗由电阻和容抗确定,总阻抗随频率变化而变化。RC 串联有一个转折频率: f01/2πR1C1 …

RC并联电路

1电容充放电细节 电容是由一对普通的金属平板对组成的,假设上极板有四对正负电荷的粒子对。然后,突然在该电容两端加一个电源。由于电源正极带正电,电源正极成功吸引了两个上极板上的电子过去(此时上极板有两个正电荷&#xff09…

一阶RC电路实验

实验六 一阶RC电路实验 一.实验目的 1.培训应用示波器测量电路暂响应过程的技能。观测RC一阶电路暂态过程的动态曲线,测量其时间常数及作为积分应用特性。 2. 观测RLC二阶电路暂态过程的三种状态轨迹,测量并分析其参数。 二.实验仪器和器材 1.实验仪…

RC电路讲解

R和C组成的电路非常多,应用也非常广泛,下面分别谈谈微分电路、积分电路、耦合电路、脉冲分压器以及滤波电路。 1. RC微分电路 如图1所示,电阻R和电容C串联后接入输入信号VI,由电阻R输出信号VO,当RC 数值与输入方波宽度…

RC电路(一)

1、RC充放电时间常数 在模拟/数字电路中,常常用到由电阻R和电容C组成的RC电路,R和C的取值不同,会导致输出波形和输入波形之间的关系也不同,由此也会产生不同的应用。 当t RC时,电容电压0.63E; 当t 2RC时&a…

RC电路知识讲解

RC电路是指由电阻R和电容C组成的电路,他是脉冲产生和整形电路中常用的电路。1.RC 1.RC充电电路 电源通过电阻给电容充电,由于一开始电容两端的电压为0,所以电压的电压都在电阻上,这时电流大,充电速度快。随着电容两端…