こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

現在PHPにてsessionを使用したフォームを作成しております。

現在PHPにてsessionを使用したフォームを作成しております。

現在、PHPは初心者で勉強中ですが悩んでいるため、ご質問させていただきます。

ソースは下記の通りです。

/* contact.php
----------------------*/
<html>
<body>
<form action="confirm.php" method="POST" >

コメント:<br />

<?php echo $_SESSION['error_comment']; ?>

<textarea name="comment"><?php echo $_SESSION['comment']; ?></textarea>

<input type="hidden" name="contact" value="<?php $contact; ?>" />

<input type="submit" name="submit" value="確認" />

</form>
</body>
</html>

/* confirm.php
----------------------*/
<?php
session_start();
$comment = htmlspecialchars($_POST['comment']);

if (isset($_POST["contact"])) {
if (empty($comment)) {
$_SESSION['error_comment'] = "コメントを入力してください!";

}


if (!count($contact)) {

$_SESSION["comment"] = $comment;
header("Location: contact.php");

exit;

}

} else {

$msg = '編集しました。';

}

<html>

<body>

<?php echo $msg; ?>

</body>

</html>


としております。
上記の内容でテストをするとcomment欄に入力されないと「コメントを入力してください!」と表示されますが、入力(テストと入力)をして確認をすると
onfirm.phpのページは表示されずcontact.phpのcomment欄にテストと表示されたままです。

入力された場合はconfirm.phpを表示されせるにはどうしたらよろしいのでしょうか?

お分かりの方がいらっしゃいましたら、ご教授お願いします。

投稿日時 - 2010-08-13 02:01:16

QNo.6105990

すぐに回答ほしいです

質問者が選んだベストアンサー

> 以上のソースに書き換えたところ、空入力でもcomplete.phpに通ってしまいます。

> form.php
> <input type="hidden" name="contact" value="<?php $_SESSION['contact']; ?>" />

最初はセッション変数に何も入っていないので、value="" でPOSTされます。

> complete.php
> $contact = $_POST['contact'];

> if (!count($contact)) {
> header("Location: index.php");
> exit;
> }

上記のPOSTから
$contact="" となりますが、これは長さ0の文字列というデータが入っているということなので、
count($contact)の返す値は0ではありません。
したがって、判定文の中の転送処理は実行されないので、そのままcomplte.php内のhtmlが表示されます。

$contactに""以外の有効な設定値が入っていないことを判定するなら
> if (!count($contact)) {
ではなく、
 if (empty($contact)) {
とした方が妥当でしょう。
empty($contact)なら$contact=""でも$contactの値が空と見なされます。

投稿日時 - 2010-08-13 16:33:25

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

どちらのソースも$contactは代入がなく参照・評価しかされてないのだけど……

> if (isset($_POST["contact"])) {

ここは$_POST["contact"]の内容が""であっても通るので、

> if (!count($contact)) {
> $_SESSION["comment"] = $comment;
> header("Location: contact.php");
> exit;
> }

ここを通れば100%転送されて戻ってしまいます。

$contactが何を意味する変数なのか知りませんが、きちんと値を入れる必要があるかと。

投稿日時 - 2010-08-13 04:16:36

補足

お忙しい中、ご回答有難う御座います。

> $contactが何を意味する変数なのか知りませんが、きちんと値を入れる必要があるかと。
<input type="hidden" name="contact" value="">にしようしています。
ソースを書き変えました。

以下になるのですが、いかがでしょうか?

/* form.php
------------------- */
<?php
//セッションを開始
session_start();
?>

<html>
<body>
<form action="complete.php" method="post">
<dl>
<dt>名前</dt>
<dd>
<?php echo $_SESSION['err_name']; ?>
<input type="text" size="20" name="name" value="<?php echo $_SESSION['name']; ?>" />
</dd>
<dt>コメント</dt>
<dd>
<?php echo $_SESSION['err_comment']; ?>
<textarea name="comment" rows="5" cols="40"><?php echo $_SESSION['comment']; ?></textarea>
</dd>
</dl>
<input type="hidden" name="contact" value="<?php $_SESSION['contact']; ?>" />
<input type="submit" name="submit" value="確認" />
</form>
</body>
</html>

/* complete.php
------------------ */
<?php
//セッションを開始
session_start();

$name = $_POST['name'];
$comment = $_POST['comment'];
$contact = $_POST['contact'];

if (isset($contact)) {
// 名前欄をチェック
if (empty($name)) {
$_SESSION['err_name'] = "<p>お名前は必須項目です。</p>";
}

// 質問・コメント欄をチェック
if (empty($comment)) {
$_SESSION['err_comment'] = "<p>質問・コメントを入力してください。</p>";
}
if (!count($contact)) {
header("Location: index.php");
exit;
}
}

// POSTされたデータとエラーメッセージをセッション変数に保存
$_SESSION['name'] = $name;
$_SESSION['comment'] = $comment;
$_SESSION['contact'] = $contact;
?>

<html>
<body>
<dl>
<dt>名前</dt>
<dd><?php echo $name; ?></dd>
<dt>内容</dt>
<dd><?php echo $comment; ?></dd>
</dl>
</body>
</html>

以上のソースに書き換えたところ、空入力でもcomplete.phpに通ってしまいます。
ページを戻るとエラーが表記されるようになります。
まだ勉強して間もないため、違っているとこのソースなどをご教授いただければと思います。

ご面倒かと思いますが、よろしくお願いします。

投稿日時 - 2010-08-13 12:55:49

あなたにオススメの質問