Nodachisoft Nodachi Sword Icon
  
@あまじ✎ 2017年10月11日に更新

Apache+PHP+Oracle連携をコード付きで解説

この記事の中でやる事

連載記事の前回では eclipse のワークスペースに新しく php プロジェクトを作成して、 Apache(Webサーバ)から phpinfo 関数を実行し、結果を表示するところまで行いました。

今回はこれにデータベースを加え、 Apache + php + Oracle で連携する設定の手順を記載します。

Oracle DB に Webアプリ用のスキーマを新規作成

PHPプログラムからデータベースに接続して、アプリのデータを保存したり、参照出来るようにしたいと思います。 前準備として、データベースにスキーマ(表などを格納するオブジェクト)を作成する必要があります。 今回は Oracle に接続するので、Oraccle のスキーマを新しく作成していきましょう!

SQL*Plus で Oracle への接続

Oracle データベースをコマンドラインから操作するため、コマンド上で利用可能なツールである、SQL*PLus を起動します。

SQL*Plus を起動した直後の画面

dev_setting_06_create_oracle_scheme01

新しくスキーマを作成するため、システム管理者( sysdba )用のユーザで接続します。SQL*Plusを起動したあと、以下のコマンドでOracle に sysdba として接続できます。

sql*plusでsysdba接続
connect / as sysdba

接続したら、現在 Oracle DBに登録されているユーザの一覧を表示してみます。

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

user_usersの確認
select username from user_users;

私の環境では「SYS」とだけ表示されました。

テスト用アプリのための Oracle 表領域の作成

今回PHPプログラムから接続するためのテストアプリ専用の表領域を作成しましょう。 とりあえずファイルとして20MB分のデータ保存のための領域を確保してみます。

Oracle表領域確保SQL
create tablespace testap_tblsp
	datafile 'C:\add\devs\eclipse_cc\workspace\db\testap.dbf'
	size 20m
	autoextend on;

上を入力した結果、「表領域が作成されました。」と出力されれば作成完了です。

一応確認のため、以下のコマンドを入力してOracle に設定した表領域を表示してみます。

表領域一覧の確認SQL
select tablespace_name,status,contents from dba_tablespaces;

一覧出力されたtablespaceフィールドをみると、 「testap_tblsp」 が存在しており、先ほどの create ~コマンドで正常に追加されたことがわかります。

STATUSフィールドが「ONLINE」であれば使用可能な状態となっています。

テスト用アプリが更新・参照するための権限(ROLE)作成

次に php プログラムから Oracle DB にアクセスするときのユーザ「testap」および権限(ROLE)を作成しましょう。

まずはテスト用アプリへの更新・参照権限をもつ権限(ROLE)の「testaprole」を作成します。

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

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

Oracleユーザ作成SQL
CREATE USER testap IDENTIFIED BY testpw
	DEFAULT TABLESPACE testap_tblsp
	TEMPORARY TABLESPACE temp
	QUOTA UNLIMITED ON testap_tblsp;

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

さきほど作成した権限「testaprole」をtestapユーザに付与します。 これをすることで testap ユーザは目的のデータベースの参照ができます。

権限付与のSQL
GRANT testaprole TO testap;

テストアプリ用のテーブルとデータの作成

新規に作成したユーザ「testap」でログインし直します。

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

接続SQL
conn testap/testpw

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

テーブルの作成SQL
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;

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

テストデータの追加SQL
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 への接続をしてみたいと思います。

PHP から Oracle へ接続するには oci_connect 等の関数を使用できるように設定が必要です。

そのためには php.ini の拡張モジュールに Oracle の 11g 用のライブラリを指定して、Oracle接続に必要な関数等を使用できるようにする必要があります。

設定ファイル(php.ini)は xammp インストールパス内の php フォルダ直下にあります。

以下の php_oci8_11g.dll のコメントを外します。

(Oracle10gを使ってる人は、php_oci8.dllのコメントを外すとよいです)

php.iniファイルのOracle接続設定(抜粋)
;extension=php_oci8.dll      ; Use with Oracle 10gR2 Instant Client
;extension=php_oci8_11g.dll  ; Use with Oracle 11gR2 Instant Client

