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

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

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

Q&A

解決済

4回答

2483閲覧

アンケートフォームのバリデーションについて

penginer

総合スコア32

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

0グッド

0クリップ

投稿2017/08/12 14:33

編集2017/08/12 15:01

###前提・実現したいこと
アンケートフォームを作り、
同じページでエラーの確認をしてから
確認画面を開く→送信
ということをしようとしています。

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

NoticeやWarning等のエラーメッセージは出ないですが、 バリデーションによるエラーメッセージが出ない状況です。

###該当のソースコード

PHP

1<?php 2session_start(); 3$errors = array(); 4$gender = ""; 5$attribute = ""; 6$attribute_custom = ""; 7$age10 = ""; 8$age1 = ""; 9$like = ""; 10 11 12 13 14 15if (isset($_POST["submit"]) && $_POST["submit"] === "確認する") { 16 $gender = $_POST['gender']; 17 $attribute = $_POST['attribute']; 18 $age10 = $_POST['age10']; 19 $age1 = $_POST['age1']; 20 $like = $_POST['like']; 21 if ($gender === "") { 22 $errors['gender'] = "性別が入力されていません。"; 23 } elseif (($gender !== "m") && ($gender !== "f") && ($gender !== "X")) { 24 $errors['gender'] = "不正なPOSTです。"; 25 } 26 27 if ($attribute === "") { 28 $errors['attribute'] = "属性が入力されていません。"; 29 } elseif (htmlspecialchars(ctype_digit(strval($attribute)), ENT_QUOTES) == false) { 30 $errors['attribute'] = "不正なPOSTです。"; 31 } elseif (intval($attribute) > 21) { 32 $errors['attribute'] = "不正なPOSTです。"; 33 } 34if (intval($attribute) == 21) { 35$attribute_custom = $_POST['attribute_custom']; 36} 37 if (($attribute_custom == "") && (intval($attribute) == 21)) { 38 $errors['attribute_custom'] = "属性が入力されていません。"; 39 } 40 if (preg_replace("/^( \n)|( \n)$/", "", $attribute_custom) == false) { 41 $errors['attribute_custom'] = "属性が入力されていません。"; 42 } else { 43 $attribute_custom = htmlspecialchars(($attribute_custom), ENT_QUOTES); 44 } 45 46 47 if ($age10 === "") { 48 $errors['age10'] = "年齢(10の位)が入力されていません。"; 49 } elseif (htmlspecialchars(ctype_digit(strval($age10)), ENT_QUOTES) == false) { 50 $errors['age10'] = "不正なPOSTです。"; 51 } elseif (intval($age10) > 10) { 52 $errors['age10'] = "不正なPOSTです。"; 53 } 54 55 if ($age1 === "") { 56 $errors['age1'] = "年齢(1の位)が入力されていません。"; 57 } else { 58 if (htmlspecialchars(ctype_digit(strval($age1)), ENT_QUOTES) == false) { 59 $errors['age1'] = "不正なPOSTです。"; 60 } else { 61 if (intval($age1) > 9) { 62 $errors['age1'] = "不正なPOSTです。"; 63 } 64 } 65 } 66 67 if ($like === "") { 68 $errors['like'] = "○○が入力されていません。"; 69 } elseif (htmlspecialchars(ctype_digit(strval($like)), ENT_QUOTES) == false) { 70 $errors['like'] = "不正なPOSTです。"; 71 } elseif (intval($like) > 5) { 72 $errors['like'] = "不正なPOSTです。"; 73 } 74 75 if (!count($error)) { 76 $_SESSION = $_POST; 77 header("Location: ./check-att.php"); 78 exit(); 79 }else {echo "<ul>"; 80 81 echo "<li>"; 82 echo $errors['gender']; 83 echo "</li>"; 84 echo "<li>"; 85 echo $errors['attribute']; 86 echo "</li>"; 87 echo "<li>"; 88 echo $errors['attribute_custom']; 89 echo "</li>"; 90 echo "<li>"; 91 echo $errors['age10']; 92 echo "</li>"; 93 echo "<li>"; 94 echo $errors['age1']; 95 echo "</li>"; 96 echo "<li>"; 97 echo $errors['like']; 98 echo "</li>"; 99 echo "</ul>";} 100} 101 102?>

