参考文献
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 |
PHP | 7.3.33 |
参考:
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所需的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安装包(这一步仅解压了压缩包里的源码,需要编译安装后,才能使用PHP)
[root@dw1 ~]# tar -jxvf php-7.3.33.tar.bz2
进入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
配置前,留意下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 接口登录、登出示例程序 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() . "
";
}
?>
【注意 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 "\"1\" cellspacing=\"1\" cellpadding=\"1\">\n";
while ($line = dm_fetch_array($result))
{
print "\t\n";
foreach ($line as $col_value) {
print "\t\t$col_value \n";
}
print "\t \n";
}
print "
\n";
/*释放资源*/
dm_free_result($result);
print "php: select success"."\n";
/*断开连接*/
dm_close($link);
}
catch(Exception $e)
{
$e->getMessage() . "
";
}
?>
【注意 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 "\"1\" cellspacing=\"1\" cellpadding=\"1\">\n";
while ($line = dm_fetch_array($result))
{
print "\t\n";
foreach ($line as $col_value) {
print "\t\t$col_value \n";
}
print "\t \n";
}
print "
\n";
print "php: select successfully"."\n";
/*断开连接*/
dm_close($link);
}
catch(Exception $e)
{
$e->getMessage() . "
";
}
?>
【注意 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