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

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

ただいまの
回答率

90.48%

  • PHP

    20912questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,518

swa3n.

score 1

PHP超初心者です。
PHPにてお問い合わせフォームを作成しています。
フォームに空白があった場合にエラーメッセージにて入力を促す指示を出したいのですがどうも上手くいきません。
フォームを送信すると$_POSTに各データがセットされているかの確認、データがセットされていなければ、エラーメッセージの表示、セットされていれば confirm.phpへ遷移という流れを書いたつもりです。
どなたかご教授賜りたいです。

*具体的な問題点
現状のコードで実行し、フォームに内容を入力して送信てみると、フォームの入力内容が消え、次の画面(confirm.php)へ遷移せず、エラーメッセージもでないといった状況です。
当初はエラーメッセージ機能は実装していませんでした。(PHP記述をせず、HTMLのみ)
その場合だと、confirm.phpへ遷移することが出来たため、PHPの記述が間違っているのだろうと考えています。

コード

<?
    //送信ボタンが押されたら//
    if (isset($_POST ["register"])) {
        //エラーメッセージを格納する配列を作成
        $error_message =  array ();
        if ($_POST ["onamae"]!=="") {
        //データがセットされていたら各変数にPOSTのデータを格納
            $onamae = htmlspecialchars($_POST["onamae"],ENT_QUOTES);
        //各データがなかったらエラーメッセージを配列に格納
        }else{
            $error_message[] = "お名前を入力して下さい。<br>";
             }
        if ($_POST["mailadress"]!=="") {
            $mailadress = htmlspecialchars($_POST["mailadress"],ENT_QUOTES);
        }else{
            $error_message[] = "メールアドレスを入力してください。<br>";
            }

        if ($_POST["category"]!=="") {
            $mailadress = htmlspecialchars($_POST["category"],ENT_QUOTES);
        }else{
            $error_message[] = "お問い合わせの種類を選択してください。<br>";
            }

        if ($_POST["interest[]"]!=="") {
            $mailadress = htmlspecialchars($_POST["interest"],ENT_QUOTES);
        }else{
            $error_message[] = "興味のある分野を1つ以上選択してください。<br>";
            }
        if ($_POST["body"]!=="") {
            $mailadress = htmlspecialchars($_POST["body"],ENT_QUOTES);
        }else{
            $error_message[] = "メッセージを入力してください。<br>";
            }
        //エラーが無い時    
        if (!count($error_message)){
        //確認ページヘ
            header("Location:confirm.php");
            exit;
            }
        }
        if (count($error_message)) {
            foreach ($error_message as $message){
               print ($message);
               }
        }        


        ?>
<!DOCTYPE HTML>
<html>
<head>
    <title>お問い合わせフォーム</title>
    <meta charset="utf-8">
</head>
<body>
    <form name="form1" method="post"action="confirm.php" >

        <H1>お問い合わせフォーム</H1>
        ・お名前<br>
        <input type="text" name="onamae" >
        <br>

        ・メールアドレス<br>
        <input type="text" name="mailadress">
        <br>

        ・お問い合わせの種類<br>
        <select name="category" >
            <option value=""selected>選んで下さい</option>
            <option value="質問">質問</option>
            <option value="要望">要望</option>
            <option value="その他お問い合わせ">その他お問い合わせ</option>
        </select>
        <br>

        ・興味のある分野<br>
        <input type="checkbox" name="interest[]" value="HTML">
        HTML<br>
        <input type="checkbox" name="interest[]" value="PHP">
        PHP<br>
        <input type="checkbox" name="interest[]" value="MySQL">
        MySQL<br>
        <input type="checkbox" name="interest[]" value="Linux">    
        Linux<br>
        <input type="checkbox" name="interest[]" value="マネジメント">
        マネジメント<br>
        <input type="checkbox" name="interest[]" value="その他">
        その他<br>

        ・メッセージ<br>
        <textarea name="body" cols="30" rows="5"></textarea>
        <br>

        <input type="submit" name="register value="送信">

    </form>
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • ItoTomonori

    2016/04/06 08:09

    どのあたりが、「どうも上手くいきません」なのか、もう少し記載してもらえると、いいですね!

    キャンセル

  • swa3n.

    2016/04/06 08:19

    どのように上手くいかないのか書いてみましたが、いかがでしょうか?

    キャンセル

