質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • PHP

    20367questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Atom (テキストエディタ)

    508questions

PHPで一つのファイルでページを切り替える方法とエラーメッセージの表示

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,387

yushi

score 6

前提・実現したいこと

PHPで入力フォームにチェック機能をつけたいのですが、反映されなくて困っています。

以下、解決したい部分です。

・PHPのみで入力フォームと入力チェックを作る
・入力→確認→完了 までを一つのファイル内で行いたいが、入力から完了まで全てが表示されている
(一つのファイルでまとめられたが、切り替えできるようにしたい)

・入力画面で確認ボタンを押した際、空欄があればエラーメッセージを出す(→出ない)
・開発画面での改ざん防止のために、完了ボタンを押した際違う値になっていれば、エラーメッセージを出す(→出ない)

actionを全てindex.phpにしているのに、なぜ反映されないのかがわかりません。
原因が知りたいです。

発生している問題・エラーメッセージ

syntax error, unexpected '!=' (T_IS_NOT_EQUAL) in アドレス名  on line 113
113の該当箇所は「if (isset($_POST["name"])) != $name {」です。

該当のソースコード

<?php

//echo '<pre>';
//var_dump($_POST);
//echo '</pre>';

   $errorm = array();

 if (isset($_POST["submit"])) {
    $name = $_POST["name"];
    $gender = $_POST["gender"];
    $age = $_POST["age"];
    $message = $_POST["message"];


if($name == null){
  $errorm ['name'] = "名前を入力してください";
}
if($gender == null){
  $errorm ['gender'] = "性別にチェックを入れてください";
}
if($age == null){
  $errorm ['age'] = "年齢を入力してください";
}
if($name == null){
  $errorm ['message'] = "メッセージを入力してください";
}

}
 ?>


<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>問い合わせフォーム!</title>
  <link rel="stylesheet" href="index.css">
  <style>
  body{
    background-color: pink;
  }

  textarea{
    vertical-align:top;
  }
  </style>
 </head>
 <body>

//入力画面 確認ボタンを押すと上記のエラーメッセージが出る
  <h2>問い合わせフォーム</h2>

  <form  action= "index.php" method="post">
   名前 <input name="name" type="text" />

   <br>

   性別 
   男性<input name="gender" type="radio" value="男性" />
   女性<input name="gender" type="radio" value=女性 /><br>

   年齢 <select name="age">
   <option value="10">10代未満</option>
   <option value="20">20代</option>
   <option value="30">30代</option>
   <option value="40">40代</option>
   <option value="50">50代</option>
   <option value="60">60代以上</option>
  </select>
   <br>
   <p>メッセージ(お問い合わせ内容)</p>
   <textarea name="message" rows="5" cols="50"></textarea><br>
   <input type="submit" name="kakunin" value="確認" />
 </form>
 </body>
</html>

//確認画面 入力画面の値を表示し、完了ボタンを押した際にデータが書き換わっていればエラーを出す
<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>問い合わせフォーム!</title>
  <link rel="stylesheet" href="index.css">
</head>
 <body>
   <h2>問い合わせ確認</h2>
   <p>こちらでお間違いありませんか?</p>
   <form action="index.php" method="post">
     <?php

     $name = $_POST["name"];
     $gender = $_POST["gender"];
     $age = $_POST["age"];
     $message = $_POST["message"];

     echo "名前".'&nbsp'.'&nbsp'.$name;
     echo "<br />";
     echo "性別".'&nbsp'.'&nbsp'.$gender;
     echo "<br />";
     echo "年齢".'&nbsp'.'&nbsp'.$age;
     echo "<br />";
     echo "<br />";
     echo "メッセージ内容".'&nbsp'.'&nbsp'.$message;
     ?>
     <input type="hidden" name="name" value="<?php echo $name; ?>">
     <input type="hidden" name="gender" value="<?php echo $gender; ?>">
     <input type="hidden" name="age" value="<?php echo $age; ?>">
     <input type="hidden" name="message" value="<?php echo $message; ?>">

<?php
if (isset($_POST["name"])) != $name {
     $errorm ['name'] = "名前が違います"
}
if (isset($_POST["gender"])) != $gender {
     $errorm ['gender'] = "名前が違います"
}
if (isset($_POST["age"])) != $age {
     $errorm ['age'] = "名前が違います"
}

if (isset($_POST["message"])) != $message {
     $errorm ['message'] = "名前が違います"
}

?>
     <br><br>
       <input type="button" onclick="history.back()" value="戻る" />
       <input type="submit" value="完了" />

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

//完了画面
<!DOCTYPE html>
<html>
<head>
<form action="index.php" method="post">
   <h2>お問合せありがとうございましたm(_ _)m</h2>
   <input type="button" onclick="history.back(-2)" value="最初に戻る" />

</form>
 </body>

</html>

試したこと

・ネットでエラーメッセージの出し方を調べて表記
・ページ切り替えでheaderやformにidをつけて移動できるよう試みた

補足情報(言語/FW/ツール等のバージョンなど)

テキストエディタ: Atom
PHP: 7.0.9
サーバー: Xserver

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

HTMLの構文など色々と修正してみました。

入力画面

<?php
$errorm = array();

if (isset($_POST["submit"])) {
    $name = $_POST["name"];
    $gender = $_POST["gender"];
    $age = $_POST["age"];
    $message = $_POST["message"];

    if ($name === '') {
        $errorm['name'] = "名前を入力してください";
    }
    if ($gender === '') {
        $errorm['gender'] = "性別にチェックを入れてください";
    }
    if ($age === '') {
        $errorm['age'] = "年齢を入力してください";
    }
    if ($name === '') {
        $errorm['message'] = "メッセージを入力してください";
    }
}
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>問い合わせフォーム!</title>
    <link rel="stylesheet" href="index.css">
    <style type="text/css">
        body {
            background-color: pink;
        }

        textarea {
            vertical-align: top;
        }
    </style>
</head>
<body>
<h2>問い合わせフォーム</h2>
<form action="index.php" method="post">
    <label>
        名前 <input name="name" type="text">
    </label>
    性別
    <label>
        男性<input name="gender" type="radio" value="男性"/>
    </label>
    <label>
        女性<input name="gender" type="radio" value=女性/>
    </label>
    <br>
    <label>年齢
        <select name="age">
            <option value="10">10代未満</option>
            <option value="20">20代</option>
            <option value="30">30代</option>
            <option value="40">40代</option>
            <option value="50">50代</option>
            <option value="60">60代以上</option>
        </select>
    </label>
    <br>
    <label>メッセージ(お問い合わせ内容)
        <textarea name="message" rows="5" cols="50"></textarea>
    </label>
    <br>
    <input type="submit" name="kakunin" value="確認">
</form>
</body>
</html>

確認画面

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>問い合わせフォーム!</title>
    <link rel="stylesheet" href="index.css">
</head>
<body>
<h2>問い合わせ確認</h2>
<p>こちらでお間違いありませんか?</p>
<form action="index.php" method="post">
    <?php
    $name = $_POST["name"];
    $gender = $_POST["gender"];
    $age = $_POST["age"];
    $message = $_POST["message"];

    echo "名前" . '&nbsp' . '&nbsp' . $name;
    echo "<br />";
    echo "性別" . '&nbsp' . '&nbsp' . $gender;
    echo "<br />";
    echo "年齢" . '&nbsp' . '&nbsp' . $age;
    echo "<br />";
    echo "<br />";
    echo "メッセージ内容" . '&nbsp' . '&nbsp' . $message;
    ?>
    <input type="hidden" name="name" value="<?php echo $name; ?>">
    <input type="hidden" name="gender" value="<?php echo $gender; ?>">
    <input type="hidden" name="age" value="<?php echo $age; ?>">
    <input type="hidden" name="message" value="<?php echo $message; ?>">
    <!--
    意図している動作がわからなかったのでとりあえずコメントアウト。
        < ?php
        if (isset($_POST["name"])) != $name{
        $errorm ['name'] = "名前が違います"
        }
    if (isset($_POST["gender"])) != $gender{
        $errorm ['gender'] = "名前が違います"
        }
    if (isset($_POST["age"])) != $age{
        $errorm ['age'] = "名前が違います"
        }

    if (isset($_POST["message"])) != $message{
        $errorm ['message'] = "名前が違います"
        }
    ?>
    -->
    <br><br>
    <input type="button" onclick="history.back()" value="戻る">
    <input type="submit" value="完了">
</form>
</body>
</html>

完了画面

<!DOCTYPE html>
<html>
<head>
</head><!-- 閉じる。 -->
<body><!-- bodyタグの開始タグがない。 -->
<form action="index.php" method="post">
    <h2>お問合せありがとうございましたm(_ _)m</h2>
    <input type="button" onclick="history.back(-2)" value="最初に戻る">
</form>
</body>
</html>

追記

<?php
if (session_status() !== PHP_SESSION_ACTIVE) {
    session_cache_expire(0);
    session_cache_limiter('private_no_expire');
    session_start();
}
if (!isset($_SESSION["token"])) {
    $_SESSION["token"] = "";
}

$errorm = "";
$state = "";

function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES, "UTF-8");
}

