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

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

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

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

Q&A

解決済

2回答

590閲覧

0を評価する条件式について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2019/08/31 00:43

編集2019/08/31 00:52

以下は、お問合せフォームより値を受け取った場合のバリデーション処理を作成しているコードになります。
疑問点としましては、フォームの年齢に、何も入力せず送信した場合に、「if($age != 0){」ここの部分がtrueにならない点です。
$ageの値は「0」でないにも関わらず、falseになってしまう理由が分かりません。

<?php $errors = []; $name = filter_input(INPUT_POST,'name'); // $age = filter_input(INPUT_POST,'age'); $age = filter_input(INPUT_POST,'age'); strval($age); if($age != 0){ echo __LINE__; if(!$age){ $errors[] = '年齢が入力されていません'; echo __LINE__; }else{ $age = mb_convert_kana($age,'n','UTF-8'); $age = filter_var($age, FILTER_VALIDATE_INT); var_dump($age); if(!$age){ $errors[] = '年齢は数字を入力してください'; echo __LINE__; } } }else{ echo __LINE__; } if(isset($_POST['color']) && is_array($_POST['color'])){ $color = $_POST['color']; }else{ $errors[] = 'チェックされていません'; } if(!$name){ $errors[] = '名前が入力されていません'; } ?>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>test</title> </head> <body> <form action="validation.php" method="post"> <p>名前:<input type="text" name="name"></p> <p>年齢:<input type="text" name="age"></p> <p> 好きな色: <input type="checkbox" name="color[]" value="red">赤 <input type="checkbox" name="color[]" value="blue">青 <input type="checkbox" name="color[]" value="green">緑 <input type="checkbox" name="color[]" value="other">その他 </p> <input type="submit" value="送信"> </form> </body> </html>

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

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

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

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

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

m.ts10806

2019/08/31 00:49

strval()の返り値とってないので何の効果も発揮してませんがこれは? また入力フォーム部分のhtmlもご提示ください。 あと「何をageに入力したのか」「どういうパターンを試してどういう結果になったのか」も具体的に記載してください
退会済みユーザー

退会済みユーザー

2019/08/31 00:55

strvalは使うか使わないかで迷っているんですよね... 取り敢えず、返り値の変数を付け忘れていたので、そこの部分修正しておきます
退会済みユーザー

退会済みユーザー

2019/08/31 00:57

文字列として受け取った方が操作しやすいかなと思ったのですが、もしかしたら、いらなかったかもしれないです...
m.ts10806

2019/08/31 01:14

formから送信される情報は何を入力しようと文字列です。 10と入力してもintの10ではなくStringの"10"が送られてきます。なので、不要です
guest

回答2

0

ベストアンサー

$ageの値は「0」でないにも関わらず、falseになってしまう理由が分かりません。

0に変換される値だからでは?

投稿2019/08/31 00:59

otn

総合スコア84498

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

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

退会済みユーザー

退会済みユーザー

2019/08/31 01:03 編集

ご回答ありがとうございます。 「「if($age != 0){」 こちらの前で、var_dump($age)とした結果、string型の空文字だったのですが、空文字がif文の評価の結果0に変換されているということでしょうか?
otn

2019/08/31 01:16

そうです。そのあたりは、PHPの基本なので、復習してください。これを知らずにプログラムを書くのは厳しいです。 文字列と数値の比較は、文字列を数値に変換してから行われます。 "" や "ABC" などは0に変換されます。 変換しないで比較したい場合は、=== とか !== の演算子を使いますが、この場合は全く変換されませんので、"0" と 0 も異なります。
退会済みユーザー

退会済みユーザー

2019/08/31 01:20

空文字なども含め、文字列と数値を比較する場合は、0に変換されるのですね... if文の型が違う場合の比較など、もう一度復習したいと思います。
guest

0

if文は式の結果をtrue/falseで判定します。

論理型Boolean

boolean に変換する場合、次の値は FALSE とみなされます。
boolean の FALSE
integer の 0 (ゼロ)
float の 0.0 (ゼロ)
空の文字列、 および文字列の "0"
要素の数がゼロである 配列
特別な値 NULL (値がセットされていない変数を含む)
空のタグから作成された SimpleXML オブジェクト

空文字はfalseです。
0もfalse
本来==の関係なので!=の結果はfalse

入力チェックしたいのでしたらemptyでじゅうぶんかと思います。
filter_intput使われてるのならnullとemptyのチェックですね。

ただ、数値チェックならfilter_intput第三引数にint型の検証フィルタがあるので、そちらも利用されてはと。

投稿2019/08/31 01:02

編集2019/08/31 01:08
m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2019/08/31 01:15

ご回答ありがとうございます。 >本来==の関係なので!=の結果はfalse ここの部分なのですが、「if($age != '0'){」このようにしたら、条件式はtrueになりました。 文字列の0もfalseになるのだったら、この条件もfalseになるのではないかなと思ったものでして...
m.ts10806

2019/08/31 01:26

なるほど、そこはPHPの仕様部分ですね。ドキュメントのどの部分にあらわれてるかは確認しておいてください。 ただ、回答的には前半部分より後半部分のほうが大事です。何を参考に作ったのか知らないですがその参考先は捨ててください。filter_intputはリクエストを取得するためにあるのではなくあくまで主たる目的はfilterです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問