回答 4

checkベストアンサー

+2

インデントを整理するとわかると思いますが、コードの次の部分が働きません

if (count($error_message)) {
    foreach ($error_message as $message){
        print ($message);
    }
}


以下、整理したコード

//送信ボタンが押されたら//
if (isset($_POST ["register"])) {
    //エラーメッセージを格納する配列を作成
    $error_message =  array ();
    if ($_POST ["onamae"]!=="") {
    //データがセットされていたら各変数にPOSTのデータを格納
        $onamae = htmlspecialchars($_POST["onamae"],ENT_QUOTES);
    //各データがなかったらエラーメッセージを配列に格納
    }else{
        $error_message[] = "お名前を入力して下さい。<br>";
    }

    if ($_POST["mailadress"]!=="") {
        $mailadress = htmlspecialchars($_POST["mailadress"],ENT_QUOTES);
    }else{
        $error_message[] = "メールアドレスを入力してください。<br>";
    }

    if ($_POST["category"]!=="") {
        $mailadress = htmlspecialchars($_POST["category"],ENT_QUOTES);
    }else{
        $error_message[] = "お問い合わせの種類を選択してください。<br>";
    }

    if ($_POST["interest[]"]!=="") {
        $mailadress = htmlspecialchars($_POST["interest"],ENT_QUOTES);
    }else{
        $error_message[] = "興味のある分野を1つ以上選択してください。<br>";
    }
    if ($_POST["body"]!=="") {
        $mailadress = htmlspecialchars($_POST["body"],ENT_QUOTES);
    }else{
        $error_message[] = "メッセージを入力してください。<br>";
    }
    //エラーが無い時    
    if (!count($error_message)){
    //確認ページヘ
        header("Location:confirm.php");
        exit;
    }
}
if (count($error_message)) {
    foreach ($error_message as $message){
        print ($message);
    }
}


最初に指摘した部分がif (isset($_POST ["register"])) {}の外にあるため、エラーがあっても表示できません。


追記
他の方が指摘されていたように、エラーメッセージの表示場所に問題があるので、その点も踏まえて次のようにするとどうでしょうか。

<?
//送信ボタンが押されたら//
$error_message =  array (); //<--ここ$error_messageを定義
if (isset($_POST ["register"])) {
    //エラーメッセージを格納する配列を作成
    if ($_POST ["onamae"]!=="") {
    //データがセットされていたら各変数にPOSTのデータを格納
        $onamae = htmlspecialchars($_POST["onamae"],ENT_QUOTES);
    //各データがなかったらエラーメッセージを配列に格納
    }else{
        $error_message[] = "お名前を入力して下さい。<br>";
    }

    if ($_POST["mailadress"]!=="") {
        $mailadress = htmlspecialchars($_POST["mailadress"],ENT_QUOTES);
    }else{
        $error_message[] = "メールアドレスを入力してください。<br>";
    }

    if ($_POST["category"]!=="") {
        $mailadress = htmlspecialchars($_POST["category"],ENT_QUOTES);
    }else{
        $error_message[] = "お問い合わせの種類を選択してください。<br>";
    }

    if ($_POST["interest[]"]!=="") {
        $mailadress = htmlspecialchars($_POST["interest"],ENT_QUOTES);
    }else{
        $error_message[] = "興味のある分野を1つ以上選択してください。<br>";
    }
    if ($_POST["body"]!=="") {
        $mailadress = htmlspecialchars($_POST["body"],ENT_QUOTES);
    }else{
        $error_message[] = "メッセージを入力してください。<br>";
    }
    //エラーが無い時    
    if (!count($error_message)){
    //確認ページヘ
        header("Location:confirm.php");
        exit;
    }
}
?>
<!DOCTYPE HTML>
<html>
<head>
    <title>お問い合わせフォーム</title>
    <meta charset="utf-8">
