开发 | PHP连接达梦数据库(DM8)

参考文献
https://eco.dameng.com/docs/zh-cn/app-dev/php-php.html
https://eco.dameng.com/docs/zh-cn/start/python-development.html
https://blog.csdn.net/m0_61047486/article/details/120953979

概要

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
https://baike.baidu.com/item/PDO/9496399?fr=aladdin

PDO(PHP Data Objects)是一种在PHP里连接数据库的使用接口。

PHP 数据对象(PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。 注意利用 PDO 扩展自身并不能实现任何数据库功能;必须使用一个具体数据库的 PDO 驱动来访问数据库服务。

DPI 接口
https://eco.dameng.com/docs/zh-cn/app-dev/c_c++_dpi.html

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数据库

参考:
https://eco.dameng.com/docs/zh-cn/start/install-dm-linux-prepare.html
https://blog.csdn.net/weixin_41709724/article/details/121101353

准备示例库

最起码要准备测试表 PRODUCTION.PRODUCT_CATEGORY

参考:
https://eco.dameng.com/docs/zh-cn/pm/example-description.html

安装PHP

安装PHP所需的Liunx知识可参阅以下网址
http://linux.vbird.org/
Linux ./configure --prefix 命令是什么意思?
https://blog.csdn.net/yangzaiqiu1986814/article/details/50740024
php编译安装configure 一些参数详解
https://blog.csdn.net/NiluChen/article/details/41513217

  • 获取PHP安装包
    https://www.php.net/
  • 解压安装包
    本次使用的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  2 2021 18: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.connect_timeout = 10
dm.defaultlrl = 4096
dm.defaultbinmode = 1
dm.check_persistent = ON

验证DM PHP驱动模块是否加载成功
[root@dw1 php]# php -m|grep DM
DM

【注意 1】
需要了解概念: “动态函数库”
需要了解配置: “dm.ini文件”

上述参数解析可以参考:
https://blog.csdn.net/m0_61047486/article/details/120953979

使用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
   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_error()."\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】
需了解下代码(此处仅复制粘贴,未做任何注释)

【注意 3】
程序对表PRODUCTION.PRODUCT_CATEGORY进行了DML操作,执行前需准备好该表
https://eco.dameng.com/docs/zh-cn/pm/example-description.html

执行结果如下:

执行前,用disql查看PRODUCTION.PRODUCT_CATEGORY表的内容
SQL> select * from PRODUCTION.PRODUCT_CATEGORY;

行号     PRODUCT_CATEGORYID NAME     
---------- ------------------ ---------
1          1                  小说
2          2                  文学
3          3                  计算机
4          4                  英语
5          5                  管理
6          6                  少儿
7          7                  金融

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            
---------- ------------------ ----------------
1          8                  语文
2          10                 英语-新课标
3          11                 体育

已用时间: 0.239(毫秒). 执行号:802.

绑定变量示例

vi /root/php_bind.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"; 

    //清空表,初始化测试环境
    $result = dm_exec($link, 'delete from PRODUCTION.PRODUCT_CATEGORY') or die("Query failed : " . dm_error()."\n");  

    //绑定参数方式插入数据
    $a = '物理';
    $stmt = dm_prepare($link, 'insert into PRODUCTION.PRODUCT_CATEGORY(name) values(?)');
    $result = dm_execute($stmt, array($a)) or die("Query failed : " . dm_error()."\n"); ;
    print "php: insert with bind successfully"."\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";   
    print "php: select successfully"."\n"; 

    /*断开连接*/ 
    dm_close($link); 
}
catch(Exception $e)
{
    $e->getMessage() . "<br/>";
}
?>

【注意 1】
数据库IP、端口号、用户、密码要根据实际情况进行修改

【注意 2】
需了解下代码(此处仅复制粘贴,未做任何注释)

【注意 3】
程序对表PRODUCTION.PRODUCT_CATEGORY进行了DML操作,执行前需准备好该表
https://eco.dameng.com/docs/zh-cn/pm/example-description.html

执行结果如下:

执行前,用disql查看PRODUCTION.PRODUCT_CATEGORY表的内容
SQL> select * from PRODUCTION.PRODUCT_CATEGORY;

行号     PRODUCT_CATEGORYID NAME            
---------- ------------------ ----------------
1          8                  语文
2          10                 英语-新课标
3          11                 体育

已用时间: 0.367(毫秒). 执行号:803.

[root@dw1 ~]# php /root/php_bind.php 
php: Connected successfully
php: insert with bind successfully
<table border="1" cellspacing="1" cellpadding="1">
        <tr>
                <td>12</td>
                <td>物理</td>
        </tr>
</table>
php: select successfully

执行后,用disql查看PRODUCTION.PRODUCT_CATEGORY表的内容
SQL> select * from PRODUCTION.PRODUCT_CATEGORY;

行号     PRODUCT_CATEGORYID NAME  
---------- ------------------ ------
1          12                 物理

已用时间: 0.141(毫秒). 执行号:804.

达梦云适配中心:
https://eco.dameng.com

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值