|
このページでは、PHPの「OCI8関数群」を使って、
Oracleデータベースの操作をするサンプルを紹介します。
ひとつのマスター表を検索・編集・更新するというマスターメンテナンス画面を作ることで、
ごくごく基本的なデータベース操作を確認することができると思います。
ここで使う表は簡単なユーザー管理テーブルで、次のようなSQL文で作ることができます。
CRAETE TABLE USERS(
EMPNO NUMBER NOT NULL,
USERNAME VARCHAR2(30) NOT NULL,
PASSWORD VARCHAR2(30),
KANJI_NAME VARCHAR2(30),
MAIL_ADDRESS VARCHAR2(60),
TELNO VARCHAR2(16),
SECTION_NAME VARCHAR2(30),
JOB_NAME VARCHAR2(30),
CONSTRAINT USERS_PK PRIMARY KEY(EMPNO)
);
|
ではまず、ユーザ名から表を検索するPHP文書です。
フォームにユーザ名を入力して検索ボタンを押すと、その名前を含む行の一覧が表示されます。
そのユーザ名の部分がハイパーリンクになっていて、
そこをクリックするとその行のデータを編集できるページに飛びます。
<html><body bgcolor="white">
<?
/* ora_sch_users.php */
function fin_exit(){
print <<<FOOTER
<a href="ora_sch_users.php">ユーザ名検索に戻る</a><br>
</body></html>
FOOTER;
exit;
}
if(! isset($username)){
?>
<h1><font color="#700040">ユーザ名による検索</font></h1>
<form action="ora_sch_users.php" method="post">
ユーザ名:
<INPUT TYPE="text" SIZE=30 NAME="username"><BR>
<br>
<INPUT TYPE="submit" VALUE="検索"><INPUT TYPE="reset" VALUE="クリア">
</FORM>
<? } else {
if(! strlen($username)){
?>
<h2>おおっと</h2>検索するユーザ名を入力してください。<br>
<?
fin_exit();
}
if(($con = OCILogon("test2", "test201", "testdb")) == 0){
print ("おおっと!Oracleサーバに接続できません。");
fin_exit();
}
?>
<h1><font color="#700040">検索しました。</font></h1>
<?
$s = "SELECT USERNAME, KANJI_NAME FROM USERS " .
"WHERE USERNAME LIKE :un ORDER BY USERNAME";
$stmt = OCIParse($con, $s);
$p = "%${username}%";
OCIBindByName($stmt, ":un", &$p, 32);
$r = OCIExecute($stmt, OCI_DEFAULT);
?>
<table border="1">
<tr><th>アカウント名</th><th>漢字氏名</th></tr>
<?
$ncols = OCINumCols($stmt);
for($n=0; OCIFetchInto($stmt, &$arr); $n++){
?>
<tr><td><a
href="ora_edit_users.php?username=<?=$arr[0]?>"><?=$arr[0]?></a></td>
<td><?=$arr[1]?></td></tr>
<?
}
OCILogoff($con);
?>
</table>
<? if($n == 0){ ?>
<h1><font color="#700040">あら?</font></h1>
<? } ?>
<? print "$n"; ?>件のデータが見つかりました。<br>
<? }
fin_exit();
?>
|
注意点というほどでもないのですが、OCIParse関数に読ませるSQL文の文字列の最後には、
セミコロン ';' は不要です。セミコロンをつけてしまうと、
ORA-00911(文字が無効です)エラーが発生してしまいます。
今度はその続きのページです。上のページからリンクで飛んで来てロードされ、
選択された行のデータをフォームで修正できます。
そして「更新」ボタンを押すと実際にデータベースに変更を加えて、
その結果を画面に表示するというPHP文書です。
<html><body bgcolor="white">
<?
/* ora_edit_users.php */
function fin_exit(){
print <<<FOOTER
<a href="ora_sch_users.php">ユーザ名検索に戻る</a><br>
</body></html>
FOOTER;
exit;
}
if(! isset($username)){
?>
<h2>おおっと</h2>検索するユーザ名を入力してください。<br>
<?
fin_exit();
}
elseif(isset($HTTP_POST_VARS["editted"])){
// 更新処理
include "ora_edit_users_update.inc";
}
else{
// 更新フォームを表示。このフォームの隠しフィールドに
// "editted" という名前のものがあります。
include "ora_edit_users_edit.inc";
}
fin_exit();
?>
|
上のPHP文書は1ページで2つの役割をもち、
それぞれを別個のインクルードファイルに任せています。すなわち、
- 選択された行のデータをフォームで表示し、
ユーザに編集させる(ora_edit_users_edit.inc)
- 更新されたデータの内容をフォームのCGI変数から取得し、
データベースの内容を更新する(ora_edit_users_update.inc)
です。
まず編集データフォームを表示するコードを書いたインクルードファイルです。
<?
/* ora_edit_users_edit.inc */
if(($con = OCILogon("user", "pass", "sid")) == 0){
?>
<h2>おおっと</h2>Oracleサーバに接続できません。<br>
<?
fin_exit();
}
$s = <<<SQL
SELECT USERNAME, KANJI_NAME, MAIL_ADDRESS, TELNO,
SECTION_NAME, JOB_NAME FROM USERS
WHERE USERNAME = :un
SQL;
$stmt = OCIParse($con, $s);
OCIBindByName($stmt, ":un", &$username, 32);
$r = OCIExecute($stmt, OCI_DEFAULT);
$found = FALSE;
for($n=0; OCIFetchInto($stmt, &$arr); $n++){
$found = TRUE;
// ここの書き方うまくないかなあ
$kanji_name = $arr[1];
$mail_address = $arr[2];
$telno = $arr[3];
$section_name = $arr[4];
$job_name = $arr[5];
break; // 常に1件を想定
}
OCIFreeStatement($stmt);
OCILogoff($con);
if(! $found){
?>
<h2><font color="#700040">あら?</font></h2>エントリが見つかりません。<br>
<?
fin_exit();
}
?>
<form action="ora_edit_users.php" method="post">
ユーザ名:<?= $username ?><br>
<input type="hidden" name="username" value="<?= $username ?>">
漢字氏名:
<input type="text" name="kanji_name" value="<?= $kanji_name ?>"><br>
メールアドレス:
<input type="text" name="mail_address" value="<?= $mail_address ?>" size=30><br>
電話番号:
<input type="text" name="telno" value="<?= $telno ?>"><br>
部署名:
<input type="text" name="section_name" value="<?= $section_name ?>"><br>
役職名:
<input type="text" name="job_name" value="<?= $job_name ?>"><br>
<br>
<input type="hidden" name="editted" value="1">
<input type="submit" value="更新"><br>
</form>
|
次にデータベース更新処理を書いたインクルードファイルです。
<?
if(($con = OCILogon("user", "pass", "sid")) == 0){
?>
<h2>おおっと</h2>Oracleサーバに接続できません。<br>
<?
fin_exit();
}
$s = <<<SQL
UPDATE USERS
SET KANJI_NAME = :kanji_name,
MAIL_ADDRESS = :mail_address,
TELNO = :telno,
SECTION_NAME = :section_name,
JOB_NAME = :job_name
WHERE USERNAME = :username
SQL;
$stmt = OCIParse($con, $s);
OCIBindByName($stmt, ":kanji_name", &$kanji_name, 32);
OCIBindByName($stmt, ":mail_address", &$mail_address, 60);
OCIBindByName($stmt, ":telno", &$telno, 32);
OCIBindByName($stmt, ":section_name", &$section_name, 32);
OCIBindByName($stmt, ":job_name", &$job_name, 32);
OCIBindByName($stmt, ":username", &$username, 32);
$r = OCIExecute($stmt, OCI_DEFAULT);
print "${r}行のデータ($username)を更新しました。<br>";
OCICommit($con);
OCIFreeStatement($stmt);
OCILogoff($con);
?>
|
(first uploaded 2001/12/30 last updated 2002/07/30, KOUKEN HEIJIMA)
|