php の文字コード設定を行う

オマケですが php 全体の標準文字コードを設定します。

ここに設定した値が HTTP ヘッダのContent-typeに出力されます。これを設定することで、HTMLに文字を出力したときの文字化け防止になります。

以降、php を出力するファイルは UTF-8の文字コードで保存するよう統一します。

php.iniファイルの標準文字コード設定
default_charset = "UTF-8"

また、日本語などの多くの文字種類を持っている言語向けに、マルチバイト文字列を取り扱いできるようにするための「mbstring」ライブリ用の日本語文字コード用の設定を行っておきます。

php.iniファイルのマルチバイト設定
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = UTF-8
mbstring.http_output = UTF-8

Oracle の文字コードを設定

Oracle からの出力文字コードの設定を行います。

こちらもPHPとあわせて「UTF8」形式で統一しようと思います。

dev_setting_06_add_oracle_env2

新しい環境変数として「NLS_LANG」を追加します。

変数内容は「Japanese_Japan.AL32UTF8」にします。

実際にPHPプログラムからOracleへ接続してみる

一通り設定できたので PHP 上から OracleDB のデータ内容を読み出します。

今回、php ⇔ oracle 接続には ociconnect関数を使用します。 ociconnect関数は、簡単に php から Oracle DB に接続できる関数です。

oci_connect関数の詳細はコチラ: https://php.net/manual/ja/function.oci-connect.php

では、oci_connect関数を使って実際にデータベースに接続し、登録したサンプルデータを取得するサンプルプログラムを作成してみましょう。

以下の 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>";
echo "<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) : "&amp;nbsp;") . "</td>\n";
 }
 echo "</tr>\n";
}
echo "</table>\n";
?>
</body></html>

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

dev_setting_06_result_oracle_data

おつかれさまです。今回はここまでー!

非常に参考になったサイトさま

Webアプリの開発環境をイチから作成シリーズ記事

連載内容
その1(Eclipse&Java SDK7 導入)
その2(Eclipse の Plugin 導入)
その3(Oracle DB 11g XE R2 インストール)
その4(Oracle DB 11g XE R2 疎通確認)
その5(XAMPP インストール)
その6(Apache + PHP + Eclipse連携)
その7(Apache + PHP + Oracle連携) ←いまココ
その8(CakePHP + Oracle連携)
その9(CakePHP + Oracle連携)

ページの更新履歴

更新日 更新内容
2013.10.11 ページ公開
2018.3.17 スマホからレイアウトが崩れて読みにくいので修正。ついでに文章構造と内容も訂正。
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

Apache、PHP、Oracle DBを連携させる手順

#開発環境#PHP#OracleDB#Apache✎ 2018-10-04
Apache、PHP、Oracle DB がそれぞれ連携して動くように設定する手順をまとめてます。テスト用に hosts の書き換えも実施。
広告領域
追従 広告領域
目次
Apache+PHP+Oracle連携をコード付きで解説
Apache+PHP+Oracle連携をコード付きで解説
この記事の中でやる事
この記事の中でやる事
Oracle DB に Webアプリ用のスキーマを新規作成
Oracle DB に Webアプリ用のスキーマを新規作成
SQL*Plus で Oracle への接続
SQL*Plus で Oracle への接続
テスト用アプリのための Oracle 表領域の作成
テスト用アプリのための Oracle 表領域の作成
テスト用アプリが更新・参照するための権限(ROLE)作成
テスト用アプリが更新・参照するための権限(ROLE)作成
テストアプリ用のテーブルとデータの作成
テストアプリ用のテーブルとデータの作成
PHPからOracleに接続するための設定をする
PHPからOracleに接続するための設定をする
Oracle の文字コードを設定
Oracle の文字コードを設定
実際にPHPプログラムからOracleへ接続してみる
実際にPHPプログラムからOracleへ接続してみる
非常に参考になったサイトさま
非常に参考になったサイトさま
Webアプリの開発環境をイチから作成シリーズ記事
Webアプリの開発環境をイチから作成シリーズ記事
ページの更新履歴
ページの更新履歴
Nodachisoft © 2020