function getToken()
{
    $token = null;
    if (is_null($token)) {
        $token = hash("sha256", uniqid());
    }
    $_SESSION["token"] = $token;
    return $token;
}

function checkToken($str)
{
    return (isset($_SESSION["token"]) && $_SESSION["token"] === $str);
}

foreach (["name", "gender", "age", "message"] as $value) {
    $$value = "";
}

if (filter_input(INPUT_POST, "submit")) {
    if (checkToken(filter_input(INPUT_POST, "token"))) {
        $state = "submit";
        unset($_SESSION["token"]);
        foreach (["name", "gender", "age", "message"] as $value) {
            if (empty(filter_input(INPUT_POST, $value))) {
                $errorm = "未入力箇所があります。";
                $state = "";
                break;
            } else {
                $_SESSION[$value] = filter_input(INPUT_POST, $value);
            }
        }
    } else {
        $state = "";
        foreach (["name", "gender", "age", "message"] as $value) {
            $$value = filter_input(INPUT_POST, $value);
        }
    }
} else if (filter_input(INPUT_POST, "confirm")) {
    if (checkToken(filter_input(INPUT_POST, "token"))) {
        $state = "confirm";
        unset($_SESSION["token"]);
        foreach (["name", "gender", "age", "message"] as $value) {
            if (empty(filter_input(INPUT_POST, $value))) {
                $errorm = "未入力箇所があります。";
                $state = "";
                break;
            } else {
                if ((!isset($_SESSION[$value])) || $_SESSION[$value] !== filter_input(INPUT_POST, $value)) {
                    $state = "";
                }
            }
        }
    } else {
        $state = "";
    }
    //送られてきた内容の保存などの処理は省略。
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>タイトル</title>
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }

        label {
            display: block;
        }
    </style>
