Category Archives: Apache

【Webアプリ】開発環境をイチから作成・その7(Apache + PHP + Oracle連携)

前回は eclipse 上のワークフォルダに php を作成して、 Apache から表示するところまで
行いました。

今回は apache + php + oracle で連携するところまで設定します。

アプリケーション側から使用する oracle のスキーマを作成します。
SQL*PLus を起動します。
dev_setting_06_create_oracle_scheme01

システム管理者( sysdba )用のユーザで接続します。

connect / as sysdba

user_users オブジェクトを参照することで、ユーザの表領域、一時領域、アカウントロック状況等が確認できます。
Oracle ユーザの一覧を表示します。

select username from user_users;

僕の完了では「SYS」とだけ表示されました。

「show user」コマンドでも同様のことがわかります。

テスト用アプリの表領域を作成します。とりあえずファイルとして20MB分の領域を確保しました。

create tablespace testap_tblsp
	datafile 'C:\add\devs\eclipse_cc\workspace\db\testap.dbf'
	size 20m
	autoextend on;

結果、「表領域が作成されました。」と出力されれば作成完了です。
一応確認のため、以下のコマンドを入力します。

select tablespace_name,status,contents from dba_tablespaces;

一覧出力されたtablespaceフィールドが 「testap_tblsp」 のものが追加されており、
STATUSフィールドが「ONLINE」であれば使用可能な状態となっています。

新規にユーザ「testap」および権限(ROLE)を作成します。
まずはテスト用アプリへの更新・参照権限をもつ権限(ROLE)の「testaprole」を作成します。

 -- アプリ用のROLEを作成
CREATE ROLE testaprole;
 -- 一般ユーザ用のシステム権限(CONNECTロール)を testaproleに付与
GRANT CONNECT TO testaprole;
 -- 開発者のシステム権限(RESOURCEロール)を testaproleに付与
GRANT RESOURCE TO testaprole;

次に、ユーザを作成します。パスワードは仮に「testpw」です。

CREATE USER testap IDENTIFIED BY testpw
	DEFAULT TABLESPACE testap_tblsp
	TEMPORARY TABLESPACE temp
	QUOTA UNLIMITED ON testap_tblsp;

実行結果に「ユーザーが作成されました。」がでればユーザ作成成功です。

権限「testaprole」をtestapユーザに付与します。

GRANT testaprole TO testap;

ユーザ「testap」でログインし直します。
一度、「quit」コマンドでSQL*Plusから抜け出し、再度 SQL*Plus を立ち上げ、ログインします。

conn testap/testpw

テスト用のテーブル「T4CHARACTERS」を作成します。

CREATE TABLE 	T4CHARACTERS
(	id	NUMBER(8,0)
,	name	VARCHAR2(255) NOT NULL
,	lv	NUMBER(3,0)   NOT NULL
,	exp	NUMBER(8,0)   NOT NULL
,	hp	NUMBER(8,0)   NOT NULL
,	mp	NUMBER(8,0)   NOT NULL
,	updated	DATE	DEFAULT NULL
,	created	DATE	DEFAULT NULL
)	TABLESPACE	TESTAP_TBLSP
;
ALTER TABLE T4CHARACTERS ADD PRIMARY KEY ( id )
 USING INDEX TABLESPACE TESTAP_TBLSP;

次にレコードを追加しておきます。

insert into T4CHARACTERS VALUES(1,'少年K',1,0,20,5,SYSDATE,SYSDATE);
insert into T4CHARACTERS VALUES(2,'少年G',1,0,15,0,SYSDATE,SYSDATE);
insert into T4CHARACTERS VALUES(3,'敵1',1,3,8,0,SYSDATE,SYSDATE);
commit;

こでデータベース自体の作成は完了しました。
次に PHP から Oracle への接続をしてみたいと思います。
PHP から Oracle へ接続するには oci_connect 等の関数を使用できるように設定が必要です。

php.ini の拡張モジュールに Oracle の 11g 用のライブラリを指定して、
関数等を読み取れるようにする必要があります。
設定ファイルは xammp インストールパス内の php フォルダ直下にあります。
以下の php_oci8_11g.dll のほうのコメントを外します。

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

php 全体の標準文字コードを設定します。
ここに設定した値が HTTP ヘッダのContent-typeに出力されます。

default_charset = "UTF-8"

また、mbstring用の日本語文字コード用の設定を行っておきます。

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = UTF-8
mbstring.http_output = UTF-8

Oracle からの出力文字コードの設定を行います。
こちらもPHPとあわせて「UTF8」形式で統一しようと思います。
dev_setting_06_add_oracle_env2
新しい環境変数の「NLS_LANG」を追加します。
変数内容は「Japanese_Japan.AL32UTF8」にします。

次に、PHP 上から OracleDB内容を読み出します。
今回、php <-> oracle接続には oci_connect関数を使用します。
oci_connect関数:http://php.net/manual/ja/function.oci-connect.php

oracle_test.php を eclipse から新規追加します。

<html><head><meta charset="UTF-8">
<title>Oracle 11g 接続テスト</title>
</head><body>
<h1>Oracle 11g 接続テスト</h1>
Oracle との接続テストです。<br />以下、Oracle連携で取得したデータ。<br /><br />
<?php
$oraid = 'testap';
$orapw = 'testpw';
$oraConnString = 'localhost/XE';
$oraLang = 'AL32UTF8';
$oraConn = oci_connect($oraid, $orapw, $oraConnString, $oraLang);
if (!$oraConn) {
	$e = oci_error();
	trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$sqlString = 'SELECT * FROM T4CHARACTERS';
$statementId = oci_parse($oraConn, $sqlString);
oci_execute($statementId);

echo "<table border='1'>\n";
echo "<caption>表. キャラクタテーブル(T4CHARACTER)</caption>\n";
echo "<tr><th>番号</th><th>名前</th><th>Lv</th><th>Exp</th><th>HP</th><th>MP</th><th>更新日</th><th>作成日</th></tr>\n";
while ($row = oci_fetch_array($statementId, OCI_ASSOC+OCI_RETURN_NULLS)) {
	echo "<tr>\n";
	foreach ($row as $item) {
		echo "    <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "&nbsp;") . "</td>\n";
	}
	echo "</tr>\n";
}
echo "</table>\n";
?>
</body></html>

追加、保存後、ブラウザからアクセスしたところ、無事にデータを参照できました。
dev_setting_06_result_oracle_data

今回はここまで。