アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在メールフォームの作成にて困っていることがあります。

form.php

<?php
//エラー表示設定
if(isset($_SESSION['error'])) {
foreach ($_SESSION['error'] as $value) {
print ' <span style="color:#FF0000; font-size:13px;">' . h($value) . '</span><br />' . "\n";
}
}
?>

<!--FORMタグここから-->

<form method="post" action="confirm.php">
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td><label for="name">名前</label><span class="indispensable_color">*</span></td>
<td><input type="text" size="50" name="name" id="name" value="<?php print h(@$_SESSION['name']); ?>" /></td>
<td>例:goo 太郎</td>
</tr>

<tr>
<td><label for="kana">フリガナ</label><span class="indispensable_color">*</span></td>
<td><input type="text" size="50" name="kana" id="kana" value="<?php print h(@$_SESSION['kana']); ?>" /></td>
<td>例:グー タロウ</td>
</tr>
</table>
</form>

confirm.php

// 名前欄をチェックします。
if (trim($name) == '') {
$error[] = 'お名前は必須項目です。';
} else if (mb_strlen($name) > 100) {
$error[] = 'お名前は100文字以内でお願い致します。';
}

// フリガナ欄をチェック
if (trim($kana) == '') {
$error[] = 'フリガナは必須項目です。';
}

