PHPに限らずWebアプリケーションで追加、更新、削除を行なう場合は、ページ間でデータの受け渡しが必要です。(JavaScriptなどを使う場合は別)
しかし各Webページは基本的に独立しているので、ページ間でデータを受け渡しすることができません。そのためいくつか方法が用意されています。
データを受け渡す主な方法
1.パラメータを使う
2.フォームを使う
3.隠しフィールドを使う
4.クッキーを使う
5.セッションを使う
1、2、3の方法についてはこれまでのステップで何度か使っていますので、今回もこれらの方法で行ないます。4、5については必要になった時に解説します。
【1】sample102 フォルダをコピーして sample103 フォルダを作成します。
【2】今回は以下のようなファイルの構成になります。select.phpの変更はありません。他のファイルは新規に作成します。
*「\」はWindowsではエンマークのことです。
保存先 C:\phpdev\www\test\sample103
ファイル名 select.php
<?php
$url = "localhost";
$user = "root";
$pass = "";
$db = "SampleDB050";
// MySQLへ接続する
$link = mysql_connect($url,$user,$pass) or die("MySQLへの接続に失敗しました。");
// データベースを選択する
$sdb = mysql_select_db($db,$link) or die("データベースの選択に失敗しました。");
// クエリを送信する
$sql = "SELECT * FROM T01Prefecture";
$result = mysql_query($sql, $link) or die("クエリの送信に失敗しました。<br />SQL:".$sql);
//結果セットの行数を取得する
$rows = mysql_num_rows($result);
//表示するデータを作成
if($rows){
while($row = mysql_fetch_array($result)) {
$tempHtml .= "<tr>";
$tempHtml .= "<td>".$row["PREF_CD"]."</td><td>".$row["PREF_NAME"]."</td>";
$tempHtml .= "<td><a href=\"update.php?cd=".$row["PREF_CD"]."\" target=\"_self\">更新</a></td>";
$tempHtml .= "<td><a href=\"delete.php?cd=".$row["PREF_CD"]."\" target=\"_self\">削除</a></td>";
$tempHtml .= "</tr>\n";
}
$msg = $rows."件のデータがあります。";
}else{
$msg = "データがありません。";
}
//結果保持用メモリを開放する
mysql_free_result($result);
// MySQLへの接続を閉じる
mysql_close($link) or die("MySQL切断に失敗しました。");
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=SHIFT-JIS">
<title>全件表示</title>
</head>
<body>
<h3>全件表示</h3>
<?= $msg ?>
<table width = "300" border = "1">
<tr bgcolor="##ccffcc"><td>PREF_CD</td><td>PREF_NAME</td><td colspan="2">EDIT</td></tr>
<?= $tempHtml ?>
<form action="insert.php" method="post">
<tr>
<td><input type="text" name="cd"></td>
<td><input type="text" name="name"></td>
<td colspan="2">
<input type="submit" name="submit" value="追加"><input type="reset" value="リセット">
</td>
</tr>
</form>
</table>
</body>
</html>
保存先 C:\phpdev\www\test\sample103
ファイル名 update.php
<?php
$prefCd = $_GET['cd'];
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=SHIFT-JIS">
<title>更新</title>
</head>
<body>
PREF_CD:<?= $prefCd ?><br />
</body>
</html>
保存先 C:\phpdev\www\test\sample103
ファイル名 delete.php
<?php
$prefCd = $_GET['cd'];
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=SHIFT-JIS">
<title>削除</title>
</head>
<body>
PREF_CD:<?= $prefCd ?><br />
</body>
</html>
保存先 C:\phpdev\www\test\sample103
ファイル名 insert.php
<?php
$prefCd = $_POST['cd'];
$prefName = $_POST['name'];
$submit = $_POST['submit'];
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=SHIFT-JIS">
<title>追加</title>
</head>
<body>
PREF_CD:<?= $prefCd ?><br />
PREF_NAME:<?= $prefName ?><br />
submit:<?= $submit ?><br />
</body>
</html>
【3】C:\phpdev にある 2K-NT-XP-phpdev_start.bat をダブルクリックして、phpdev を起動します。
準備ができたら作成したPHPプログラムを実行してみましょう。
【4】ブラウザのアドレスに http://localhost/test/sample103/select.php と入力し、実行します。
【5】select.php の画面が表示されました。
【6】「1 北海道」の「更新」リンクをクリックします。
【7】「update.php?cd=1」が表示され、画面には「PREF_CD:1」と表示されています。
*パラメータで値が渡されています。
【8】ブラウザの「戻る」ボタンをクリックします。
【9】次は「1 北海道」の「削除」リンクをクリックします。
【10】「delete.php?cd=1」が表示され、画面には「PREF_CD:1」と表示されています。
*パラメータで値が渡されています。
【11】ブラウザの「戻る」ボタンをクリックします。
【12】次は一番最後のフォームに「99 ハワイ」と入力し、「追加」ボタンをクリックします。
【13】「insert.php」が表示され、画面には以下のように表示されています。
PREF_CD:99
PREF_NAME:ハワイ
submit:追加
*フォームのPOSTメソッドで値を渡しているため、パラメータはありません。
【14】ブラウザの「戻る」ボタンをクリックします。
【15】次は「リセット」ボタンをクリックします。
【16】テキストボックスがクリアされました。
【解説】
(1)今回は select.php の変更ありません。
(2)update.php と delete.php はリンクのパラメータで値を渡しているので、「GETメソッド」になります。そのため値を受け取るときは $_GET[' '] を使います。
$prefCd = $_GET['cd'];
*PREF_CDさえわかれば他の情報はデータベースから再度取得できます。
(3)insert.php はフォームの「POSTメソッド」で値を渡しているので、受け取るときは $_POST[' '] を使います。
$prefCd = $_POST['cd'];
$prefName = $_POST['name'];
$submit = $_POST['submit'];
*新規のデータなので、PREF_CDとPREF_NAMEの両方が必要です。
submitの値(valueで設定)も渡されている点に注目してください。この値は「ボタンが押されたかどうか」の判断に利用できます。
例えば $submit に値が代入されたということは、アドレスにURLを入力して直接ページにアクセスしたのではなく、フォームのボタンをクリックしてPOSTメソッドでアクセスしたのだと判断できます。
・パラメータで変数の値を不正に変更されることを防ぐ
・自分自身のファイルを呼び出す時の条件判断に使う
【ワンポイント】
「GETメソッド」はパラメータとして値を渡すため、大きなデータを渡すのには向きません。URLが長くなるし文字数に制限があります。また値が見えてしまうためパスワードのような重要なデータの受け渡しは危険です。日本語のデータを使うときにはエンコード、デコードが必要です。
「POSTメソッド」は大きなデータの受け渡しもできます。値も見えないためGETメソッドに比べると安全です。日本語もそのまま使えます。