2003年3月5日
PHP を利用して Oracle データベースからデータを読み取り Web へ表示するまでを説明しています。なお、Oracle の基本的な操作および簡単な PHP スクリプトの作成についての説明はここでは省略しています。
- 準備
ここでは MIRACLE LINUX Standard Edition V2.1 をインストールしたサーバーを想定しています。
インストールタイプについては「Apache 利用オラクルサーバ」を考えていますが、カスタムインストールされたサーバーでも同様に設定することができます。
目標は PHP を使い Oracle データベースからデータを読み取り Web へ表示することです。
なお、Oracleの基本的な操作及び簡単なPHPスクリプトの作成についてはできるものとして話を進めます。
Oracle のインストール
Oracle をインストールしてください。Oracle のインストール方法につきましてはここでは説明しません。詳しくはマニュアル等を参照してください。
環境変数の設定
Web から Oracle へアクセスする為には、Apache の環境変数を設定する必要があります。
Install Navigator for Oracle を使用してインストールした場合には /etc/httpd/conf/httpd.bootopt へ設定されますので確認してください。
Oracle を /opt/oracle へインストールした場合の /etc/httpd/conf/httpd.bootopt 設定例
# if you are using SSL please comment out next line
#HTTPDOPT=-DSSL
# made by oranavi
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=/opt/oracle/product/9.0.1
export ORACLE_SID=orcl
export NLS_LANG=American_America.JA16EUC
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_DOC=$ORACLE_HOME/doc
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib
CLASSPATH=$CLASSPATH:$ORACLE_HOME/jdbc/lib/classes12.zip
CLASSPATH=$CLASSPATH:$ORACLE_HOME/jdbc/lib/nls_charset12.zip
export CLASSPATH
if [ ! $LD_LIBRARY_PATH ]; then
LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/ctx/lib:$ORACLE_HOME/jdbc/lib
export LD_LIBRARY_PATH
fi
|
ORACLE_HOME や ORACLE_SID については環境に合わせて適切な値へ変更してください。
テーブル
テーブルを作成します。今回は scott/tiger で作成されている EMP 表を使います。次のようにして EMP 表がインストールされていることを確認してください。
# su - oracle
$ sqlplus scott/tiger
SQL> desc emp
名前 NULL? 型
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
|
以上で準備は完了です。
- PHP スクリプト
EMP テーブルを表示する
ここではデータベースのテーブルにあるデータを表形式で Web に表示します。以下のような OCI 関数を使い Oracle へアクセスします。基本的な手順は以下のようになります
- データベース接続
例)OCILogon("scott","tiger")
- SQL文解析
例)OCIParse($conn,"SELECT * FROM EMP")
- SQL文実行
例)OCIExecute($stmt)
- SQL結果表示
例)OCIFetch($stmt) OCIResult($stmt,1)
以下はデータベースからEMP表を読みこんでテーブル表示するサンプルスクリプトです。
oci_sample.php(一部抜粋)
// データベースと接続する
$conn = OCILogon("scott","tiger");
if($conn == false) {
echo("Can't DB Connect");
exit;
}
// SQL文
$sql = "select * from emp";
// SQL実行
$stmt = OCIParse($conn,$sql);
$result = OCIExecute($stmt);
if($result == false) {
echo("Can't exec SQL: [$sql]");
exit;
}
// 列数を取得
$ncols = OCINumCols($stmt);
// データを表示する
while( OCIFetch($stmt) ) {
for ($c = 1; $c <= $ncols; $c++ ) {
$str = OCIResult($stmt,$c);
echo("$str");
}
}
// 後処理
OCIFreeStatement($stmt);
OCILogoff($conn);
|
■サンプルスクリプト oci_sample.php
PHP 関数の詳しい説明はオンラインマニュアルを参照してください。
- PHP スクリプト応用編
PHP スクリプトでは関数を書くことや、オブジェクト指向で記述することも可能です。例えば、クラスを使うことで機能拡張がしやすくなりますので、ぜひオブジェクト指向を使いましょう。
ここでは簡単な Oracle 接続用クラスとその使い方の例をあげます。
クラス:Sample
以下の Sample クラスは Oracle データベースの EMP 表へアクセスするクラスです。
class Sample
{
var $conn; // データベースのコネクション
var $rows; // 検索結果格納用配列
function Sample($user, $passwd) // connect Oracle DB
{
if($this->conn = OCILogon($user, $passwd)) {
return(TRUE);
} else {
return(FALSE);
}
}
function logoff() // disconnect Oracle DB
{
OCILogoff($this->conn);
}
function selectExec($sql) // select文実行
{
$this->rows = array();
$arr = array();
$stmt = OCIParse($conn, $sql);
if(OCIExecute($stmt, OCI_DEFAULT) ) {
while(OCIFetchInto($stmt, &$arr, OCI_ASSOC)) {
$this->rows[] = $arr;
}
OCIFreeStatement($stmt);
return(TRUE);
} else {
return(FALSE);
}
}
}
|
上記クラスを使うには以下の手順でインスタンスを作成します。
- インスタンスを作成する。
例)scott/tiger でデータベースに接続するには
$emp = new Sample("scott", "tiger")
となります。
- EMP 表を読み出す。
$emp->getEmp()
メソッドの例については以下のサンプル:getEmp メソッドを参照してください
サンプル:getEmp メソッド
SQL 文(select * from emp) を実行するメソッドです。
function getEmp() // EMP 表を取り出す
{
$sql = "select * from emp";
return($this->selectExec($sql));
}
|
関数:viewTable
上記クラスで取り出した配列 rows は2次元の連想配列になっています。このままでは表示できませんので、TABLE として表示する関数を作ってみましょう。PHP では以下のように配列を簡単に扱うことが可能です。
function viewTable($arr)
{
echo "<table border=1>\n";
while(list($c, $row) = each($arr)) {
echo "<tr>\n";
while(list($col, $value) = each($row)) {
echo "<td>$value</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
}
|
このようにデータベースアクセス部分と HTML 表示部分を分けることにより、変更により強く、より簡単に拡張することが可能になります。
例えば HTML 表示部分をカスタマイズしたり、また DEPT 表を表示するメソッドを追加することが可能です。
■上記クラスのサンプル sample_class.php
|
|