再びif文での値のチェックの仕方を教えてください - PHPプロ!Q&A掲示板

418

  • 0P

再びif文での値のチェックの仕方を教えてください

質問日時 / 2007年3月16日 14:23    回答数 / 4件

Questioner:  szkmkt  このエントリーをはてなブックマークに追加 

キーワード / form    正規表現   

先日、質問いたしました内容の追加ですが、改めて質問させていただきます。
よろしくお願いいたします。

htmlで時間を入力させるための入力フォームを作成しました。

if ( !is_numeric($tswork)) {エラー処理} 

これで、数値以外の入力がなされた場合に、エラー処理を行うことに成功したのですが、
それが送信されるpostgreSQLの型は、numeric(4,2)となっています。
これは、小数点2桁までを含む、合計4桁の数字という型なので、
133.1や、1.111という値を受け取ってくれません。

そこで、22.22や、2.2(2.20DBにはと登録される)など、DBの型にマッチするような
条件文を作るにはどうすればよいでしょうか?
あとはそれに!をもってこれば、上記のif文の理想的な条件式がつくれるのですが。

どうかよろしくお願いいたします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01weekendphpそのような特殊な判定が必要な場合は、pregやeregなど
 ┗A01-1szkmkt丁寧なご返答ありがとうございます。 正規表現は難し
  ┗A01-1-1weekendphp>>CODE if (preg_match('/^[0-9]{1,2}(\.[0-9]{1,2})
   ┗A01-1-1-1szkmktありがとうございます、大変参考になりました。 上記

回答一覧

並び替え:

A01 参考になった
answererweekendphp [3月16日 15:16] (最終編集:3月16日 15:28)

そのような特殊な判定が必要な場合は、pregやeregなどの
正規表現を使って判定するのがいいかと思います。

たとえば、下記のようなコードでは
「1~2桁の数字(+"."+1~2桁の数字)」が TRUE になります。

  1. $test = "133.1";
  2.  
  3. if (preg_match('/^[0-9]{1,2}(\.[0-9]{1,2})?$/', $test) === 1) {
  4.     echo "入力は有効です:$test";
  5. } else {
  6.     echo "入力は不正です:$test";
  7. }

結果は以下のようになります。

入力は不正です:133.1
入力は不正です:1.111
入力は不正です:
入力は不正です:.1
入力は有効です:22.22
入力は有効です:2.2
入力は有効です:1

参考になれば幸いです。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerszkmkt [3月16日 16:54]

丁寧なご返答ありがとうございます。
正規表現は難しいですね^^;
作成していただいたプログラムを実際に動かしてみたところ、
記述どおりの結果が得られました。ありがとうございます。
しかし、早速下記のように!をつけて動かしてみたのですが、

  1. if ( !preg_match('/^[0-9]{1,2}(\.[0-9]{1,2})?$/', $tswork) === 1 )  {エラー処理}

今度は判定してくれなくなりました。
!をつけて、もしも条件文が偽ならばというようにしたいのですが、
何がおかしいのでしょうか?

また、

=== 1 

という記述について、これが何を意味するのか説明していただけませんでしょうか?
どうぞよろしくお願いいたします。

この意見に回答する

ツリーへ TOPへ

A01-1-1 参考になった
replyerweekendphp [3月16日 17:20] (最終編集:3月16日 17:30)

  1. if (preg_match('/^[0-9]{1,2}(\.[0-9]{1,2})?$/', $tswork) == 0) {エラー処理}
でうまくいくかと思われます。

最初に!をつけたいなら、
  1. if ( !(preg_match('/^[0-9]{1,2}(\.[0-9]{1,2})?$/', $tswork) === 1) )  {エラー処理}

とすることで、うまくいくと思います。(実際にテストしていませんが)

!は否定の論理演算子ですが、今回の場合、括弧をつけないと、
  preg_match('/^[0-9]{1,2}(\.[0-9]{1,2})?$/', $tswork
の結果に対して否定を行い、その後、値が「1」であればTRUEと判断されます。(たぶん。。。)

これですと、ほしい動作にならないため、
  preg_match('/^[0-9]{1,2}(\.[0-9]{1,2})?$/', $tswork) === 1
の結果(TRUE/FALSE)に対して、否定をするように括弧を使います。


==と===の違いですが、==を使うと「値」が同等かどうかを判断しますが、
===にすることで、値だけではなく「型」が同じかどうかも
チェックされるようになります。

前回のレスの文では、==でも===でも同じ挙動をするので、どっちでも
問題ありません。


が、今回の初めの文では、挙動が違うので注意が必要です。

というのも、preg_matchの返り値を確認すると、
下記のいずれかの値が返ってくるようになっています。
  0  :マッチしない(int型)
  1  :マッチした(int型)
  FALSE:エラーが発生した(bool型)
http://www.php.net/manual/ja/function.preg-match.php

  1. if (preg_match('/^[0-9]{1,2}(\.[0-9]{1,2})?$/', $tswork) == 0) {エラー処理}
ご存知かも知れませんが、型チェックをしない場合、FALSEは「0」と同等として
扱われるため、エラーが発生した(返り値がFALSE)場合、
エラー処理に進みます。

そして、マッチしなかった(返り値が0)場合も、もちろんエラー処理に進みます。

ですが、
  1. if (preg_match('/^[0-9]{1,2}(\.[0-9]{1,2})?$/', $tswork) === 0) {エラー処理}
の場合は、マッチしなかった(返り値が0)場合はエラー処理に進みますが、
エラーが発生した(返り値がFALSE)場合は、型が異なるため
エラー処理に進みません。

あまりPHPでは型という考えを意識する機会が少ないのですが、
自動的にPHPが内部的に変更や解釈をしているだけなので、
型の存在を意識していないと、場合によってはバグなどに
つながるため、勉強してみるといいかもしれません。

PHPマニュアルもご参照ください。
http://www.php.net/manual/ja/language.operators.comparison.php

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerszkmkt [3月19日 13:08]

ありがとうございます、大変参考になりました。
上記の例文をみながら、正規表現について勉強したいと思います。
本当にありがとうございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)