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

 このページでは、PHPのMySQL関数を使って、 MySQLデータベースの操作をするサンプルを紹介します。 ここでも、OCI8関数(Oracle)のページと同様の、 ひとつのマスター表「USERS」を検索・編集・更新するWeb画面を作ります。 そのUSERS表は次のようなSQL文で作ることができます。 OCIの例のUSERSの、「VARCHAR2」が「VARCHAR」に変わっただけですね。

CRAETE TABLE USERS(
  EMPNO        NUMBER NOT NULL,
  USERNAME     VARCHAR(30) NOT NULL,
  PASSWORD     VARCHAR(30),
  KANJI_NAME   VARCHAR(30),
  MAIL_ADDRESS VARCHAR(60),
  TELNO        VARCHAR(16),
  SECTION_NAME VARCHAR(30),
  JOB_NAME     VARCHAR(30),
  CONSTRAINT USERS_PK PRIMARY KEY(EMPNO)
);

 ではまず、ユーザ名からUSERS表を検索するPHP文書(users.php)です。 フォームにユーザ名を入力して検索ボタンを押すと、 その名前を含む行の一覧が表示されます。 そのユーザ名の部分がハイパーリンクになっていて、 そこをクリックするとその行のデータを編集できるページ(edit_users.php)に飛びます。

<?php
session_start();
session_register("resultset");
function fin_exit(){
  print "<a href=\"" . $_SERVER["REQUEST_URI"] . "\">ユーザ名検索に戻る</a><br>\n";
  exit;
}
?>
<html><body bgcolor="white">
<?php
if(! isset($_POST["username"])){
  ## CGI変数 username が定義されていない場合、他のURLからジャンプしてここに
  ## 飛んできたとみなし、入力フォームを表示します。
  $url = $_SERVER["REQUEST_URI"];
  print <<<FORM
  <h1><font color="#700040">ユーザ名による検索</font></h1>
  <form action="$url" method="post">
  ユーザ名:<input type="text" size=30 name="username"><br>
  <input type="submit" value="検索">
  </form>
  </body></html>
FORM;
  exit();
}
if(empty($_POST["username"])){
  ## CGI変数 username が存在し、空欄の場合はエラー
  print "<h2>おおっと</h2>検索するユーザ名を入力してください。<br>";
  fin_exit();
}
$username = $_POST["username"];
## MySQLデータベースに接続します。
if(($con = mysql_connect("localhost:3306", "urano", "urano398")) == 0){
  print ("おおっと!データベースサーバに接続できません。");
  fin_exit();
}
## dbを「選択」します。この操作はMySQL特有のものです。
mysql_select_db("udb", $con);
## SQL文を発行します。
$sql = <<<SQL
SELECT EMPNO, USERNAME, KANJI_NAME, MAIL_ADDRESS, TELNO FROM USERS
 WHERE USERNAME LIKE '%$username%' ORDER BY USERNAME
SQL;
$result = mysql_query($sql, $con);
if(mysql_errno($con) != 0){
  print "おおっと(" . mysql_errno() . "):" . mysql_error() . "<br>";
  mysql_close($con);
  fin_exit();
}
$nrows = mysql_num_rows($result);
if($nrows == 0){
  print "<h2>おおっと</h2>該当データがありませんでした。<br>";
  mysql_close($con);
  fin_exit();
}
print "<table border=\"1\">\n";
print "<tr bgcolor=\"#cccccc\">\n";
print "<th>従業員番号</th><th>ユーザ名</th><th>漢字氏名</th></tr>\n";
$a = array();
while($row = mysql_fetch_row($result)){
  $empno = $row[0];
  $username = $row[1];
  $kanjiName = $row[2];
  print <<<ROW
<tr>
<td><a href="edit_users.php?selected_key=$empno">$empno</a></td>
<td>$username</td>
<td>$kanjiName</td>
</tr>
ROW;
  array_push($a, $row);
}
$_SESSION["resultset"] = $a;
mysql_freeresult($result);
mysql_close($con);
print "</table>";
print "${nrows}件のデータが見つかりました。<br>";
fin_exit();
?>

 $_SERVER["REQUEST_URI"] というのは、今読んでいる文書のURLを指します。このページにジャンプする、 ということは結局、今読んでいるページを再表示する、という意味です。
 MySQLで問合せ(SELECT文)を発行する例は別のページに載せたので、 ここでは説明は不要でしょう。MySQL関数には mysql_num_rows という関数があり、 全行をフェッチする前に、結果集合が何行あるかを知ることができます。 mysql_fetch_rowでフェッチした各行は、 順に配列変数にarray_pushで貯めていき、 これをセッション変数 $_SESSION["resultset"] に格納しています。 これを次のページで参照します。

 今度はその続きのページです。上のページからリンクで飛んで来てロードされ、 選択された行のデータをフォームで修正できます。 そして「更新」ボタンを押すと実際にデータベースに変更を加えて、 その結果を画面に表示するというPHP文書です。

<?php
session_start();
session_register("resultset");
?>
<html><body bgcolor="white">
<?php
if(! empty($_GET["selected_key"])){
  for($i=0; $i<count($_SESSION["resultset"]); $i++){
    $a = $_SESSION["resultset"][$i];
    if($a[0] == $_GET["selected_key"]){ break; }
  }
  if(count($a) < 1){ print "?"; }
  $empno = $a[0];
  $username = $a[1];
  $kanjiName = $a[2];
  $mailAddress = $a[3];
  $telno = $a[4];
  print <<<FORM
<form action="edit_users.php" method="post">
<input type="hidden" name="empno" value="$empno">
ユーザ名:
<input type="text" name="username" value="$username" size="10" maxlength="8"><br>
漢字氏名:
<input type="text" name="kanjiName" value="$kanjiName" size="20" maxlength="16"><br>
メールアドレス:
<input type="text" name="mailAddress" value="$mailAddress" size="40" maxlength="40"><br>
電話番号:
<input type="text" name="telno" value="$telno" size="18" maxlength="18"><br>
<input type="submit" value="更新">
</form>
FORM;
}
else{
  $empno = $_POST["empno"];
  $username = $_POST["username"];
  $kanjiName = $_POST["kanjiName"];
  $mailAddress = $_POST["mailAddress"];
  $telno = $_POST["telno"];
  if(empty($empno)){
    print "エラー"; exit;
  }
  $con = mysql_connect("localhost:3306", "urano", "urano398");
  mysql_select_db("udb", $con);
  $sql = <<<SQL
UPDATE USERS
   SET USERNAME = '$username', KANJI_NAME = '$kanjiName',
       MAIL_ADDRESS = '$mailAddress', TELNO = '$telno'
 WHERE EMPNO = $empno
SQL;
  $result = mysql_query($sql, $con);
  print "${result}行のデータを更新しました。<br>";
}
?>
<a href="users.php">検索条件入力に戻る</a><br>
</body></html>

 今度はまず、前のページのリンクが「edit_users.php?selected_key=1234」 となっていることから、$_GET["selected_key"] の値をチェックします。 何か値が入っていれば、前のページから飛んできたということで、 その値をEMPNOとして持つレコードを $_SESSION["resultset"] から探し、 編集フォームを表示します。 そうでなければ、編集された内容で更新(UPDATE文)を発行します。 UPDATEなどのDML文を発行する場合もmysql_query 関数を使うことができます。この関数はDML文は作用した行の数を戻り値として返します。 また、その接続において直近のDML文で作用した行の数は、 関数mysql_affected_rowsでも知ることができます。

Open Source Web Architecture Top

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

Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!