</head>
<body>
<?php if (!empty($errorm)): ?>
    <strong><?= $errorm ?></strong>
<?php endif; ?>
<?php if ($state === "submit"): ?>
    <form action="" method="post">
        <ul>
            <li><?= h($_SESSION["name"]) ?></li>
            <li><?= h($_SESSION["gender"]) ?></li>
            <li><?= h($_SESSION["age"]) ?></li>
            <li><?= h($_SESSION["message"]) ?></li>
        </ul>
        <input type="hidden" name="name" value="<?= h($_SESSION["name"]) ?>">
        <input type="hidden" name="gender" value="<?= h($_SESSION["gender"]) ?>">
        <input type="hidden" name="age" value="<?= h($_SESSION["age"]) ?>">
        <input type="hidden" name="message" value="<?= h($_SESSION["message"]) ?>">
        <input type="hidden" name="token" value="<?= h(getToken()) ?>">
        <input type="submit" name="confirm">
    </form>
<?php elseif ($state === "confirm"): ?>
    <p>送信完了。</p>
<?php else: ?>
    <form action="" method="post">
        <label>お名前:
            <input type="text" name="name" value="<?= h($name) ?>">
        </label>
        <span>性別</span>
        <label>男性:
            <input type="radio" name="gender" value="男性" <?php if ($gender === "男性") echo "checked"; ?>>
        </label>
        <label>女性:
            <input type="radio" name="gender" value="女性" <?php if ($gender === "女性") echo "checked"; ?>>
        </label>
        <label>その他:
            <input type="radio" name="gender" value="その他" <?php if ($gender === "その他") echo "checked"; ?>>
        </label>
        <label>年齢:
            <select name="age"><?= $age ?>
                <?php foreach (["10", "20", "30", "40", "50", "60"] as $value): ?>
                    <?php if ($age === $value): ?>
                        <?php if ($value === "10"): ?>
                            <option value="<?= $value ?>" selected><?= $value ?>代未満</option>
                        <?php elseif ($value === "60"): ?>
                            <option value="<?= $value ?>" selected><?= $value ?>代以上</option>
                        <?php else: ?>
                            <option value="<?= $value ?>" selected><?= $value ?>代</option>
                        <?php endif; ?>
                    <?php else: ?>
                        <?php if ($value === "10"): ?>
                            <option value="<?= $value ?>"><?= $value ?>代未満</option>
                        <?php elseif ($value === "60"): ?>
                            <option value="<?= $value ?>"><?= $value ?>代以上</option>
                        <?php else: ?>
                            <option value="<?= $value ?>"><?= $value ?>代</option>
                        <?php endif; ?>
                    <?php endif; ?>
                <?php endforeach; ?>
            </select>
        </label>
        <label>メッセージ(お問い合わせ内容):
            <textarea name="message" rows="5" cols="50"><?= h($message) ?></textarea>
        </label>
        <input type="hidden" name="token" value="<?= h(getToken()) ?>">
        <input type="submit" name="submit">
    </form>
