電子書籍の厳選無料作品が豊富!

PHPを独学で勉強しているものです、あるサイトを構築中で、入力内容のエラー判定をしたいのですが、どうしても半角英字がエラーではじかれず、どなたかご指導いただけますでしょうか。
PHPのバージョンは5.2で、DBはMySQLでユーザーがある情報を登録できるサイトで、データ型にあわせるため、1以上の半角数字のみ受け付けるようにしたいです。

入力欄は3か所で、$ic0、$ic1、$ic2に格納されています。
入力が全角数字の場合はそれぞれを半角数字に自動変換したいとおもっています。

自作したものは下記の通りです。
宜しくお願い致します。


/*エラー判定*/
$ic_check=$ic0.$ic1.$ic2;
if(preg_match("/^[0-9]+$/", $ic_check)){
if($ic0=="0" || $ic1=="0" || $ic2=="0"){
$error_msg="1以上の数字を入れてください。";
}else{
$error_msg="";
}
}
elseif(preg_match("/^[0-90-9]+$/",$ic_check)){
$ic0=mb_convert_kana($ic0, "n", "Shift_jis");
$ic1=mb_convert_kana($ic1, "n", "Shift_jis");
$ic2=mb_convert_kana($ic2, "n", "Shift_jis");

if($ic0=="0" || $ic1=="0" || $ic2=="0"){
$error_msg="1以上の数字を入れてください。";
}else{
$error_msg="";
}
}
elseif(preg_match("/^[a-zA-Z]+$/",$ic_check)){
$error_msg="半角数字で入力してください";
}
else{
$error_msg="半角数字で入力してください";
}

A 回答 (2件)

まず1点。

Shift_JISをやめてUTF-8(BOM無し推奨)にしましょう。

【UTF-8を使うメリット】

・UTF-8には接頭符号が用いられているので、マルチバイト非対応の関数でもマルチバイト文字列をそのまま扱うことが出来ます
http://www.softel.co.jp/blogs/tech/archives/525

・preg_match関数での文字クラスに関して、UTF-8であればu修飾子を使うだけで「バイト単位」ではなく「文字単位」で扱うことが出来ます。


【1以上を表す半角数字のみかどうか判定するif文】

今回は正規表現を使うまでも無いです。
http://php.net/manual/ja/function.ctype-digit.php

$str = mb_convert_kana($str, 'n', 'UTF-8');
if (!ctype_digit($str) || !$str) {
echo "1以上の数字で入力してください。";
} else {
echo "OK";
}

なお、ctype_digit関数のシグネチャをマニュアルで見ると第1引数$textは文字列でなければならないと書かれていますが、他の一般的な関数とは異なり、例外的にctype_***関数は文字列以外(配列など)を渡したときにもエラーを一切出さずにそのままFALSEを返してくれます。
    • good
    • 0
この回答へのお礼

ご親切に解説いただいたおかげさまでで解決できました。
ありがとうございます。ctype_digitは知識として得る事ができましたが、いまのところ、|| !$str の部分の意味がまだ理解できていないので、調べてみたいと思います。

いままで全てShift_JISでやってきましたので、UTF-8にかえるのは単純にプログラム内だけ置換すればよいのか、MySQLでつくったDBやPHPの環境まで全て統一しなくてはならないのかわかりませんが、それは別で質問することにいたします。(調べてから)

お礼日時:2013/10/18 01:46

文字列の比較に==演算子(半角イコール2つ)を使うのは論外


ほんとに"0"と比較するなら===(半角イコール3つ)を使うこと

また数字以外をはじくのであれば数字のチェックだけすれば十分
preg_match("/^[a-zA-Z]+$/",$ic_check)
のような処理は不要(a-z以外の全ての文字がエラーになるべきなので)
    • good
    • 0
この回答へのお礼

文字列の比較に==演算子(半角イコール2つ)はなぜいけないのでしょうか?プログラミングの学校でもらったテキストにはif文の練習で、
if( $weather=="雨")
{
echo "家の掃除をする";
}
とか書いてあり、そのまま覚えて今に至ります。
また、===と3つ使うケースがあることもはじめて知りましたので勉強してみたいと思います。
教えていただき、ありがとうございます。

お礼日時:2013/10/18 01:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!