###前提・実現したいこと
PHPで「0」を入力された時にエラーを出なくしたい。
###発生している問題
フォームの必須項目として年齢を取得しています。
次記のコードで空だった場合エラーを表示するようにしてました。
お客様からの指摘で「0」を入力するとエラーが出て進めないと言われました。
###該当のソースコード
PHP
1if(empty($age)){ 2 $error = true; 3 $err_msg['age'] = '「年齢」は必ずご入力ください'; 4} else { 5 $err_msg['age'] = ''; 6} 7
###試したこと
!issetを試した所、「0」でエラーが出なくなりましたが、空の場合でもエラーが出なくなりました。
###補足情報(言語/FW/ツール等のバージョンなど)
ご教授よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
emptyは0も""も"0"もすべて空と判断します
こちらを参考にしてください
たとえば、こんなふうにしてみてください
//0を除くempty if($age!==0 and empty($age)){print "ok";} //""と厳密な比較 if($age===""){print "ok";}
あとはnullはどうするとか、未定義はどうするとか、
文字列やマイナスや小数点だったらどうするとかバリデートを検討してください。
またUIの方で直接入力をやめさせセレクトボックスで年齢をいれたり
生年月日をいれさせて年齢を計算するなどで対応するのが妥当です
追記
一応、バリデートの方法も提示しておきます。
ユーザーから送られてくる$_GET["age"]について以下条件
- 0から200までの整数とする
- それ以外の値はdefaultのnullとする
PHP
1<?PHP 2$age=filter_input(INPUT_GET,'age',FILTER_VALIDATE_INT,["options"=>["min_range"=>0,"max_range"=>200,"default"=>null]]); 3print "戻り値:"; 4var_dump($age); 5?> 6<hr> 7<form method="get"> 8小数点:<input type="text" name="age" value="10.1"> 9<input type="submit" value="go"> 10</form> 11<form method="get"> 12マイナス:<input type="text" name="age" value="-1"> 13<input type="submit" value="go"> 14</form> 15<form method="get"> 16空文字:<input type="text" name="age" value=""> 17<input type="submit" value="go"> 18</form> 19<form method="get"> 20文字列:<input type="text" name="age" value="abc"> 21<input type="submit" value="go"> 22</form> 23<form method="get"> 24OKな数字:<input type="text" name="age" value="20"> 25<input type="submit" value="go"> 26</form> 27<form method="get"> 280:<input type="text" name="age" value="0"> 29<input type="submit" value="go"> 30</form> 31<form method="get"> 32上限over:<input type="text" name="age" value="300"> 33<input type="submit" value="go"> 34</form> 35
こうすれば、is_null($age)のみでチェックできます
投稿2016/09/16 01:05
編集2016/09/16 01:34総合スコア114843
0
0の入力を許容するのであれば、逆転の発想で未入力の場合は強制的に0にしてしまう、というアプローチもあります。
PHP
1//入力値を整数化することで、nullや空文字は0になる 2$age = intval($age);
当然、エラーメッセージも表示されなくなるのでそれを良しとするかにもよりますが…
(※フォーム送信時にチェックして警告を表示する手もあります)
余談ですが、以前引き継ぎで管理したシステムに年齢を直接入力する項目がありました。
ところがそのシステムを使い続けるうちに、現在は年齢が変わっているのに古い情報のまま更新されていない…という問題が起こっていました。
その時点での年齢が入っていればOKというのであれば構わないのですが、更新が必要なのであればその辺りもご注意を。
投稿2016/09/16 01:36
編集2016/09/16 01:42総合スコア408
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
投稿2016/09/20 04:42
総合スコア70
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
参加
php
1if (is_int($age) && is_numeric($age)) echo "OK\n";
(※)文字数字は'0'はFALSE
文字列数字対応
php
1if (ctype_digit((string)$age)) echo "OK\n";
投稿2016/09/16 01:49
編集2016/09/16 02:24総合スコア4070
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
0歳の回答者……w
単純に、
PHP
1if($age < 0){ 2 $error = true; 3 $err_msg['age'] = '「年齢」は必ずご入力ください'; 4} else { 5 $err_msg['age'] = ''; 6}
とかではダメですか?
改良版
lang
1// エラーに持って行きたいもの 2if ( $age === "" || $age === null ){ 3 $age = -1; 4} 5 6if($age < 0){ 7 $error = true; 8 $err_msg['age'] = '「年齢」は必ずご入力ください'; 9} else { 10 $err_msg['age'] = ''; 11}
アカン・・・ブサイクすぎる
投稿2016/09/16 00:55
編集2016/09/16 01:12総合スコア2004
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/16 01:10