| 概要 |
先回オラクルインスタントとOCI拡張モジュールをCentOSサーバーにインストールしました。他のオラクルサーバーのデータ検索が出来る様になりましたので、PHPでプログラムを作成してみたいと思います。結果は、とりあえずOCI接続,PDO接続とも簡単な検索・挿入・更新・削除が可能であることを確認出来ました。
| プログラム概要 |
(1)構 成
構成は次の様なイメージです。ローカルネットワーク上の①WindowsパソコンからURL指定し、②CentOS7サーバー上のPHPプログラムを起動します。PHPプログラムから ③OracleDBにOCI接続,PDO接続し、データ検索・挿入・更新・削除します。処理結果を表出力し、①Windowsパソコンのブラウザ上で結果を確認することが出来ます。
| ③OracleDB | ⇔ | ②CentOS7 サーバー | ⇔ | ①WindowsPC |
(2)プログラム概要
CentOS7サーバー上で動くプログラム概要についてメモします。下の図はWindowsパソコンのブラウザー上の画面抜粋です。
2つのデータ表示部(表)がありますが、上段はOCI接続検索,下段がPDO接続検索した結果です。元データと検索方法は同じですが、上段と下段で検索件数が異なるのは、それぞれの検索直前にデータを1件追加している為です。
テスト処理ですので、データ内容自体に意味はありませんが、左から、ID,登録時間,接続方式,接続方式,固定文字(’test’),更新時間となっています。登録時間と更新時間は同じですが、プログラム上は、”INSERT” 後、 “UPDATE” を使って処理しています。

ページを開き直すごとに、OCI接続,PDO接続で各1件データを追加し、各処理毎の件数が設定数を超えると対象を削除します。
上の図はOCI接続で追加した全データが抹消された直後の状態となります。下の図はその後何度かページを開き直してデータが追加された状態です。

