簡単なフォーム

ソース

<?php
  if ($_POST['onamae'] != '') {
    $x = htmlspecialchars($_POST['onamae']);
    echo "<p>こんにちは,$x さん。</p>";
  }
?>

<form action="form.php" method="post">
<p>お名前: <input name="onamae" size="20" /></p>
</form>

< > & " といったHTMLで特別な意味を持つ文字を &lt; &gt; &amp; &quot; に変換する関数 htmlspecialchars() を使っています。 この理由は セキュリティ上の配慮 をご覧ください。

action="form.php" の部分は,自分のファイル名を書きます。 ファイル名を間違えないようにするには, action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" のようにするといいでしょう。 $_SERVER['PHP_SELF'] は自分自身のファイル名(パス)で,このファイルでは /~okumura/php/form.phpとなります。 ただしPHPではファイル名の後に / で区切って任意の文字列を付けられるので,出力する際には htmlspecialchars() を使います。

labelを使おう

上の例は実際には次のように書かれています。

<form action="form.php" method="post">
<p><label for="onamae">お名前:</label> <input id="onamae" name="onamae" size="20" /></p>
</form>

このように label を使うと,ラベル(上の例では「お名前」)をクリックすれば,for="..." と対応する id="..." を持つ入力欄に入力可能な状態になります。

label には次の形もありますが,IE 6以前はこちらの形に対応していません。

<form action="form.php" method="post">
<p><label>お名前: <input name="onamae" size="20" /></label></p>
</form>

最初のテキストボックスを選択した状態にするには

ページを開くと最初のテキストボックス

<p><label for="onamae">お名前:</label>
   <input id="onamae" name="onamae" size="20" /></p>

をフォーカスした状態にするには,JavaScriptでこの後に

<script type="text/javascript">
  document.getElementById('onamae').focus();
</script>

と書くか,あるいはbodyタグに

<body onload="document.getElementById('onamae').focus()">

ような細工をします(JavaScript講座)。

ポストされたかの判断のいろいろ

上の例では,名前が入力されているかどうかを if ($_POST['onamae'] != '') で判断しています。これ以外に次のような判断法が考えられますが,意味は少しずつ違います。

if (isset($_POST['onamae']))
このページを最初に訪れたときは $_POST['onamae'] がセットされていません(var_dump($_POST['onamae']) を表示すると NULL となります)ので,これで判断できます。ただ,このページで何も入力しないで Enter キーを押した場合は空文字列 "" がセットされていますので,「こんにちは, さん」と表示されてしまいます。
if (!empty($_POST['onamae']))
空文字列には反応しなくなりますが,0 と入力しても無入力と判断されてしまいます。
if ($_POST['onamae'])
同上。
if ($_POST['onamae'] != '')
空文字列でないことを判断します。$_POST['onamae'] がセットされていない場合には,警告が出ることがありますが,正しく処理されます。
if ($_POST['onamae'] !== '')
空文字列でないことを(より厳密に)判断します。$_POST['onamae'] がセットされていない場合には,警告が出ることがあるだけでなく,「こんにちは」が表示されてしまいます。
if (isset($_POST['onamae']) && $_POST['onamae'] != '')
$_POST['onamae'] が定義され,かつ空文字列でないことを判断します。

isset(...) は,セットされているか(is set?)を調べる命令です。複数のものがすべてセットされているかを調べるには,isset($_POST['onamae'], $_POST['email']) のように連続して書くことができます。

if ($_POST['onamae'])if ($_POST['onamae'] != '') のような書き方では,$_POST['onamae'] が存在しないと "PHP Notice: Undefined index: onamae in /home/okumura/public_html/php/form.php on line 17” のような警告が出ることがあります。そのときは if (isset($_POST['onamae']) && $_POST['onamae'] != '') のようにします。

警告が(画面またはApacheのerror_logに)出ないようにするには,PHPの設定ファイルphp.iniの error_reporting = E_ALLerror_reporting = E_ALL & ~E_NOTICE または error_reporting = E_ALL & ~E_NOTICE | E_STRICT のようにします。


奥村晴彦

Last modified: 2009-08-01 13:57:40