前書き
同社はローカライズされた開発に取り組みたいと考えています。データベースは Dameng データベースを使用しています。Dameng のバージョンは dm8 で、PHP のバージョンは 7.2 です。初期段階は Windows 上で実行されます。
データベースは mysql から Dameng データベースに移行されます。移行方法と PHP 拡張機能のインストール方法については説明しません。これに関しては、インターネット上に非常に多くの情報があります。 しかし、PHP を使用して Dameng データベースに接続する方法に関する情報は比較的少ないです。顧客サービス技術については誰もが知っています。すべての情報はドキュメントを読むことに依存しています。私が踏んだ落とし穴について簡単に説明します。データベースを直接操作し、好みに応じてカプセル化する方法です。 Dameng の情報ディレクトリについて簡単に説明します。Dameng のインストール ディレクトリ配下の "doc" には主にさまざまな使用方法のドキュメントが含まれています。 "drivers" にはさまざまな言語の拡張機能が含まれています。PHP の拡張子はここから引用しています。私は主にphp_dm の拡張子. pdo_dm については情報が少なすぎるため、あまり調べませんでした。
データベースをインスタンス化するときに注意する必要がある点が 2 つあります。文字セットと文字列の大文字と小文字の区別を覚えておく必要があります。事前に をしっかりと準備し、穴にはまらないようにしてください。
私の経験では、MySQL から移行されたデータ テーブル名とフィールド名はすべて小文字であるため、後で使用するときにさまざまな落とし穴が発生します。後で、大文字と小文字の区別を削除できることがわかりました。 ここでは、公式サンプルライブラリにあるCITYテーブルを使って、php7.2のさまざまな使用方法を紹介します。Query
早速、コード//连接数据库 $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);
#から始めましょう。 ##Dameng の php 公式拡張機能 php5 と php7 の使用方法は大きく異なります。php5 の多くのメソッドは php7 では使用できません。
一部のメソッドは php7 では別のメソッドに置き換えられます。インターネット上の情報のほとんどは php5 です。はい、php7では全く使えません。クエリ文の中国語文字化け問題はシンクホールです。ドキュメントを長い間確認した後、この方法を試しました。他にもっと洗練された方法があれば、教えてください。それぞれから誰もが学ぶことができます他の。
Insert//连接数据库 $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);
増加することしかできません。カーブクエリによる id 値。もちろん、デモのテーブルには自動インクリメント ID はありません。同時に、insert_id として SELECT @@IDENTITY のクエリが成功する必要があります。挿入が失敗した場合でも、自己インクリメントは前回正常に挿入された 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);
削除も非常に簡単で、特別な料金はかかりません注意
Transaction
公式ドキュメントによると、「DM はトランザクションの開始を明示的に定義するステートメントを提供しません。最初の実行可能な SQL ステートメント (ログイン ステートメントを除く)」 ) トランザクションの開始を暗黙的に定義します。Start」がトランザクション開始メソッドが定義されていない理由ですが、特定のプログラムからトランザクションを開始したい場合は、 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);
踏まれたピット
1. Dameng からタイムスタンプ形式で時刻を取得します。 database
select DATEDIFF(s, '1970-01-01 00: 00:00', GETUTCDATE());
2. 以前使用していたデータベースが mysql の場合は、料金を支払います2 種類の時間形式 DATETIME と TIMESTAMP の背後にあるスケールに注意してください (0 でない場合) 時間の精度は長くなります
3. 一部のフィールドは、クエリ時に大文字になります。 "count"
解決策: フィールドを変更します。二重引用符を使用して上記の例を引用します。
四、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);
结语
目前踩过的坑就这些了,希望能够帮助到大家。
对于其他问题还是要多翻阅官方文档了。