</head>
<body>
<?php
//ここに記述することでhtml内で表示させる
if (count($error_message)) {
    foreach ($error_message as $message){
        print ($message);
    }
}        
?>
    <form name="form1" method="post"action="confirm.php" >

        <H1>お問い合わせフォーム</H1>
        ・お名前<br>
        <input type="text" name="onamae" >
        <br>

        ・メールアドレス<br>
        <input type="text" name="mailadress">
        <br>

        ・お問い合わせの種類<br>
        <select name="category" >
            <option value=""selected>選んで下さい</option>
            <option value="質問">質問</option>
            <option value="要望">要望</option>
            <option value="その他お問い合わせ">その他お問い合わせ</option>
        </select>
        <br>

        ・興味のある分野<br>
        <input type="checkbox" name="interest[]" value="HTML">
        HTML<br>
        <input type="checkbox" name="interest[]" value="PHP">
        PHP<br>
        <input type="checkbox" name="interest[]" value="MySQL">
        MySQL<br>
        <input type="checkbox" name="interest[]" value="Linux">    
        Linux<br>
        <input type="checkbox" name="interest[]" value="マネジメント">
        マネジメント<br>
        <input type="checkbox" name="interest[]" value="その他">
        その他<br>

        ・メッセージ<br>
        <textarea name="body" cols="30" rows="5"></textarea>
        <br>

        <input type="submit" name="register value="送信">

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/06 09:32

    ご回答ありがとうございます。
    エラーメッセージの表示場所の指摘の意味がようやく分かりました。。ありがとうございます。
    修正していただいたコードを使い実行してみましたが、次の画面に遷移させることができましたが、空白のままでも遷移できてしまうので、PHPのロジックが間違っているのではと考えております。自分なりにもう一度考えなおしてみます。

    とても分かりやすく、また修正していただき、ありがとうございました。

    キャンセル

0

ざっと気になるとこは…
・エラーメッセージをhtmlの前に出してる
・confirm.phpへ入力内容を引き継いでない

で、もちっと「こうなるつもりなんだけど、こうなっちゃってる」
みたいな話を書いてもらえると具体的な指定がされると思うます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/06 08:28

    confim.phpへ入力内容を引き継いでいないというのは、formタグにaction="confirm.php"の記述がないということでしょうか?

    キャンセル

  • 2016/04/06 12:48

    あ、今気づきましたが…
    エラーが無い場合に confirm.php へ遷移するつもりのようですが、
    action="confirm.php" なので submitしたら confirm.php が
    実行されますね。つまり、ここで提示された処理は実行されないのでは?

    php で遷移するのと、action で遷移するのではどちを想定されてるのか
    分かりませんが、それによってデータ引き継ぎ云々が変わってきます。

    キャンセル

0

header("Location:confirm.php");


が実行されていないようですので、おそらく、PHP側の何らかのエラーでしょう。
そこで、

<?php
//エラー出力強制
ini_set('display_errors',1);
//すべてのエラー表示
error_reporting(E_ALL);


を先頭に記載して、PHP側のエラーを表示させると、もう少し何かわかるかもしれません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/06 08:43

    上記を試してみましたが、エラーが表示されず、*具体的な問題点に挙げた現象が再び起きてしまいました・・・。

    キャンセル

  • 2016/04/06 08:54

    「フォームの入力内容が消え」との事?なので、HTMLは表示されているのでしょうか?真っ白画面ではない(真っ白画面だとPHPのエラーですが、HTMLがでているなら、PHPのシンタックスは正常)?

    ということは、処理場
    ```
    //エラーが無い時
    if (!count($error_message)){
    //確認ページヘ
    header("Location:confirm.php");
    exit;
    }
    }
    ```
    も、
    ```
    if (count($error_message)) {
    foreach ($error_message as $message){
    print ($message);
    }
    }
    ```
    も、通っていないということですね、、、

    ということは、ロジック的な誤りかと。
    再度、エラーチェック部分を1つ1つ追いかけてみたらよいのではと思います。

    キャンセル

  • 2016/04/06 09:24

    HTMLは表示されています。
    私もロジックが間違っているのではないかと思うに至りましたので、ご指摘の通りエラーチェック部分を追いかけてみようと思います。
    何度もご回答ありがとうございます。

    キャンセル

0

おっと、、、ざっと見、ですが、'}'1つ多くありません???

if (!count($error_message)){
        //確認ページヘ
            header("Location:confirm.php");
            exit;
            } // <<<<これいらない?
        }


っと、インデントから判断しましたが、そうすると、最後に'}'が足らないのかな???

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

関連した質問

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

  • PHP

    20912questions

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