前提とする環境は下記。
- XAMPP for windows 1.8.1
- Oracle11g
1.ociとは
Oracle Call Interface (OCI)とは、各言語からのデータベース操作を実現するRDBMSのAPIです。過去エントリー「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を再起動してみると以下のようなエラーがでます。
これは、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が起動するという流れです。
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です。
絵で見てわかるOracleの仕組み (DB Magazine SELECTION)
- 作者: 小田圭二
- 出版社/メーカー: 翔泳社
- 発売日: 2006/06/21
- メディア: 単行本
- 購入: 27人 クリック: 385回
- この商品を含むブログ (48件) を見る
【オラクル認定資格試験対策書】ORACLE MASTER Bronze[Bronze DBA11g](試験番号:1Z0-018)完全詳解+精選問題集 (オラクルマスタースタディガイド)
- 作者: エディフィストラーニング株式会社飯室美紀,岡野友紀,西昭彦,鈴木佐和
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2011/07/01
- メディア: 単行本
- 購入: 2人 クリック: 12回
- この商品を含むブログを見る
新・門外不出のOracle現場ワザ エキスパートが明かす運用・管理の極意 (DB Selection)
- 作者: 小田圭二,大塚信男,五十嵐建平,谷敦雄,宮崎博之,神田達成,村方仁
- 出版社/メーカー: 翔泳社
- 発売日: 2012/08/17
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 5回
- この商品を含むブログ (1件) を見る