TechNote

事務屋のおぼえがき

PHPからociでOracleデータベースへ接続する方法と注意点まとめ

f:id:kojikoji75:20140731233932j:plain
photo credit: torkildr via photopin cc

サマリー

1.ociとは
2.php.iniの設定
3.Oracle Instant Clientのインストール(必要な場合)
4.XAMPP起動時の注意点
5.PHPからoracle接続の記述方法
6.CodeIgniter使用時の記述方法



ちなみに環境は下記。

  • XAMPP for windows 1.8.1
  • Oracle11g

1.ociとは

Oracle Call Interface (OCI)とは、各言語からのデータベース操作を実現するRDBMSAPIです。過去エントリー「PHPからODBC経由でoracleデータベースへ接続するための記述 - TechNote
」とは違って、直接oracle接続に行く場合の接続方法の話です。



2.php.iniの設定

oci接続を使用するには、php.iniで以下の設定をします(xamppの場合)。


(1)以下のコメントアウトを削除して有効にする。
(10gを使用の場合は1行目を有効に、11gを使用の場合は2行目を有効に)

;extension=php_oci8.dll ; Use with Oracle 10gR2 Instant Client
;extension=php_oci8_11g.dll ; Use with Oracle 11gR2 Instant Client

(2)必要であれば以下のコメントアウト部分も有効にして、各種値を設定する。設定値についてはググッてみてください。ここでは接続するまでの最低限の説明に留めておくため、デフォルト値のままとしています。

[OCI8]
 :
;oci8.privileged_connect = Off
 :
;oci8.max_persistent = -1
 :
;oci8.persistent_timeout = -1
 :
;oci8.ping_interval = 60
 :
;oci8.connection_class =
 :
;oci8.events = Off
 :
;oci8.statement_cache_size = 20
 :
;oci8.default_prefetch = 100
 :
;oci8.old_oci_close_semantics = Off





3.Oracle Instant Clientのインストール(必要な場合)

Oracle Instant Clientは、標準のOracleクライアントをインストールしたりORACLE_HOMEを作成したりすることなく、Oracleクライアントとして接続できる環境を提供するものです。
Oracleクライアントをインストールしていない場合は下記からダウンロード&インストールします。
http://www.oracle.com/technetwork/jp/topics/index-099943-ja.html


私の場合はOracleクライアント入れてましたので、この手順は不要でした。



4.XAMPP起動時の注意点

ここまでの状態で、php.iniの設定を反映させるためにXAMPPコントロールパネルにてApacheを再起動してみると以下のようなエラーがでます。
f:id:kojikoji75:20140731235027j:plain

コンピュータにOCI.dllがないため、プログラムを開始できません。この問題を解決するにはプログラムを再インストールしてみてください。


これは、oci.dllをロードできないために出るエラーメッセージです。windowsでは環境変数pathにあるディレクトリのdllがロードされるため環境変数pathの値にoci.dllがあるディレクトリパスを追加することでロードできるようになります。

手順3(Oracle Instant Clientのインストール)をした場合は、単純にdllを配置した場所に環境変数pathを通すだけで上記のエラーはなくなるでしょう。

但し、わたしのように既に標準oracleクライアントをインストールして使用していた端末にwebサーバを立てて使用しようとしている場合は、環境変数pathを変更することによってoracleがライブラリを読み込む順番が変わってくる可能性もあるため、局所的にpathを変更するような対応をとるべきです。

そこで以下のようなバッチファイルを作成して「XamppStart.bat」などで保存します。

SET PATH=C:\oracle\product\11.2.0\client_1\bin;
SET NLS_LANG=Japanese_Japan.AL32UTF8
c:\xampp\xampp_start.exe


これは、1行目でpathを変更(局所的に)、2行目でNLS_LANGの設定、3行目でxamppスタートしています。

このバッチファイルを起動することで、oracleに接続可能状態(文字化けも解決した状態で)でhttpd.exeが起動するという流れです。

f:id:kojikoji75:20140731234119j:plain


5.PHPからoracle接続の記述方法

oci_connect関数を使用した以下のような書き方で接続可能となります。

//oci_connect
$conn = oci_connect('username','password','connectstring');
if(!$conn){
    $e = oci_error();
    trigger_error(htmlentities($e['message'],ENT_QUOTES),E_USER_ERROR);
}

$sql = "select * from t_patient where patientno=".$id;
$stid = oci_parse($conn,$sql);
oci_execute($stid);
while($row = oci_fetch_array($stid,OCI_ASSOC+OCI_RETURN_NULLS)){
	$kananame = $row['kananame'];//値を取得
}




6.CodeIgniter使用時の記述方法

CodeIgniterからoci接続を使用する場合は、database.phpにて以下のように記述します。

$db['default']['hostname'] = "(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = svord)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = ORCL)))";
$db['default']['username'] = "username";
$db['default']['password'] = "password";
$db['default']['database'] = "connectstring";
$db['default']['dbdriver'] = "oci8";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";

hostnameのところは、少し長くなりますがoracleクライアントのtnsnames.oraに書く内容と同一のものを記述します。あとのモデルやコントローラへの記述はMySQLなんかへ接続するときと全く同じ書き方でOKです。




あわせて読みたい

PHPからODBC経由でoracleデータベースへ接続するための記述 - TechNotePHPからODBC経由でoracleデータベースへ接続するための記述 - TechNote

単純な接続方法だが、意外にハマったのでメモを残す。1.COMを使った接続方法(ADODB)2.odbc_connectを使った接続方法1.COMを使った方法(A...

PHPからAccessデータベースの使用 - TechNotePHPからAccessデータベースの使用 - TechNote

PHPからAccessのデータベース(mdb)を利用するにはODBC経由での接続が必要。ODBCの設定手順1.「コントロールパネル」→「管理ツール」→「データソ...

プログラムで簡単理解! 7つの超重要な整列アルゴリズム(ソートアルゴリズム)まとめ - TechNoteプログラムで簡単理解! 7つの超重要な整列アルゴリズム(ソートアルゴリズム)まとめ - TechNote

基本情報技術者試験応用情報技術者試験の時期も近まった今、あらためて整列アルゴリズムをまとめてみたので、忘備録を兼ねてメモを残します。即席コードも併せて記載しま...


絵で見てわかるOracleの仕組み (DB Magazine SELECTION)

絵で見てわかるOracleの仕組み (DB Magazine SELECTION)

【オラクル認定資格試験対策書】ORACLE MASTER Bronze[Bronze DBA11g](試験番号:1Z0-018)完全詳解+精選問題集 (オラクルマスタースタディガイド)

【オラクル認定資格試験対策書】ORACLE MASTER Bronze[Bronze DBA11g](試験番号:1Z0-018)完全詳解+精選問題集 (オラクルマスタースタディガイド)

新・門外不出のOracle現場ワザ エキスパートが明かす運用・管理の極意 (DB Selection)

新・門外不出のOracle現場ワザ エキスパートが明かす運用・管理の極意 (DB Selection)