<?php endif; ?>
</body>
</html>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/10 01:27

    ついでに、10歳〜19歳の人も使えるようにするといいと思います。

    キャンセル

  • 2017/03/10 12:19

    回答ありがとうございます。間違っている部分、修正しました。
    修正はできましたが、一つのページに入力から完了までが全て出ている状態でエラーメッセージも表示されません。一つのファイルでページの切り替えはできないのでしょうか。

    確認画面の「意図している動作がわからない・・」ところは
    「完了ボタンを押した際に表示されている値が、入力画面で入力した値と異なっていれば、完了画面に進まないようにする(エラーメッセージを出す)」ということをしたいです。

    キャンセル

  • 2017/03/10 14:15

    Kosuke_Shibuyaさん、yushiさん>返信が遅れてしまい申し訳ありません。質問文に記述されている要件のほとんどを満たしたコードを追記させていただきました。

    キャンセル

  • 2017/03/10 14:16

    ロジックというより‥笑
    ここ
    <option value="10">10代未満</option>
    <option value="20">20代</option>
    10代の選択肢がないw

    キャンセル

  • 2017/03/12 00:57

    Kosuke_Shibuyaさん、s8_chuさん
    ご回答ありがとうございました。10代~20代の部分忘れていて申し訳ありません・・

    きちんと動きました。コードを書いては消し・・・の作業を繰り返していたので助かりました。
    今後はコードを眺め関数がどう働いているのか、また知らない関数について調べていきます。
    kei344さんのおっしゃる通り、phpの基礎からやり直しつつ勉強会についていくつもりです。

    キャンセル

+3

PHPに限らず問題の切り分けは重要なスキルです。一度に全部盛り込んで作らず、ページを分けたところから作られてはいかがでしょうか。

また、PHPの入門書を最初から順番にこなされたほうが良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/10 12:14

    回答ありがとうございます。
    できれば基礎からやり直したいのですが、今回は勉強会の宿題ということもあり、自分の力でエラーメッセージを出さなければなりません。

    別ファイルにするのが一番いい方法ですが、一つのファイルでやってほしいと指示されたのでコードをまとめて載せています。

    キャンセル

  • 2017/03/10 13:20

    > 勉強会の宿題
    それであるならなおさら基礎を勉強すべきです。書かれているコードは「どこからどこまでがHTMLか」という切り分けができていない状態です。PHPについては制御文の書き方もいまいちわかっていない様子です。
    あせって質問しているより書籍を複数買って勉強するほうが今後の上達につながりますよ。

    キャンセル

  • 2017/03/12 01:01

    ご回答ありがとうございます。
    HTML、CSSまではついていけるものの、JavaScriptやPHPになると関数や条件分岐が多く登場するため、頭が混乱してしているのが現状です。
    なるべく自分の力でやるのであれば、基本的な部分を覚えなければなりませんね。

    勉強会についていくためにも、少しずつ時間を取って始めからやり直します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    お問い合わせフォームエラーメッセージを表示させたい。

    PHP超初心者です。 PHPにてお問い合わせフォームを作成しています。 フォームに空白があった場合にエラーメッセージにて入力を促す指示を出したいのですがどうも上手くいきません。

  • 解決済

    PHP スーパーグローバル変数

    PHPのスーパーグローバル変数についてなかなか理解ができなくて とりあえず自分なりに作ってみたんですけど エラーばかりで いろいろ調べてもわからなくなる一方です。 私が目指し

  • 解決済

    PHP:パスワードが一致したときのみ、投稿の削除をする簡易掲示板

    パスワードが一致したときの条件式をプログラムに書いても反応しません。/ファイル消去/ブロックの6行目あたりにあるif文のandの右側の条件式です。この式で使われている$delDat

  • 解決済

    年齢を必須条件で取得してますが、「0」でエラーになる

    前提・実現したいこと PHPで「0」を入力された時にエラーを出なくしたい。 発生している問題 フォームの必須項目として年齢を取得しています。 次記のコードで空だった場合

  • 解決済

    PHP $_POSTでname属性に"["があるformのvalueを取得したい

    前提・実現したいこと PHPで動く予約管理システムを使用しています(既製品) 予約入力画面で入力値を、申込み完了後に$_POSTを使って別のフォームに渡したいのです。

  • 解決済

    php 簡易掲示板の編集

    実現したいこと 簡易掲示板について。 テキストと送信ボタンがある掲示版を扱います。 フォームを送信すると、別に用意したテキストファイルに内容が保存され、そこから読みだされた内

  • 解決済

    PHPとMySQL、phpMyAdminとの連携が上手くいかない。

    平素より大変お世話になっております。 当方、PHPの初学者でございます。 (C#やhtmlはある程度やっているので、関数や条件文や演算子など、オブジェクト指向についての

  • 解決済

    Undefined indexエラーを消したい。

    前提・実現したいこと phpでお問い合わせホームを作っています。 Notice: Undefined indexのエラーを出ないようにしないです。 発生している問題・エラ

同じタグがついた質問を見る

  • PHP

    20367questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Atom (テキストエディタ)

    508questions