HTML

1 <form action="" method="post" autocomplete="off"> 2性別 3 <input type="radio" name="gender" value="m" id="m"><label for="m">男性</label> 4 <input type="radio" name="gender" value="f" id="f"><label for="f">女性</label> 5 <input type="radio" name="gender" value="X" id="X"><label for="X">その他</label> 6属性 7 <input type="checkbox" name="attribute" value="1" id="1"><label for="1">1</label><br><br> 8 <input type="checkbox" name="attribute" value="2" id="2"><label for="2">2</label><br><br> 9 <input type="checkbox" name="attribute" value="3" id="3"><label for="3">3</label><br><br> 10 //同じようなコード 11 <input type="checkbox" name="attribute" value="21" id="21"><label for="21">21/label><br><br> 12 <input type="checkbox" name="attribute" value="22" id="other"><label for="other">その他</label><br><br> 13<input type="text" name="attribute_custom" placeholder="カスタム" value="" id="attribute-custom"> 14//その他を押すとテキストの欄が開き、その他以外の欄は無効になります 15年齢 16 <select name="age10" required> 17 <option value="0">0</option> 18 <option value="1">1</option> 19 <option value="2">2</option> 20 <option value="3">3</option> 21 <option value="4">4</option> 22 <option value="5">5</option> 23 <option value="6">6</option> 24 <option value="7">7</option> 25 <option value="8">8</option> 26 <option value="9">9</option> 27 <option value="10">10</option> 28 </select> 29 30 <select name="age1" required> 31 <option value="0">0</option> 32 <option value="1">1</option> 33 <option value="2">2</option> 34 <option value="3">3</option> 35 <option value="4">4</option> 36 <option value="5">5</option> 37 <option value="6">6</option> 38 <option value="7">7</option> 39 <option value="8">8</option> 40 <option value="9">9</option></select><br> 41選択式質問 42 <input type="radio" name="like" value="0"><label>0</label> 43 <input type="radio" name="like" value="1"><label>1</label> 44 <input type="radio" name="like" value="2"><label>2</label><br> 45 <input type="radio" name="like" value="3"><label>3</label> 46 <input type="radio" name="like" value="4"><label>4</label> 47 <input type="radio" name="like" value="5"><label>5</label></p> 48

###試したこと
出来る限りは調べて実践したのですが、
どれを参考にしても無理でした。

###補足情報(言語/FW/ツール等のバージョンなど)
エディタ:Atom 1.18.0

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2017/08/12 14:40

form要素がありませんが、どのようにしてPHPに値を送っていますか?また、サーバは何を使用していますか?
penginer

2017/08/12 14:43

フォームは <form action="" method="post" autocomplete="off">となっており、PHPにあるように、正しければリダイレクトされます。また、サーバーは最新版のXAMPPのApacheとMySQLを使います
kei344

2017/08/12 14:49

この「質問への追記・修正の依頼」の部分はデフォルトで表示されませんので、質問本文を編集することをお勧めします。
guest

回答4

0

ベストアンサー

下記をコードの先頭(session_start();の前)に追記してください。

PHP

1//エラー出力強制 2ini_set( 'display_errors', 1 ); // エラーを画面に表示(1を0にすると画面上にはエラーは出ない) 3//すべてのエラー表示 4error_reporting( E_ALL );

それに続けて下記を記述し、値が入っているかを確認してみてください。

PHP

1var_dump( $_POST );

上記でエラーもPOST内容も表示されない場合は、PHPとして動いていない可能性があります。
そのページのURLが「file:」になっていたりしませんか?

投稿2017/08/13 07:26

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

penginer

2017/08/13 08:11

御返答ありがとうございます。 その結果、以下のようになりましたが、 どこにもこのような文はなく、 あまり知識がないことも有り、 分からない状況です。 また、ファイルはXAMPPで動かしており、 URLの形式にはなっています。 array(6) { ["gender"]=> string(0) "" ["attribute_custom"]=> string(0) "" ["age10"]=> string(0) "" ["age1"]=> string(0) "" ["like"]=> string(0) "" ["attribute_submit"]=> string(12) "確認する" }
kei344

