|
このページでは、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でも知ることができます。
(first uploaded 2002/07/30 last updated 2002/07/30, KOUKEN HEIJIMA)
|