
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="半角数字で入力してください";
}
No.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を返してくれます。
ご親切に解説いただいたおかげさまでで解決できました。
ありがとうございます。ctype_digitは知識として得る事ができましたが、いまのところ、|| !$str の部分の意味がまだ理解できていないので、調べてみたいと思います。
いままで全てShift_JISでやってきましたので、UTF-8にかえるのは単純にプログラム内だけ置換すればよいのか、MySQLでつくったDBやPHPの環境まで全て統一しなくてはならないのかわかりませんが、それは別で質問することにいたします。(調べてから)
No.1
- 回答日時:
文字列の比較に==演算子(半角イコール2つ)を使うのは論外
ほんとに"0"と比較するなら===(半角イコール3つ)を使うこと
また数字以外をはじくのであれば数字のチェックだけすれば十分
preg_match("/^[a-zA-Z]+$/",$ic_check)
のような処理は不要(a-z以外の全ての文字がエラーになるべきなので)
文字列の比較に==演算子(半角イコール2つ)はなぜいけないのでしょうか?プログラミングの学校でもらったテキストにはif文の練習で、
if( $weather=="雨")
{
echo "家の掃除をする";
}
とか書いてあり、そのまま覚えて今に至ります。
また、===と3つ使うケースがあることもはじめて知りましたので勉強してみたいと思います。
教えていただき、ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 工学 下の回路図について教えてほしいです。 L>CR^2とし、電源の角周波数はωとする (1)電流Ic、I 1 2023/05/30 23:04
- その他(交通機関・地図) 高速道路の料金の調べ方 1 2023/06/19 20:02
- 電車・路線・地下鉄 電車の乗車降車についての質問です。 電車に乗る時は駅にある自動改札機をicカートで通るんですが降りる 6 2022/04/13 09:58
- 新幹線 鉄道(東海道新幹線)に詳しい方に質問です。 今度スマートEXで予約した新幹線に乗車するのですが、IC 2 2023/06/08 21:05
- JavaScript javascriptで入力フォームが空欄の時にアラートによるエラーを出すコードを書いています。 2 2023/06/13 17:58
- 電子マネー・電子決済 JR東日本の交通系ICカードについて質問したいです。(困っている) 3 2022/09/18 14:10
- その他(プログラミング・Web制作) 単純なコマンドプロンプトが動きません。 2 2022/04/19 15:21
- 地図・道路 大津ICから161号線に入り高島市方面へ向かう入口 2 2022/06/22 16:08
- その他(コンピューター・テクノロジー) ICカードはなぜ、複数の機能をもたせらても、問題な通信ができるのですか? 7 2023/02/03 20:56
- その他(パソコン・周辺機器) パソコン(windows11)とICカードリーダ(IC-607)でマイナンバーカードのアクセスをして 5 2023/04/07 10:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
全角括弧と全角読点の間隔を狭...
-
文字の入力で横バー上段、中断...
-
Excel関数「COUNTIF」で”文字”...
-
全角英数文字が嫌われる理由を...
-
メッセージボックスで1025文字...
-
エクセルのCOUNTIFが正しくカウ...
-
PHPでMySQLに入力した半角スペ...
-
1文字のStrConv fromUnicode
-
正規表現でIパスワードの作成内...
-
=code(" ") で値が160となる文...
-
全角半角変換 C++/CLI
-
半角記号、全角記号を含む正規...
-
2つ以上の連続する空白文字を除去
-
VBAで英数字入力チェックしたい。
-
入力禁止文字の設定方法につい...
-
VBScriptである文字列に半角文...
-
エクセルでの漢字、カタカナ、...
-
PHPのエラー
-
smartyについて
-
Replace関数は文字数の制限ある...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字の入力で横バー上段、中断...
-
メッセージボックスで1025文字...
-
全角括弧と全角読点の間隔を狭...
-
エクセルのCOUNTIFが正しくカウ...
-
Excel関数「COUNTIF」で”文字”...
-
VBAで英数字入力チェックしたい。
-
XMLのタグ名の禁則文字
-
全角英数文字が嫌われる理由を...
-
半角記号、全角記号を含む正規...
-
2つ以上の連続する空白文字を除去
-
Replace関数は文字数の制限ある...
-
記号は半角と全角どちらがよい...
-
エクセルでの漢字、カタカナ、...
-
特定の文字を簡単な操作で半角...
-
SEO タイトルに「&」を使用
-
パソコンで全角、半角文字の切...
-
文字列中の両丸括弧を取り除くV...
-
Excel2002 一桁数字だけ全角に置換
-
IT企業の技術屋にとって全角英...
-
Phonetic関数を利用して文章中...
おすすめ情報