2017/08/13 08:19

> どこにもこのような文はなく、 var_dumpが何かがわからないのでしょうか。変数の中身を出力するものです。 【PHPを学ぶ時、最初に憶えて欲しいvar_dump | Simple Colors】 http://www.warna.info/archives/1105/ 質問文に提示されていない「確認する」ボタンのnameが「attribute_submit」なので、 if (isset($_POST["attribute_submit"]) && $_POST["attribute_submit"] === "確認する") { に直したらとりあえず一歩進みます。
penginer

2017/08/13 11:31

直しましたが無理でした…
kei344

2017/08/13 11:54

「無理」とはなんでしょう。値が取れていないのを無視していたら何も解決しませんよ。 提示された var_dump( $_POST ); からそもそも最初の if文から躓いていたことがわかったのであれば、次は残りの if文が自身の想定どおりの値を受け取れているか、その際に正しく配列に値が入っているかなどを一つ一つ検証してください。 tomari_performさんの書かれているように header や exit はコメントアウトしておいたほうが良いでしょう。
guest

0

パッと見、動きそうなんですけどね。
以下のように変更したりして、原因を追究するのが良いと思います。

php

1if (!count($error)) { 2echo "count:".count($error); 3// $_SESSION = $_POST; 4// header("Location: ./check-att.php"); 5// exit(); 6} 7else 8{ 9print_r( $errors ); 10// echo "<ul>"; 11// echo "<li>"; 12// echo $errors['gender']; 13// echo "</li>"; 14// echo "<li>"; 15// echo $errors['attribute']; 16// echo "</li>"; 17// echo "<li>"; 18// echo $errors['attribute_custom']; 19// echo "</li>"; 20// echo "<li>"; 21// echo $errors['age10']; 22// echo "</li>"; 23// echo "<li>"; 24// echo $errors['age1']; 25// echo "</li>"; 26// echo "<li>"; 27// echo $errors['like']; 28// echo "</li>"; 29// echo "</ul>"; 30}

⇒count:0が表示される場合、$errorsを設定する場所を確かめます。
count:1以上が表示される場合、if文を見直します。
上記以外の場合、foreach( $errors as $key => $val )で出力してみるとかとか。

投稿2017/08/13 04:57

tomari_perform

総合スコア760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

penginer

2017/08/13 05:33

御返答ありがとうございます。 countでやったものの、 何も表示されず、 foreachを使っても 何も表示されませんでした…
tomari_perform

2017/08/13 12:06

そもそもPHPが動いてないという事ですかね。 formのactionを見直してみてください。
tomari_perform

2017/08/13 12:37 編集

あと見直す内容としては、そもそもPHPが動く環境課どうかも確認した方が良いかもですね。 <?php phpinfo(); ?> だけのファイルを作成して、このファイルにブラウザでアクセスして、表示されますか?
penginer

2017/08/13 13:51

表示されますので、 PHPは動いています。
tomari_perform

2017/08/13 14:10

あとは、</form>がないとか、変な入れ子になってるとか。
guest

0

エラー情報を格納する$errors変数が、肝心なところで

if (!count($error)) {

と誤記してしまっているので、これが原因ではないかと思います。

また、提示されたソースには送信ボタンがありませんでしたが、

if (isset($_POST["submit"]) && $_POST["submit"] === "確認する") {

という分岐があるので、submitボタンは

<input type="submit" name="submit" value="確認する">

のようになっていないと動きません。

投稿2017/08/12 16:03

編集2017/08/13 07:18
tsuemura

総合スコア663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

penginer

2017/08/13 04:26

返答ありがとうございます。 とりあえず()の中を (count($errors) === 0) にしましたが 結果は変わりません…。
guest

0

とりあえず、気になった点として、

if (!count($error)) {

$error という名前の配列に値が代入されていないようです。そのため、常にリダイレクトされているのではないでしょうか。

投稿2017/08/12 16:00

CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

penginer

2017/08/13 04:26

返答ありがとうございます。 とりあえず()の中を (count($errors) === 0) にしましたが 結果は変わりません…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問