PHPによるOracle表の検索・編集・更新

このページでは、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);
?>

Open Source Web Architecture Top

(first uploaded 2001/12/30 last updated 2002/07/30, KOUKEN HEIJIMA)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル