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

PHP
スポンサーリンク

前提とする環境は下記。

  • 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を再起動してみると以下のようなエラーがでます。
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です。

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

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

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

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

  • 作者: エディフィストラーニング株式会社飯室美紀,岡野友紀,西昭彦,鈴木佐和
  • 出版社/メーカー: ソフトバンククリエイティブ
  • 発売日: 2011/07/01
  • メディア: 単行本
  • 購入: 2人 クリック: 12回
  • この商品を含むブログを見る
新・門外不出のOracle現場ワザ エキスパートが明かす運用・管理の極意 (DB Selection)

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

  • 作者: 小田圭二,大塚信男,五十嵐建平,谷敦雄,宮崎博之,神田達成,村方仁
  • 出版社/メーカー: 翔泳社
  • 発売日: 2012/08/17
  • メディア: 単行本(ソフトカバー)
  • 購入: 2人 クリック: 5回
  • この商品を含むブログ (1件) を見る
タイトルとURLをコピーしました