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

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

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

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

Q&A

解決済

7回答

2963閲覧

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

ziyuu

総合スコア25

PHP

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

1グッド

2クリップ

投稿2016/09/16 00:51

###前提・実現したいこと
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/ツール等のバージョンなど)
ご教授よろしくお願いします。

nnahito👍を押しています

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

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

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

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

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

guest

回答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
yambejp

総合スコア114843

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

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

popobot

2016/09/16 01:10

自分も「生年月日をいれさせて年齢を計算するなどで対応するのが妥当です」これは一番いいと思います!
guest

0

ベストアンサー

emptyやissetは0をfalseと解釈しますからね...

php

1if($age !== 0 && $age !== '0' && empty($age)){

※$ageが文字列の可能性を考慮しています。なんかスマートじゃない...

投稿2016/09/16 01:01

popobot

総合スコア6586

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

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

0

0の入力を許容するのであれば、逆転の発想で未入力の場合は強制的に0にしてしまう、というアプローチもあります。

PHP

1//入力値を整数化することで、nullや空文字は0になる 2$age = intval($age);

当然、エラーメッセージも表示されなくなるのでそれを良しとするかにもよりますが…
(※フォーム送信時にチェックして警告を表示する手もあります)

余談ですが、以前引き継ぎで管理したシステムに年齢を直接入力する項目がありました。
ところがそのシステムを使い続けるうちに、現在は年齢が変わっているのに古い情報のまま更新されていない…という問題が起こっていました。
その時点での年齢が入っていればOKというのであれば構わないのですが、更新が必要なのであればその辺りもご注意を。

投稿2016/09/16 01:36

編集2016/09/16 01:42
KaedeKazane

総合スコア408

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

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

0

<th colspan="2">年齢</th> こっちの方に切り替えてはいかがですか? 世の中には100才以上を超えても元気な方もいらっしゃると言いますけど。 <td><select name="age"> <option value="">年齢を選択してください</option> <option value="18">18</option> <option value="19">19</option> <option value="20">20</option> <option value="21">21</option> <option value="22">22</option> <option value="23">23</option> <option value="24">24</option> <option value="25">25</option> <option value="26">26</option> <option value="27">27</option> <option value="28">28</option> <option value="29">29</option> <option value="30">30</option> <option value="31">31</option> <option value="32">32</option> <option value="33">33</option> <option value="34">34</option> <option value="35">35</option> <option value="36">36</option> <option value="37">37</option> <option value="38">38</option> <option value="39">39</option> <option value="40">40</option> <option value="41">41</option> <option value="42">42</option> <option value="43">43</option> <option value="44">44</option> <option value="45">45</option> <option value="46">46</option> <option value="47">47</option> <option value="48">48</option> <option value="49">49</option> <option value="50">50</option> <option value="51">51</option> <option value="52">52</option> <option value="53">53</option> <option value="54">54</option> <option value="55">55</option> <option value="56">56</option> <option value="57">57</option> <option value="58">58</option> <option value="59">59</option> <option value="60">60</option> </td>

投稿2016/09/20 04:42

rura

総合スコア70

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

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

0

皆様、回答ありがとうございました。
返事が遅くなり申し訳ございません。

icchiiさんの方法で無事に解決いたしました。

生年月日をもらうという方法も考えましたが、入力者様の情報ではなく、入力者様のご友人やご家族の年齢を入力いただくという所と複数人の年齢などを1つのフィールドでもらっているため難しいとなりました。

投稿時の少ない情報で様々な回答ありがとうございました。
勉強になりました。

投稿2016/09/16 11:11

ziyuu

総合スコア25

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

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

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
A.Ichi

総合スコア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
nnahito

総合スコア2004

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

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

popobot

2016/09/16 01:04

これだと空文字列でエラーにならないような
nnahito

2016/09/16 01:11

確かに! icchiiさんがif文で解決方法を載せられているので、私はこう改良しますか……
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問