phpな休日 BBS sitemap
1. フォームのデータを受け取って表示する

FORMで送信した文字列を受け取るスクリプトを作成します。
以下のような簡単なフォームを作って、

<form method="POST" action="form.php">
<input type="text" name="data" size="20"><input type="submit" value="送信">
</form>

[送信] ボタンを押しても何も起こりません。

実行

1行目の action="form.php" で送信したデータを受け取るファイルを指定します。
form.php で、もし FORM から送信されたデータがある場合はそれを受け取る処理をします。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>FORM</title>
</head>
<body>
<?php
if (isset($_POST["data"])) { //もしPOSTに [data] があれば
print $_POST["data"]; //表示する
}
?>
<br>
<form method="POST" action="form.php">
<input type="text" name="data" size="20"><input type="submit" value="送信">
</form>
</body>
</html>

上記ソースを form.php 名で保存して PHP が動作するサーバーで動かせば動作します。
他人が使用しないものなら良いのですが、これだと文字化け対策もセキュリティもお構いなしでとても危険なので受け取ったデータにいくつか処理を加える必要があります。
・クォートのエスケープ処理
・HTMLタグの禁止
・文字数制限
の3つの処理を加えます。

<?php
mb_language("ja");
mb_internal_encoding("UTF-8");
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>FORM</title>
</head>
<body>
<?php
if (isset($_POST["data"])) { //もしPOSTに [data] があれば
$data = $_POST["data"]; //POSTのデータを変数$dataに格納
if( get_magic_quotes_gpc() ) { $data = stripslashes("$data"); } //クォートをエスケープする
$data = htmlspecialchars ($data); //HTMLタグ禁止
$data = mb_substr ($data, 0, 24, 'UTF-8'); //長いデータを24文字でカット
print $data; //表示する
}
?>
<br>
<form method="POST" action="form.php">
<input type="text" name="data" size="20"><input type="submit" value="送信">
</form>
</body>
</html>

サブウィンドウで実行

クォートのエスケープに関してはサーバー(PHP)の設定によりますので、不要なケースもあります。フォームに ['] と ["] を入力して送信して確かめると良いでしょう。マジッククォートの設定がデフォルト(有効)な場合 [\] マークが付加されます。

試してみる
2. フォームのデータを受け取ってファイルに保存する

POSTで受け取ったデータをファイルに保存するために、前もってログファイルを用意します。空のファイルでかまいませんので log.txt とでも名前を付けたファイルをサーバーにアップしたら、パーミッションを(読み書き属性)に設定します。
パーミッションの数値に関してはお使いのサーバーの仕様によって異なりますので、サーバーのマニュアルをご覧ください。
ここ(Doレジドメインパック)では 600 で、ロリポップサーバーでは 606 でOKです。
(XAMPPなどWindows上のローカル環境ではパーミッションの設定は不要です。)
データの内容は名前(name)、コメント(comment)、日時(time)とします。日時の取得は date("Y/n/j G:i") で良いです。
保存するデータを1件のみとすれば、データの読み書きはカウンタと同様な方式になります。

<?php
mb_language("ja");
mb_internal_encoding("UTF-8");
if (((isset($_POST["name"])) && ($_POST["name"] != "")) or ((isset($_POST["comment"])) && ($_POST["comment"] != ""))) { //もしPOSTに [name] か [comment] があれば
if (isset($_POST["name"])) { //もしPOSTに [name] があれば
$name = $_POST["name"]; //POSTのデータを変数$nameに格納
if( get_magic_quotes_gpc() ) { $name = stripslashes("$name"); } //クォートをエスケープする
$name = htmlspecialchars ($name); //HTMLタグ禁止
$name = mb_substr ($name, 0, 30, 'UTF-8'); //長いデータを30文字でカット
}
if (isset($_POST["comment"])) { //もしPOSTに [comment] があれば
$comment = $_POST["comment"]; //POSTのデータを変数$commentに格納
if( get_magic_quotes_gpc() ) { $comment = stripslashes("$comment"); } //クォートをエスケープする
$comment = htmlspecialchars ($comment); //HTMLタグ禁止
$comment = mb_substr ($comment, 0, 200, 'UTF-8'); //長いデータを200文字でカット
}
$time = date("Y/n/j G:i"); //日時の取得
$write = $name . "<>" . $comment . "<>" . $time . "<>"; //新しく書き込むデータを <> で区切って整形
$log = fopen ("./log.txt","w"); //書き込み用モードでデータを開く(データは空になる)
flock ($log, LOCK_EX); //ファイルロック開始
fputs ($log,$write); //書き込み処理
flock ($log, LOCK_UN); //ファイルロック解除
fclose ($log); //ファイルを閉じる
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>一行読み書き表示</title>
</head>
<body>
<?php
$data = fopen ("log.txt","r");
$line = fgets ($data);
$list = explode("<>",$line);
fclose($data);
print "お名前 " . $list[0] . "<br>¥n";
print "コメント " . $list[1] . "<br>¥n";
print "日時 " . $list[2] . "<br>¥n";
?>
<br>
<form method="POST" action="form2.php">
お名前 <input type="text" name="name" size="20"><br>
コメント <input type="text" name="comment" size="60"><br>
<input type="submit" value="送信">
</form>
</body>
</html>

最初の2行
 mb_language("ja");
 mb_internal_encoding("UTF-8");
はPHPファイルに必ず記入するおまじないとして、
次の if 文で name か comment どちらかに記入があれば次の行を処理するようにしています。
どちらにも記入がなくて [送信] ボタンを押した場合、あるいは初めてページを開いた場合はこの if 文の閉じ(赤文字 } )までの間を処理しないで、表示します。

サブウィンドウで実行
2014.2.4 last edit

Produced by haku