PHP レッスン — レッスン 1 — フォームの操作
日常生活では、私たちはテレビ、ラジオ、インターネット、直接の会話を通じて情報を得ます。サイトもユーザーから情報を得ますが、それは特別な形、すなわちフォームを通じて行います。フォームは、アンケート調査の用紙や、何かの公的機関に申請する際に記入する用紙と比べられます。フォームの要素のセットは限られていますが、フォームは、サイトの動作に必要なすべての情報をユーザーから受け取れるようにします。
レッスンをより実り多いものにするため、フォーム作成に関する HTML のレッスンを読んでおくとよいでしょう。
最初のレッスンを始める前に、私たちのアプリケーションの骨組み、すなわちサイトの動作を管理するクラスを作りましょう。
class フォルダを作り、その中に、サイト管理クラスを含む simpleCMS.php ファイルを置きます。また、この管理を起動する index.php ファイルも作ります。さらに、メッセージ用の空のフォルダと、スタイルファイル style.css も作ります。次のようなファイルとフォルダになります:
class/simpleCMS.php
messages/
index.php
style.css
simpleCMS.php ファイルの内容は次のとおりです:
<?php
class simpleCMS { // 管理クラス
public function display_public() { // メッセージ出力のメソッド
}
public function display_admin() { // メッセージ入力のメソッド
}
public function write($p) { // メッセージ記録のメソッド
}
}
?>
ひとまずメソッドは空のままにし、後でそこにコードを書き足していきます。
style.css ファイル:
*{
margin: 0;
padding: 0;
}
body{
font: 12px "Lucida Grande", Sans-Serif;
background: #ccc;
}
#page-wrap{
width: 500px;
margin: 50px auto;
padding: 20px;
background: white;
}
h1, h2, h3{
font: 28px Georgia, Serif;
border-bottom: 1px dotted #ccc;
margin: 0 0 10px 0;
}
.clear{
clear: both;
}
input[type="text"], textarea{
padding: 3px;
border: 1px solid #666;
width: 350px;
margin: 0 0 15px 0;
}
input[type="text"]{
font: 28px Georgia, Serif;
}
textarea {
height: 100px;
font: 12px "Lucida Grande", Sans-Serif;
}
label {
background: #666;
color: white;
padding: 2px 6px;
}
.post{
margin: 0 0 20px 0;
}
index.php ファイル:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHP を学ぶ</title>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<div id="page-wrap">
<?php
include_once('class/simpleCMS.php'); // クラスのファイルを接続する
$obj = new simpleCMS(); // 管理クラスのオブジェクトを作る
?>
</div>
</body>
</html>
これがどう動作するか見てみましょう。サイトの読み込みとともに index.php ファイルが読み込まれます。今は空に見えますが、クラスを追加してオブジェクトを作りました。このオブジェクトにはメソッドがあり、必要なときにそれらを呼び出します。この「必要なとき」は、if 演算子で条件を確認して判定します。
ひとまず作ったファイルから離れて、グローバル変数 $_GET と $_POST について見ていきましょう。
グローバル変数 $_GET
HTML フォームには method 属性(method='get' または method='post')があり、選ばれた method に応じて、フォームからのデータはグローバル変数 $_GET または $_POST に記録されます。例を見てみましょう:
<form action="welcome.php" method="get">
名前: <input type="text" name="fname" />
年齢: <input type="text" name="age" />
<input type="submit" />
</form>
submit ボタンを押すと、次のページに移動します:
http://sitename/welcome.php?fname=Peter&age=37
こうして $_GET 変数が形成されます。つまり、疑問符の後がこの変数の値です:
<?php
print $_GET['fname'];
print $_GET['age'];
?>
$_GET 変数は URL からの値の配列です。こうして、フォームを使わなくても、あるページから別のページへデータを渡せます。例えば、次のページで:
http://sitename/example.php?number=45
次のスクリプトを実行すると:
<?php
print $_GET['number'];
?>
URL からの数字が出力されます。
グローバル変数 $_POST
$_POST 変数は、$_GET 変数と同じようにフォームで使われます。同様の例を見てみましょう。
では、名前とメッセージのフィールドからなる簡単なフォームを作りましょう。
<form action="welcome.php" method="post">
名前: <input type="text" name="fname" />
年齢: <input type="text" name="age" />
<input type="submit" />
</form>
submit ボタンを押すと、次のページに移動します:
http://sitename/welcome.php
これで $_POST 変数を参照できます:
<?php
print $_POST['fname'];
print $_POST['age'];
?>
$_GET との違いは、$_POST の変数の配列は URL に記録されず、目に見えず、PHP を通じてのみ取得できることです。
では、メッセージ追加のフォームを作りましょう。メッセージの追加には POST メソッドを使い、サイトの管理には GET メソッドを使います:
public function display_admin() { // メッセージ入力のメソッド
$content = '';
$content .= '<form action="' . $_SERVER['PHP_SELF'] . '" method="post">'; // $_SERVER['PHP_SELF'] はクラスが呼び出されたファイルの名前を返す
$content .= '<label for="title">名前:</label><br />';
$content .= '<input name="title" id="title" type="text" maxlength="150" />';
$content .= '<div class="clear"></div>';
$content .= '<label for="bodytext">メッセージ:</label><br />';
$content .= '<textarea name="bodytext" id="bodytext"></textarea>';
$content .= '<div class="clear"></div>';
$content .= '<input type="submit" value="メッセージを追加" />';
$content .= '</form>';
$content .= '<p><a href="/index.php">トップに戻る</a></p>';
return $content;
}
display_admin() メソッドを上記のコードに変更してください。このコードは、レコードを追加する必要があるときに出力されます。しかしデフォルトでは、レコード自体が出力されるべきです。URL に admin = 1 という変数があるときにフォームが出力される、と約束しましょう。つまり URL は次のようになります:
http://test/index.php?admin=1
そこで、index.php ファイルを変更しましょう:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP を学ぶ</title>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<div id="page-wrap">
<?php
include_once('class/simpleCMS.php'); // クラスのファイルを接続する
$obj = new simpleCMS(); // 管理クラスのオブジェクトを作る
if( $_GET['admin'] == 1 ){ // URL に admin 変数があれば
print $obj->display_admin(); // 変数があれば、フォームを表示する
}else{
print $obj->display_public(); // 変数がなければ、メッセージを表示する
}
?>
</div>
</body>
</html>
そして、パラメーターなしの index.php ページのメッセージ出力メソッドを変更します:
public function display_public() { // メッセージ出力のメソッド
$content = '';
$content .= '<p><a href="/index.php?admin=1">メッセージを追加</a></p>';
return $content;
}
そこへ移動できるよう、パラメーター付きのページへのリンクを追加します。
ページの読み込み時に文字化けが出る場合は、.htaccess ファイルを作り(Windows では作りづらいことがあるので、既存のファイルをコピーして中身を空にしてください)、次の行を追加する必要があります:
AddDefaultCharset utf-8
これで、サーバーが UTF-8 で動作するようになります。
これで、データを別のページへ送るフォームができました。フォームの method を get に変えて、正しく動作するか確認できます:
$content .= '<form action="' . $_SERVER['PHP_SELF'] . '" method="get">';
これで、フォームからのパラメーターが index.php ページに渡されます。これらのパラメーターの処理は、ファイルの操作を学びデータをファイルに記録する次のレッスンに回します。