首頁 >後端開發 >PHP7 >詳解php7如何連接使用dm資料庫(圖文)

詳解php7如何連接使用dm資料庫(圖文)

藏色散人
藏色散人轉載
2022-02-03 05:00:303427瀏覽

前言


公司要搞國產化開發,資料庫選用達夢資料庫,達夢版本為dm8,php版本為7.2,前期在Windows進行開發

資料庫從mysql遷移到達夢資料庫裡面,遷移方法和php的擴充安裝方法就不講了,這方面網路上的資料還蠻多。

不過php連接達夢資料庫之後的使用操作的資料就比較少了,客服的技術大家都懂的,資料全靠翻文檔,簡單給大家提供一下我踩過的坑,方法都是直接操作資料庫,後續依照大家自己的喜好去封裝去吧。

簡單說明一下達夢的資料目錄,在達夢的安裝目錄下面的《doc》裡面主要是各種使用文檔,《drivers》裡面是各種語言的擴展,php的so擴展就是從這裡取的,我這裡主要使用的是php_dm的擴充,pdo_dm的資料太少了我就沒怎麼研究。

詳解php7如何連接使用dm資料庫(圖文)

詳解php7如何連接使用dm資料庫(圖文)

實例化資料庫的時候有兩點需要提醒各位的,字元集和字串大小寫敏感記得提前設定好,不要給自己挖坑。

本人經歷就是mysql遷移過來的資料表名和欄位名稱都是小寫,結果在後面使用的時候各種坑,後來發現大小寫敏感去掉就可以了。

詳解php7如何連接使用dm資料庫(圖文)

這裡就用官方的範例庫裡面的CITY這張表來示範php7.2各種使用方法吧。

詳解php7如何連接使用dm資料庫(圖文)

詳解php7如何連接使用dm資料庫(圖文)

#查詢


#廢話不多說,先上程式碼

//连接数据库
$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 * from DMHR.CITY";
$result = dm_exec($link,$query);

print " 查询结果:";
while ($line = dm_fetch_array($result)){
    print_r($line);
    echo '<br>';
}

/* 释放资源 */
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 = "INSERT INTO DMHR.CITY (CITY_ID,CITY_NAME,REGION_ID) VALUES ('JL','吉林','1')";
$result = dm_exec($link,$query);

if($result){
    echo "插入成功";
    //曲线查询插入id
    /*$query = "SELECT @@IDENTITY as insert_id";
    $result = dm_exec($link,$query);
    $line = dm_fetch_array($result);
    echo ',ID:';
    print_r($line);*/
}

/* 释放资源 */
dm_free_result($result);

/* 断开连接 */
dm_close($link);

官方提供的dm_insert_id()這個函數看起來只用php5能用,php7沒有這個函數,只能透過曲線查詢自增的id值,當然示範的這張表沒有自增ID,同時SELECT @@IDENTITY as insert_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 = "UPDATE  DMHR.CITY SET REGION_ID='2' WHERE CITY_ID='JL'";
$result = dm_exec($link,$query);

if($result){
    echo "更新成功";
}

/* 释放资源 */
dm_free_result($result);

/* 断开连接 */
dm_close($link);

更新就很簡單了

刪除


//连接数据库
$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 = "DELETE FROM DMHR.CITY WHERE (CITY_ID='JL')";
$result = dm_exec($link,$query);

if($result){
    echo "删除成功";
}

/* 释放资源 */
dm_free_result($result);

/* 断开连接 */
dm_close($link);

刪除也很簡單,沒什麼特別注意的地方

事務


根據官方文件介紹:「DM 沒有提供明確定義交易開始的語句,第一個可執行的SQL 語句(除登入語句外)隱含交易的開始”,這是沒有定義事務開始方法的原因,不過當我們要從某一段程序開始事務的時候,可以使用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 = "INSERT INTO DMHR.CITY (CITY_ID,CITY_NAME,REGION_ID) VALUES ('JL','吉林','1')";
$result = dm_exec($link,$query);

if($result){
    echo "插入成功。";
}

$result = dm_autocommit($link,false);//事务自动提交关闭
$query = "UPDATE  DMHR.CITY SET CITY_NAME='辽宁' WHERE (CITY_ID='SY')";
$result = dm_exec($link,$query);
if($result){
    echo "更新成功,回滚。";
}


dm_rollback($link);//回滚
//dm_commit($link);//提交

$result = dm_autocommit($link,true);//开启事务自动提交,结束事务

/* 断开连接 */
dm_close($link);

踩過的坑


一、在達夢資料庫中取得時間戳格式的時間
select DATEDIFF(s, '1970-01-01 00: 00:00', GETUTCDATE());

二、如果之前使用的資料庫是mysql,時間格式DATETIME 和TIMESTAMP 這兩種類型後面的標度要注意一下,如果不是0的話時間精度會更長
詳解php7如何連接使用dm資料庫(圖文)

三、有些字段查詢出來的話會變成大寫,例如「count」
詳解php7如何連接使用dm資料庫(圖文)

解決方法:將字段用雙引號引上例:
select count(1) as "count" from "DMHR"."CITY";

四、group by语句的使用很严格(或者说mysql的group by过于放松),select中除聚合函数之外出现的所有字段必须要在group by里面。

比方举一个错误的例子:

select EMPLOYEE_NAME,JOB_ID from "DMHR"."EMPLOYEE" group by JOB_ID;
EMPLOYEE_NAME和字段没在group by 中,执行必定失败
提供一种解决思路:

select * from "DMHR"."EMPLOYEE" where EMPLOYEE_ID in (select min(EMPLOYEE_ID) as minid from "DMHR"."EMPLOYEE" group by JOB_ID)

同样select中如果有聚合函数之外的字段,需要加入group by。错误的例子:

select min(EMPLOYEE_ID),EMPLOYEE_NAME,JOB_ID from "DMHR"."EMPLOYEE";
select中有min()函数外还有其他字段,执行必定失败。
如果一定要在其他很多字段里面加入聚合函数,提供一种思路:

select t1.EMPLOYEE_NAME,t1.JOB_ID,t2.minid from "DMHR"."EMPLOYEE" t1
left join ( select min(EMPLOYEE_ID) as minid,JOB_ID from "DMHR"."EMPLOYEE" group by JOB_ID ) t2 on t2.JOB_ID=t1.JOB_ID
where t1.EMPLOYEE_ID in (select min(EMPLOYEE_ID) as minid from "DMHR"."EMPLOYEE" group by JOB_ID);

结语


目前踩过的坑就这些了,希望能够帮助到大家。
对于其他问题还是要多翻阅官方文档了。

以上是詳解php7如何連接使用dm資料庫(圖文)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除