(3)プログラムメモ
プログラムを参考表示します。(接続情報等については日本語表記し、抜いています) OCI接続関連が行番38~104、PDO接続関連が行番108~167になっています。それぞれ基本的な処理内容は同じになっています。各処理前にコメントでデータ検索・挿入・更新・削除等記載していますので、詳細の記述は省略します。いずれの接続方法もSQL文を作成し、実行すればとりあえず機能する様ですので少し安心しました。変数部分の設定や検索結果取得等、ちょっとしたテクニック的な方法もある様ですので、機会があれば勉強したいと思っています。
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>cent_os_test</title>
<style>
table { border-collapse: collapse; }
table th, table td { border: solid 1px black; }
</style>
</head>
<body>
<H2>Hello CentOS7 ! ( OCI / PDO 接続評価) </H2>
<?php
$date_tmp = mb_substr(str_replace("-","/",date("Y-m-d H:i:s",strtotime("-50 day"))),0,10) ;
echo "検索日付 : ".date("Y/m/d H:i:s") ;
echo "<BR>対象日付 : ".$date_tmp." ~";
$date_cur = date("Y/m/d H:i:s");
// オラクルデータベース接続情報
$tns_str = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={IP アドレス}) (PORT=1521))(CONNECT_DATA=(SERVICE_NAME={サーバーサービス名})))';
$con_nam = "ユーザー名" ;
$con_pas = "パスワード" ;
// 検索SQL1
$sql = "SELECT ID_NO , to_char(DATE_LCY,'yyyy/mm/dd hh24:mi:ss') , SYS_NAME , CHR_NAME , KUBUN , to_char(DATE_FNS,'yyyy/mm/dd hh24:mi:ss') " ;
$sql = $sql."FROM TEST_TABLE_NAME WHERE KUBUN= 'test' AND DATE_LCY >= '".$date_tmp."' ORDER BY DATE_LCY DESC , SYS_NAME" ;
// 検索SQL2
$sql_mik = "SELECT ID_NO , to_char(DATE_LCY,'yyyy/mm/dd hh24:mi:ss') , SYS_NAME , CHR_NAME , KUBUN , to_char(DATE_FNS,'yyyy/mm/dd hh24:mi:ss') " ;
$sql_mik = $sql_mik."FROM TEST_TABLE_NAME WHERE KUBUN= 'test' AND DATE_FNS IS NULL ORDER BY DATE_LCY , SYS_NAME" ;
// ◆◆◆ OCI 接続 TEST ◆◆◆
$conn = oci_connect( $con_nam , $con_pas , $tns_str , 'AL32UTF8' ); // 直接記載,文字コード指定(AL32UTF8)
if(!$conn){
echo "<P>× OCI接続失敗 ×</P><BR><BR>";
}else{
//【SELECT】登録件数検索(KUBUN = 'test' AND SYS_NAME = 'OCI')
$sql_chk = "SELECT COUNT(*) AS NUMBER_OF_ROWS FROM TEST_TABLE_NAME WHERE KUBUN = 'test' AND SYS_NAME = 'OCI'" ;
$stid = oci_parse($conn, $sql_chk) ;
oci_define_by_name($stid, 'NUMBER_OF_ROWS', $number_of_rows) ;
oci_execute( $stid ) ;
oci_fetch( $stid ) ;
if($number_of_rows>10){
//【DELETE】登録検索増加時、抹消
$sql_del = "DELETE FROM TEST_TABLE_NAME WHERE KUBUN = 'test' AND SYS_NAME = 'OCI'";
$stid = oci_parse($conn, $sql_del);
oci_execute( $stid );
}else{
//【INSERT】登録件数が条件以下の時、新規登録
$nam_reg = "◇".substr( "00000000".strval(floor(100000000 * microtime())) , -8 )."◇" ;
$sql_ins = "INSERT INTO TEST_TABLE_NAME ( ID_NO , DATE_LCY , SYS_NAME , CHR_NAME , KUBUN , DATE_FNS ) ";
$sql_ins = $sql_ins."VALUES ('".$nam_reg."',TO_DATE('".$date_cur."','YYYY:MM.DD:HH24/MI/SS'),'OCI','◇OCI-CONN◇','test','')";
$stid = oci_parse($conn, $sql_ins);
oci_execute( $stid );
}
echo "<P>◎ OCI接続成功 ◎</P>";
//【SELECT】DATE_FNS 日付未設定のデータ有無検索
$stid = oci_parse( $conn , $sql_mik );
oci_execute( $stid );
$reWrtID="";
while ($row = oci_fetch_array($stid, OCI_NUM + OCI_RETURN_NULLS)) {
// 登録日付の古い1件のみを対象とする
$reWrtID = $row[0];
break;
}
//【UPDATE】DATE_FNS 日付更新
if($reWrtID!=""){
$sql_upd = "UPDATE TEST_TABLE_NAME SET DATE_FNS = TO_DATE('".$date_cur."','YYYY:MM.DD:HH24/MI/SS') ";
$sql_upd = $sql_upd."WHERE ID_NO ='".$reWrtID."'";
$stid = oci_parse( $conn , $sql_upd );
oci_execute( $stid );
}
//【SELECT】登録データ検索・表示
$stid = oci_parse( $conn , $sql );
oci_execute( $stid );
$rw_cnt = 0 ;
while ($row = oci_fetch_array($stid, OCI_NUM + OCI_RETURN_NULLS)) {
if($rw_cnt == 0){ echo "<TABLE>" ; }
echo "<TR>" ;
for ($i = 0 ; $i < count($row); $i++){
echo "<TD>".$row[$i]."</TD>" ;
}
echo "</TR>" ;
$rw_cnt = $rw_cnt + 1 ;
}
if($rw_cnt > 0){ echo "</TABLE>" ; }
}
$conn = null ;
echo "<BR><BR>";
// ◆◆◆ PDO 接続 TEST ◆◆◆
try {
$db = new PDO('oci:dbname='.$tns_str.';charset=utf8' , $con_nam , $con_pas );
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "<P>◎ PDO接続成功 ◎</P>";
//【SELECT】登録件数検索(KUBUN = 'test' AND SYS_NAME = 'PDO')
$sql_chk = "SELECT COUNT(*) FROM TEST_TABLE_NAME WHERE KUBUN = 'test' AND SYS_NAME = 'PDO'" ;
$stmt = $db->query($sql_chk);
$dat_cnt=$stmt->fetchColumn();
if($dat_cnt>5){
//【DELETE】登録検索増加時、抹消
$sql_del = "DELETE FROM TEST_TABLE_NAME WHERE KUBUN = 'test' AND SYS_NAME = 'PDO'";
$res_del = $db->query($sql_del);
}else{
//【INSERT】登録件数が条件以下の時、新規登録
$nam_reg = "◆".substr( "00000000".strval(floor(100000000 * microtime())) , -8 )."◆" ;
$sql_ins = "INSERT INTO TEST_TABLE_NAME ( ID_NO , DATE_LCY , SYS_NAME , CHR_NAME , KUBUN , DATE_FNS ) ";
$sql_ins = $sql_ins."VALUES ('".$nam_reg."',TO_DATE('".$date_cur."','YYYY:MM.DD:HH24/MI/SS'),'PDO','◆PDO-CONN◆','test','')";
$res_ins = $db->query($sql_ins);
}
//【SELECT】DATE_FNS 日付未設定のデータ有無検索
$reWrtID="";
$res_upd = $db->query($sql_mik);
while($row = $res_upd -> fetch(PDO::FETCH_NUM)) {
$reWrtID = $row[0];
break;
}
//【UPDATE】DATE_FNS 日付更新
if($reWrtID!=""){
$sql_upd = "UPDATE TEST_TABLE_NAME SET DATE_FNS = TO_DATE('".$date_cur."','YYYY:MM.DD:HH24/MI/SS') ";
$sql_upd = $sql_upd."WHERE ID_NO ='".$reWrtID."'";
$res_upd = $db->query($sql_upd);
}
//【SELECT】登録データ検索・表示
$rw_cnt = 0 ;
$stmt = $db->query($sql);
while($row = $stmt -> fetch(PDO::FETCH_NUM)) {
if($rw_cnt == 0){ echo "<TABLE>" ; }
echo "<TR>" ;
for ($i = 0 ; $i < count($row); $i++){ echo "<TD>".$row[$i]."</TD>" ; }
echo "</TR>" ;
$rw_cnt = $rw_cnt + 1 ;
}
if($rw_cnt > 0){ echo "</TABLE>" ; }
} catch (PDOException $e) {
echo "<P>× PDO接続失敗 ×</P>";
echo "ERROR : ".$e->getMessage();
}
$db = null ;
echo "<BR><BR>" ;
echo "<BR>検索終了。おしまい!!" ;
?>
</body>
</html>
| まとめ |
オラクルデータベース接続できる様になると、個人的にはブラウザー上で編集する画像情報などと既存の管理情報などとの連携がしやすくなると思っています。やってみて良かったというのが正直な感想です。