开发PHP连接达梦数据库(DM8)
⽂章⽬录
概要
DM PHP (PHP数据库接⼝)是在 PHP 开放源码的基础上开发的⼀个动态扩展库,接⼝的实现参考了 MySQL 的 PHP 扩展
PHP 应⽤程序可通过 DM PHP 扩展接⼝库访问 DM 数据库服务器
本⽂使⽤的DM PHP为:libphp73_dm.so
路径为:/home/dmdba/dmdbms/drivers/php_pdo
在php.ini⽂件中配置扩展(就是指定libphp73_dm.so的路径),php就拥有了与DM数据库交互的能⼒(php版本为7.3.33,故需要libphp73_dm.so动态函数)。
PDO(PHP Data Objects)是⼀种在PHP⾥连接数据库的使⽤接⼝。
PHP 数据对象(PDO) 扩展为PHP访问数据库定义了⼀个轻量级的⼀致接⼝。实现 PDO 接⼝的每个数
据库驱动可以公开具体数据库的特性作为标准扩展功能。 注意利⽤ PDO 扩展⾃⾝并不能实现任何数据库功能;必须使⽤⼀个具体数据库的 PDO 驱动来访问数据库服务。
DM DPI 驱动程序是 DM 数据库的 C/C++ 类驱动程序,是访问 DM 数据库的最直接的途径。
从上句可以看出,DM DPI是访问DM 数据库的接⼝(与DM PHP相⽐,应该更底层⼀些)
我的理解是,DM DPI是DM 数据库的接⼝(是所有编程语⾔访问DM数据库必备的),若使⽤PHP访问达梦数据库,则需要DM PHP(兼容PHP)+ DM DPI(兼容DM数据库);若使⽤Python访问达梦数据库,则需要DMPython(兼容Python)+ DM DPI(兼容DM数据库)
【综上所述】
除了DM PHP(libphp73_dm.so)之外,还需留意DM DPI(libdmdpi.so,本⽂中该动态库的路径
为/home/dmdba/dmdbms/drivers/dpi/)
环境介绍
软件版本
DM数据库DM8
PHP7.3.33
安装DM8数据库
准备⽰例库
最起码要准备测试表 PRODUCTION.PRODUCT_CATEGORY
安装PHP
获取PHP安装包
www.php/
解压安装包
本次使⽤的PHP安装包为:php-7.3.33.tar.bz2
解压PHP安装包(这⼀步仅解压了压缩包⾥的源码,需要编译安装后,才能使⽤PHP)
[root@dw1 ~]# tar -jxvf php-7.3.33.tar.bz2
编译安装
源码安装3步骤:配置(configure)、编译(make)、安装(make install)
进⼊php源码⽬录 php-7.3.33
[root@dw1 ~]# cd php-7.3.33/
检查源码是否可以被编译,⽣成Makefile,供下⾯的make命令使⽤
指定PHP的安装⽬录为:/root/php,并将php.ini的路径设置为/root/php
[root@dw1 php-7.3.33]# ./configure --prefix=/root/php/ --with-config-file-path=/root/php
编译安装PHP(耗时较长)
[root@dw1 php-7.3.33]# make && make install
设置软链接(就不⽤修改环境变量PATH了)
[root@dw1 php-7.3.33]# ln -s /root/php/bin/php /usr/bin/php
创建php.ini(控制php⾏为)
cp /soft/php-7.3.33/php.ini-production /soft/php/php.ini
检查php版本(注意PHP是NTS【⾮线程安全】的,不提供数据访问保护)
[root@dw1 php-7.3.33]# php -v
PHP 7.3.33 (cli)(built: Dec  2202118:53:19)( NTS )
Copyright (c)1997-2018 The PHP Group
Zend Engine v3.3.33, Copyright (c)1998-2018 Zend Technologies
配置DM PHP驱动
配置前,留意下root⽤户的环境变量 LD_LIBRARY_PATH
[root@dw1 dpi]# echo $LD_LIBRARY_PATH
:
/home/dmdba/dmdbms/drivers/dpi/
【注意 1】
PHP连接DM需要使⽤到动态函数库:libdmdpi.so
因此,可以配置环境变量 LD_LIBRARY_PATH,让PHP需要时能到它
vi /root/php/php.ini
添加以下内容(由于我的php是7.3.33的,故使⽤动态函数库libphp73_dm.so,php需要使⽤libphp73_dm.so⾥头的功能时,就读取libphp73_dm.so)[PHP_DM]
extension_dir="/home/dmdba/dmdbms/drivers/php_pdo"
extension=libphp73_dm.so
[dm]
dm.port=5236
dm.allow_persistent =1
dm.max_persistent = -1
dm.max_links = -1
dm.default_host = localhost
dm.default_db = dmdb
dm.default_user = SYSDBA
dm.default_user = SYSDBA
dm.defaultlrl =4096
dm.defaultbinmode =1
dm.check_persistent = ON
验证DM PHP驱动模块是否加载成功
[root@dw1 php]# php -m|grep DM
DM
【注意 1】
需要了解概念: “动态函数库”
需要了解配置: “dm.ini⽂件”
使⽤PHP与DM数据库交互
数据库连接
PHP 接⼝登录、登出⽰例程序 php_conn.php 如下:
vi /root/php_conn.php
<?php
header("Content-type:text/html;charset=utf-8"); //防⽌页⾯乱码
try
{
$link= dm_connect("localhost:5236", "SYSDBA", "SYSDBA")
or die("Could not connect : ". dm_error()."\n");
//使⽤ dm_error 会显⽰ dm 的 php 接⼝返回的错误,执⾏成功,则继续往下执⾏。
print "php: Connected successfully"."\n";
/*断开连接*/
dm_close($link);
}
catch(Exception $e)
{
$e->getMessage()."<br/>";
}
>
【注意 1】
数据库IP、端⼝号、⽤户、密码要根据实际情况进⾏修改
【注意 2】
需了解下代码(此处仅复制粘贴,未做任何注释)
执⾏结果如下:
[root@dw1 ~]# php php_conn.php
php: Connected successfully
开发⽰例
基础操作⽰例
PHP 接⼝增、删、改、查四个基本操作,⽰例程序 php_dml.php 如下:
vi /root/php_dml.php
php远程连接mysql数据库<?php
header("Content-type:text/html;charset=utf-8"); //防⽌页⾯乱码
try
{
$link= dm_connect("localhost:5236", "SYSDBA", "SYSDBA")
or die("Could not connect : ". dm_error()."\n");
//使⽤ dm_error 会显⽰ dm 的 php 接⼝返回的错误,执⾏成功,则继续往下执⾏。
print "php: Connected successfully"."\n";
/
/清空表,初始化测试环境
$result= dm_exec($link, 'delete from PRODUCTION.PRODUCT_CATEGORY') or die("Query failed : ". dm_error()."\n");
//插⼊数据
$result= dm_exec($link, "insert into PRODUCTION.PRODUCT_CATEGORY(NAME) values('语⽂'), ('数学'), ('英语'), ('体育')")
or die("Query failed : ". dm_error()."\n");
print "php: insert success"."\n";
//删除数据
$result= dm_exec($link, "delete from PRODUCTION.PRODUCT_CATEGORY where name='数学'") or die("Query failed : ". dm_error()."\n");
print "php: delete success"."\n";
/
/更新数据
$result= dm_exec($link, 'update PRODUCTION.PRODUCT_CATEGORY set name = \'英语-新课标\' where name=\'英语\'') or die("Query failed : ". dm_e rror()."\n");
print "php: update success"."\n";
//查询数据
$result= dm_exec($link, "select * from PRODUCTION.PRODUCT_CATEGORY") or die("Query failed : ". dm_error()."\n");
print "<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\">\n";
while($line= dm_fetch_array($result))
{
print "\t<tr>\n";
foreach ($line as $col_value){
print "\t\t<td>$col_value</td>\n";
}
print "\t</tr>\n";
}
print "</table>\n";
/*释放资源*/
dm_free_result($result);
print "php: select success"."\n";
/*断开连接*/
dm_close($link);
}
catch(Exception $e)
{
$e->getMessage()."<br/>";
}
>
【注意 1】
数据库IP、端⼝号、⽤户、密码要根据实际情况进⾏修改
【注意 2】
需了解下代码(此处仅复制粘贴,未做任何注释)
执⾏结果如下:
执⾏前,⽤disql查看PRODUCTION.PRODUCT_CATEGORY表的内容SQL>select * from PRODUCTION.PRODUCT_CATEGORY;
⾏号    PRODUCT_CATEGORYID NAME
---------- ------------------ ---------
11⼩说
22⽂学
33计算机
44英语
55管理
66少⼉
77⾦融
7 rows got
已⽤时间: 0.547(毫秒). 执⾏号:801.
执⾏程序 php_dml.php
[root@dw1 ~]# php /root/php_dml.php
php: Connected successfully
php: insert success
php: delete success
php: update success
<table border="1"cellspacing="1"cellpadding="1">
<tr>
<td>8</td>
<td>语⽂</td>
</tr>
<tr>
<td>10</td>
<td>英语-新课标</td>
</tr>
<tr>
<td>11</td>
<td>体育</td>
</tr>
</table>
php: select success
执⾏后,⽤disql查看PRODUCTION.PRODUCT_CATEGORY表的内容SQL>select * from PRODUCTION.PRODUCT_CATEGORY;
⾏号    PRODUCT_CATEGORYID NAME
---------- ------------------ ----------------
18语⽂
210英语-新课标
311体育
已⽤时间: 0.239(毫秒). 执⾏号:802.
绑定变量⽰例

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。