下記コードですが、
「数字以外が含まれています。」と表示されるはずなのに「数字です。」と表示されてしまいます。どこがおかしいかお分かりの方おられますか?
$num1 ="123";
$num2 ="a";
$num3 ="123";
if($num1 != "" or $num2 != "" or $num3 != "") {
if($num1 == "" or $num2 == "" or $num3 == "") {
if(!ereg("^[0-9]+$", $num1) or !ereg("^[0-9]+$", $num2) or !ereg("^[0-9]+$", $num3)) {
print "数字以外が含まれています。\n";
}
}
} else {
print "数字です。\n";
}
No.3ベストアンサー
- 回答日時:
失礼、回答書いてる間にロジック書かれてますな^^;
>1)まず、この電話番号入力欄は入力しても空欄でもよい。
>2)ただし、$num1、 $num2又は$num3の一つにでも入力した場合は、他の二つにも(たとえば、$num1に入力した場合には$num2及び$num3にも)必ず入力しなければならない。
>3)$num4は空欄でも入力しても良いが、$num4を入力する場合は必ずnum1、 $num2及び$num3が入力されている必要がある。
>4)num1、 $num2、$num3及び$num4に入力がある場合は、数字のみ可能。
まず
$num1,$num2,$num3
と
$num4
で分けて考えるべきです。
// 読んだ限り、1,2,3と4の間に関係は無さそうですね。
$num4に関してはis_numeric()を一回噛ませばそれで終わりです。
if(!is_numeric($num4))
echo "error";
1,2,3の連携ですが、方法はいろいろあります。
正直にやるならば
$num1を検査
→NGならエラー
→OKなら$num2を検査
→NGならエラー
→OKなら$num3を検査
→NGならエラー
→OKなら正常処理
でよいです。こうすると「全て正常値のときのみ正常処理」されることになります。
が、コードを見ると入れ子だらけで美しくないので、
$ret1 = true;
$ret2 = true;
$ret3 = true;
if( ! is_numeric($num1))
$ret1 = false;
if( ! is_numeric($num2))
$ret2 = false;
if( ! is_numeric($num3))
$ret3 = false;
if($ret1 and $ret2 and $ret3)
echo "正常";
else
echo "error";
とすると良いです。
この場合は前述の「横着」とは意味合いが違い、
「フラグを使用した手法」となります。
この回答への補足
wp_さん
ご回答ありがとうございました。
>読んだ限り、1,2,3と4の間に関係は無さそうですね。
1,2,3と4の間に関係はあります。
関係は以下です。
3)$num4は空欄でも入力しても良いが、$num4を入力する場合は必ずnum1、 $num2及び$num3が入力されている必要がある。
つまり、
この場合、「echo "error」としたい。
$num1 = 空欄
$num2 = 空欄
$num3 = 空欄
$num4 = 101
wp_さん
>$num1,$num2,$num3
>と
>$num4
>で分けて考えるべきです。
$num1,$num2,$num3と$num4の判定結果「echo "正常";」又は「echo "error";」は、ばらばらに出力せずに一まとめにしたいのですが。
つまり下記の条件を一まとめにして
>1)まず、この電話番号入力欄は入力しても空欄でもよい。
>2)ただし、$num1、 $num2又は$num3の一つにでも入力した場合は、他の二つにも(たとえば、$num1に入力した場合には$num2及び$num3にも)必ず入力しなければならない。
>3)$num4は空欄でも入力しても良いが、$num4を入力する場合は必ずnum1、 $num2及び$num3が入力されている必要がある。
>4)num1、 $num2、$num3及び$num4に入力がある場合は、数字のみ可能。
一度だけ、「echo "正常";」又は「echo "error";」を出力したいわけです。(num1,$num2,$num3で、「echo "正常";」又は「echo "error";」の判定結果を出力、そして、別途、$num4で、「echo "正常";」又は「echo "error";」の判定結果を出力とはしたくないわけです。)
No.2
- 回答日時:
まず「何をしようとしたのか」書きましょう。
分かる人がみたら「そりゃ当然だ」で一蹴されて終わりです。
>$num1 ="123";
>$num2 ="a";
>$num3 ="123";
上記三つの変数を数字か否か検査したい、と邪推しますが
その場合はきちんとロジックを三つに分けましょう。
>if($num1 != "" or $num2 != "" or $num3 != "") {
こちらはいわゆる「横着」なやり方で、バグの温床になります。
出来れば共通部分を関数化したほうが良いでしょう。
三つ同時に検査する必要がある、というのであればまずはロジックをデータフロー図に落とすところから始めましょう。
Wikipedia データフロー図
http://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC% …
幸いに、「数字か否か」のチェックはPHPの既存の関数でis_numeric()というものがあります。
こちらを使った方が見やすく かつ 早いです。
// それぞれ検査
$num1 ="123";
$num2 ="a";
$num3 ="123";
if(is_numeric($num1))
echo "num1は数字でした。";
if(is_numeric($num2))
echo "num2は数字でした。";
if(is_numeric($num3))
echo "num3は数字でした。";
// 三つ絡んだ検査
(snip)
$ret = false;
if( ! is_numeric($num1))
$ret = true;
if( ! is_numeric($num2))
$ret = true;
if( ! is_numeric($num3))
$ret = true;
if($ret)
echo "数字以外を検出したっす";
参考URL:http://jp2.php.net/is_numeric
この回答への補足
wp_さん
ご回答ありがとうございました。
>まず「何をしようとしたのか」書きましょう。
himajin100000の回答への補足にこちらがやりたいことを細かく記載しましたので参考にしてください。私のコードも書きました(ちゃんと動きません)。
>上記三つの変数を数字か否か検査したい、と邪推しますが
それもありますが、もう少し複雑です。
No.1
- 回答日時:
#!C:/Environment/PHP/v5.2.4/php-cgi.exe
<?php
$num1 ="123";
$num2 ="a";
$num3 ="123";
if($num1 != "" or $num2 != "" or $num3 != "") {
/*
そもそもこれが間違い、って話じゃなくって?
if($num1 == "" or $num2 == "" or $num3 == "") {
これがあったときに通る条件って
「一つ以上空文字列でない変数が存在する」かつ,「空文字列である変数が一つ以上ある」だよ?
*/
if(!ereg("^[0-9]+$", $num1) or !ereg("^[0-9]+$", $num2) or !ereg("^[0-9]+$", $num3)) {
print "数字以外が含まれています。\n";
}
else {
/* 多分これが意図だろうと思って内側に持ってきた */
print "数字です。\n";
}
}
?>
この回答への補足
himajin100000さん
ご回答ありがとうございました。
そもそもnumには電話番号が入ります。
$num1は市外局番、 $num2は市内局番、 $num3はお客様番号 ついでに$num4は内線番号としたい。
それでどのような判定を正規表現でしたいかというと
1)まず、この電話番号入力欄は入力しても空欄でもよい。
2)ただし、$num1、 $num2又は$num3の一つにでも入力した場合は、他の二つにも(たとえば、$num1に入力した場合には$num2及び$num3にも)必ず入力しなければならない。
3)$num4は空欄でも入力しても良いが、$num4を入力する場合は必ずnum1、 $num2及び$num3が入力されている必要がある。
4)num1、 $num2、$num3及び$num4に入力がある場合は、数字のみ可能。
これってどのようなコードになるのでしょうか?
ちなみに私が考えているコードを書いときますが、数字以外でも入力できてしまいます。入力がある場合は、数字しか入力できないようにしているはずなのに...
*$numの表現を$telに変更しています。
<?php
if($tel1 != "" or $tel2 != "" or $tel3 != "") {
if($tel1 == "" or $tel2 == "" or $tel3 == "") {
if(!ereg("^[0-9]+$", $tel1) or !ereg("^[0-9]+$", $tel2) or !ereg("^[0-9]+$", $tel3) or !ereg("^([0-9]+|\t)$", $tel4)) {
echo '電話番号不正確';
}
}
}else{
echo '電話番号正確';
}
?>
以下は、目指す表示結果です。
この場合、「電話番号不正確」としたい。
$tel1 = 123
$tel2 = 空欄
$tel3 = 789
$tel4 = 空欄
この場合、「電話番号不正確」としたい。
$tel1 = a
$tel2 = 456
$tel3 = 789
$tel4 = 空欄
この場合、「電話番号不正確」としたい。
$tel1 = 空欄
$tel2 = 空欄
$tel3 = 空欄
$tel4 = 101
この場合、「電話番号不正確」としたい。
$tel1 = 123
$tel2 = 456
$tel3 = 789
$tel4 = a
この場合、「電話番号正確」としたい。
$tel1 = 123
$tel2 = 456
$tel3 = 789
$tel4 = 空欄
この場合、「電話番号正確」としたい。
$tel1 = 123
$tel2 = 456
$tel3 = 789
$tel4 = 101
この場合、「電話番号正確」としたい。
$tel1 = 空欄
$tel2 = 空欄
$tel3 = 空欄
$tel4 = 空欄
どなたかお分かりの方がおられましたら、コードを修正するかコードを教えて下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- PHP カラーミーショップのSmartyでの文字列抜き出し 2 2022/05/06 11:51
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
switch()文で値の大小比較
-
バッチファイルでpingの結果を...
-
phpでcookieがうまく保存されない
-
フォームから送った半角カナの...
-
動的なPHPを静的なhtmlページに...
-
batファイルでPC名称の変更
-
データベースから出力したデー...
-
オブジェクトの中身の判定(PHP)
-
syntax error, unexpected 'ech...
-
eとは?
-
ダブルクウォートやヒアドキュ...
-
ifのなかを実行したいのですが...
-
bashの関数の引数にスペースが...
-
PHP form action 次のページ...
-
ゼロとNULLを区別して number_f...
-
PHP 正規表現 数字又は数字以...
-
echoの区切り方(コンマ又はピ...
-
バッチファイルで、全てのウィ...
-
DBのハッシュ化したパスワード...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
バッチファイルでpingの結果を...
-
shシェルスクリプト 空白行の...
-
switch()文で値の大小比較
-
findstrのerrorlevel
-
syntax error, unexpected 'ech...
-
phpでcookieがうまく保存されない
-
小数点以下0の非表示
-
バッチファイルで、全てのウィ...
-
ゼロとNULLを区別して number_f...
-
Windowsのsetコマンドでの小数...
-
オブジェクトの中身の判定(PHP)
-
DBのハッシュ化したパスワード...
-
XMLのタグの有無をPHPで判定し...
-
pdftkを使った処理をバッチファ...
-
batファイルでPC名称の変更
-
変数の中の<br>を消したい
-
csvの特定のキーワードを指定し...
-
bashの関数の引数にスペースが...
-
環境変数「%USERPROFILE%」の内...
おすすめ情報