当前位置: 首页 > 后端技术 > PHP

php7.2连接使用大梦(dm)数据库

时间:2023-03-30 03:54:36 PHP

前言公司想做本地化开发,数据库使用大梦数据库,大梦版本是dm8,php版本是7.2,开发是在windows上进行的早期。数据库从mysql迁移到dream数据库。php的迁移方法和扩展安装方法就不说了。网上这方面的资料还是蛮多的。但是php连接大梦数据库后,关于使用和操作的资料比较少。每个人都知道客户服务的技术。让我们根据自己的喜好来包装。简单说明一下大梦的数据目录。大梦安装目录下的《doc》主要是各种使用文档,《drivers》的内容是各种语言的扩展。php的so扩展就是取自它。我这里主要用到的是php_dm的扩展。pdo_dm资料太少,所以没怎么研究。在实例化数据库的时候,有两点需要提醒一下。字符集和字符串区分大小写要提前设置好,以免给自己挖坑。我自己的经验是从mysql迁移过来的数据表名和字段名都是小写的。导致后面使用的时候出现各种坑。后来发现可以去掉区分大小写。这里使用官方示例库中的CITY表来演示php7.2的各种使用方法。查询废话,先上代码//连接数据库$link=dm_connect("localhost","SYSDBA","SYSDBA");if(!$link){var_dump(@dm_error());var_dump(iconv("GBK","UTF-8",@dm_errormsg()));}dm_setoption($link,1,12345,1);//设置dm连接和语句的相关属性,设置UTF8$query="select*fromDMHR.CITY";$result=dm_exec($link,$query);print"查询结果:
";while($line=dm_fetch_array($result)){print_r($line);echo'
';}/*释放资源*/dm_free_result($result);/*断开连接*/dm_close($link);大梦的官方php扩展php5和php7的使用有很大区别,php5中的很多方法在php7中是不能用的,有些方法在php7中被其他方法代替了。网上的资料大多是php5的,在php7中根本用不了。查询语句中的汉字乱码问题是一个天坑。查了很久文档,试了一下这个方法。如果还有其他更优雅的方法,欢迎传授,大家互相学习。插入//连接到数据库$link=dm_connect("localhost","SYSDBA","SYSDBA");if(!$link){var_dump(@dm_error());var_dump(iconv("GBK","UTF-8",@dm_errormsg()));}dm_setoption($link,1,12345,1);//设置dm连接和语句的相关属性,设置UTF8$query="INSERTINTODMHR.CITY(CITY_ID,CITY_NAME,REGION_ID)VALUES('JL','吉林','1')";$result=dm_exec($link,$query);if($result){echo"插入成功";//曲线查询插入id/*$query="SELECT@@IDENTITYasinsert_id";$result=dm_exec($link,$query);$line=dm_fetch_array($result);回声',编号:';print_r($line);*/}/*释放资源*/dm_free_result($result);/*断开连接*/dm_close($link);官方的dm_insert_id()函数好像只有php5才有,php7没有这个函数,只能通过曲线查询id值自增,当然demo表没有自增ID,以及同时SELECT@@IDENTITYasinsert_id这句一定查询成功。即使插入失败,也会返回上一次插入成功的自增ID。不要使用自增ID来判断语句是否插入成功。更新//连接到数据库$link=dm_connect("localhost","SYSDBA","SYSDBA");if(!$link){var_dump(@dm_error());var_dump(iconv("GBK","UTF-8",@dm_errormsg()));}dm_setoption($link,1,12345,1);//设置dm连接和语句的相关属性,设置UTF8$query="UPDATEDMHR.CITYSETREGION_ID='2'WHERECITY_ID='JL'";$result=dm_exec($link,$query);if($result){echo"更新成功";}/*释放资源*/dm_free_result($result);/*断开*/dm_close($link);更新非常简单delete//连接到数据库$link=dm_connect("localhost","SYSDBA","SYSDBA");if(!$link){var_dump(@dm_error());var_dump(iconv("GBK","UTF-8",@dm_errormsg()));}dm_setoption($link,1,12345,1);//设置dm连接和语句的相关属性,设置UTF8$query="DELETEFROMDMHR.CITYWHERE(CITY_ID='JL')";$result=dm_exec($link,$query);if($result){echo"删除成功";}/*释放资源*/dm_free_result($result);/*Disconnect*/dm_close($link);删除也很简单,没有什么特别需要注意的。SQL语句(除了login语句)隐含着事务的开始”,这就是为什么没有定义事务启动方法的原因,但是当我们想从某个程序启动事务时,我们可以使用dm_autocommit()函数关闭事务的自动提交,程序结束后会开启自动提交//连接数据库$link=dm_connect("localhost","SYSDBA","SYSDBA");if(!$link){var_dump(@dm_error());var_dump(iconv("GBK","UTF-8",@dm_errormsg()));}dm_setoption($link,1,12345,1);//设置dm连接和语句的相关属性,设置UTF8$query="INSERTINTODMHR.CITY(CITY_ID,CITY_NAME,REGION_ID)VALUES('JL','吉林','1')";$result=dm_exec($link,$query);if($result){echo"插入成功";}$result=dm_autocommit($link,false);//事务自动提交关闭$query="UPDATEDMHR.CITYSETCITY_NAME='辽宁'WHERE(CITY_ID='SY')";$result=dm_exec($link,$query);if($result){echo"更新成功,回滚";}dm_rollback($link);//回滚//dm_commit($link);//提交$result=dm_autocommit($link,true);//启用事务自动提交,结束事务/*Disconnect*/dm_close($link);踩过的坑1.获取大梦数据库中的时间戳格式时间selectDATEDIFF(s,'1970-01-0100:00:00',GETUTCDATE());2、如果之前使用的数据库是mysql,注意DATETIME和TIMESTAMP这两种时间格式后面的刻度。如果不为0,时间精度会更长。3、有些字段在查询的时候会大写,比如“count”解决办法:用双引号把字段括起来。示例:从“DMHR”.“CITY”中选择count(1)作为“count”;4、groupby语句的使用很严格(或者mysql的groupby过于宽松),除了聚合函数外,select中出现的所有字段都必须在groupby中。比如举个错误的例子:selectEMPLOYEE_NAME,JOB_IDfrom"DMHR"."EMPLOYEE"groupbyJOB_ID;EMPLOYEE_NAME和fields不在groupby中,执行肯定失败。提供解决方案:select*from"DMHR"."EMPLOYEE"whereEMPLOYEE_IDin(selectmin(EMPLOYEE_ID)asminidfrom"DMHR"."EMPLOYEE"groupbyJOB_ID)同理,如果select中有聚合函数以外的字段,您需要添加分组依据。错误示例:selectmin(EMPLOYEE_ID),EMPLOYEE_NAME,JOB_IDfrom"DMHR"."EMPLOYEE";select中除了min()函数还有其他字段,执行肯定失败。如果必须向许多其他字段添加聚合函数,这里有一个想法:selectt1.EMPLOYEE_NAME,t1.JOB_ID,t2.minidfrom"DMHR"."EMPLOYEE"t1leftjoin(selectmin(EMPLOYEE_ID)asminid,JOB_IDfrom"DMHR".EMPLOYEE"groupbyJOB_ID)t2ont2.JOB_ID=t1.JOB_IDwheret1.EMPLOYEE_IDin(selectmin(EMPLOYEE_ID)asminidfrom"DMHR"."EMPLOYEE"groupbyJOB_ID);坑就说这么多,希望能帮到大家。其他问题还是需要多看官方文档。