// エラー数を確認します。
if(count($error) > 0) {
// エラーがある場合は、入力フォームに戻る
$dirname = dirname($_SERVER['SCRIPT_NAME']);
$dirname = $dirname == DIRECTORY_SEPARATOR ? '' : $dirname;
$uri = 'http://' . $_SERVER['SERVER_NAME'] . $dirname . '/form.php';
header('HTTP/1.1 303 See Other');
header('Location: ' . $uri);

// 確認画面を表示します。
} else {


と記載しています。

これですと、エラーがあった場合の表示はtableの上にまとめて表示されます。

まとめて表示されるのではなく個別に表示されるにはどうしたらよろしいでしょうか?

例→名前の項目のテキストボックスの下に「お名前は必須項目です。」
  カナの項目のテキストボックスの下に「カナは必須項目です。」
と表示されるようにしたい。

ご教授お願いします。

「php メールフォーム エラー表示方法」の質問画像

A 回答 (3件)

では手っ取り早い方法で、form.phpの1ファイルでやります。



<?php
session_start();
$error = FALSE;
echo "<html><head></head><body>";
// POSTで受信したら
if ($_POST['submit'] == '送信') {
$name = trim($_POST['name']);
$kana = trim($_POST['kana']);
$_SESSION['name'] = $name;
$_SESSION['kana'] = $kana;
// 名前欄をチェックします。
if ($name == '') {
$_SESSION['err_name_req'] = 'お名前は必須項目です。';
$error = TRUE;
} else {
// 問題無ければSESSIONのエラー内容をクリア
unset($_SESSION['err_name_req']);
}
// 名前欄のサイズをチェック
if (mb_strlen($name) > 100) {
$_SESSION['err_name_len'] = 'お名前は100文字以内でお願い致します。';
$error = TRUE;
} else {
// 問題無ければSESSION内容のエラーをクリア
unset($_SESSION['err_name_len']);
}
// フリガナ欄をチェック
if ($kana == '') {
$_SESSION['err_kana_req'] = 'フリガナは必須項目です。';
$error = TRUE;
} else {
// 問題無ければSESSION内容のエラーをクリア
unset($_SESSION['err_kana_req']);
}

// エラーが無ければ登録などをする。エラーならそのまま処理を続行する。
if ($error == FALSE) {
//
// 送信内容の表示や登録処理など記述
//
echo "<h2>登録が完了しますた。</h2>";
echo "<p><a href='".$_SERVER['PHP_SELF']."'>戻る</a></p>";
// SESSION内容破棄
session_destroy();
// 処理を終了させる。formは表示されない。
exit();
}
}

// fromを表示する。
// あらかじめエラー時に表示させたい所に、<?php echo $_SESSION['err_kana_req']; ?> などを入れておく。
// 初回アクセス時はSESSION内容が空なので表示されない。
// formのactionは自分自身
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td><label for="name">名前</label><span class="indispensable_color">*</span></td>
<td><input type="text" size="50" name="name" id="name" value="<?php print $_SESSION['name']; ?>" /></td>
<td>例:goo 太郎 <span style="color:red;"><?php echo $_SESSION['err_name_req'].$_SESSION['err_name_len']; ?></span></td>
</tr>

<tr>
<td><label for="kana">フリガナ</label><span class="indispensable_color">*</span></td>
<td><input type="text" size="50" name="kana" id="kana" value="<?php print $_SESSION['kana']; ?>" /></td>
<td>例:グー タロウ <span style="color:red;"><?php echo $_SESSION['err_kana_req']; ?></td>
</tr>
<tr><td colspan="3"><input type="submit" name="submit" value="送信"></td></tr>
</table>
</form>
</body>
</html>

この回答への補足

有難う御座います。
できました。

ただ、メールアドレスのチェックとエラー出力方法ですが、
// メールアドレス欄をチェック
if (trim($mail) == '') {
$_SESSION['err_mail_req'] = 'メールアドレスは必須項目です。';
$error = TRUE;
} else {
unset($_SESSION['err_mail_req']);
}
if (!preg_match('/^[a-zA-Z0-9_\.\-]+@[A-Za-z0-9]+\.[A-Za-z0-9]+$/', $mail)) {
$_SESSION['err_mail_preg']= 'メールアドレスの形式が正しくありません。';
$error = TRUE;
} else {
unset($_SESSION['err_mail_preg']);
}
のように記述しています。

出力するところには
<span style="color:red; font-size:13px;"><?php print $_SESSION['err_mail_req'].$_SESSION['err_mail_preg']; ?></span>
と記述しています。

ですが、空白で確認ボタンを押すと画像のようになります。

空白で確認ボタンを押すと、必須項目です。
メアドの形式が間違っていたらアドレスの形式が違いますと別々にだしたいのですが、どうしたらよろしいでしょうか?

調べてやってみたのですが、!preg_matchの!をはずしてみるなどためしてみましたが、!をはずすとアドレスの形式はあっているのに形式が違いますとでます。

初心者なものですからご質問ばかりで申し訳ありませんが、宜しくお願いします。

補足日時:2009/11/07 00:55
    • good
    • 0

> 出力するところには


> <span style="color:red; font-size:13px;"><?php print $_SESSION['err_mail_req'].$_SESSION['err_mail_preg']; ?></span>
> と記述しています。
>
> ですが、空白で確認ボタンを押すと画像のようになります。
>
> 空白で確認ボタンを押すと、必須項目です。
> メアドの形式が間違っていたらアドレスの形式が違いますと別々にだしたいのですが、どうしたらよろしいでしょうか?
>
> 調べてやってみたのですが、!preg_matchの!をはずしてみるなどためしてみましたが、!をはずすとアドレスの形式はあっているのに形式が違いますとでます。

えーと、ちょっと質問の意味が分かりませんが
メールアドレス欄になにも入れず送信した時に必須項目のエラーが出るのは良いが、
形式のエラーを出したくないということでしょうか?
でしたら、必須項目のチェックでOKとなった時だけ形式をチェックすればいいですね。
必須項目チェックのelse文の中でメールアドレス形式をチェックするという事です。

preg_match関数は返り値にマッチした回数を返します。(1回マッチしたら処理が終わるので1(回)か0(回)のどちらかです。)
http://www.php.net/manual/ja/function.preg-match …
ですから、if (preg_match('/^[a-zA-Z0-9_\.\-]+@[A-Za-z0-9]+\.[A-Za-z0-9]+$/', $mail) == 0) {
がマッチしなかった時になります。
また、PHPは数値型の0をブーリアン型のFALSEと解釈します。
http://www.php.net/manual/ja/language.types.bool …
また、論理演算子 ! は否定しますので、if (!preg_match は
preg_matchがマッチしないなら0だからFALSE → ! がFALSEを否定しますのでTRUE→if文はTRUEで実行されます。
http://www.php.net/manual/ja/language.operators. …


あと、公開フォームとなるでしょうからセキュリティには十分注意して下さい。
http://www.php.net/manual/ja/security.variables. …
http://gihyo.jp/dev/serial/01/php-security
    • good
    • 0
この回答へのお礼

ご返信が遅くなり申し訳ありません。

また、参考URLをみながらいろいろとためしたのですが、まったくわからなかったため、諦めます。

いろいろと有難う御座いました。

お礼日時:2009/11/08 23:56

エラーがあった場合は入力フォームにhtmlヘッダーのLocationで飛ばさずに、


form.phpのエラーがあった場合のhtml出力で各フォームエレメントのそばにエラー内容をそれぞれ書き出す方法があります。
その際は$_SESSION['error']は要らなくなりますね。
ただし静的にhtmlにエラー内容を書いているので表示されたままですが。

他にjavascriptでフォーム内容をチェックしてエラー内容を表示させる。正しく入力されたらエラーを消すという事も出来ます。
jQueryなどのライブラリを使用すれば比較的簡単に出来ます。
たとえば、
「A jQuery inline form validation, because validation is a mess」
http://www.position-absolute.com/articles/jquery …
などはクライアントのブラウザ上のjavascriptでの検証とSubmit先のphpにAJAX通信で検証してもらう両方が簡単に出来ます。
デモはこちら、
http://www.position-relative.net/creation/formVa …
http://www.position-relative.net/creation/formVa …

参考までに

この回答への補足

ご回答有難う御座います。
このままの状態で記述し、動作をおこなうのは無理なのでしょうか?

今はjavascriptに興味がなく、知識もないため最低限は避けております。

このphpにて、エラーを出力する記述をご教授いただけないでしょうか?

宜しくお願いします。

補足日時:2009/11/05 21:36
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!