
よろしくお願いします。
PHPを勉強中です。
ログインページを制作していまして、ログインIDを入力し、
それのエラーチェックを行うコードに疑問を抱きました。
if($login_id == ""){
$mes[] = "ログインIDを入力してください。";
}elseif(strlen($login_id) != mb_strlen($login_id)){
$mes[] = "ログインIDは半角英数字で入力してください。";
}else{....
上記のelseif部分に、半角英数字のみ、IDの入力を受け付ける処理を
書籍の通りに制作しましたが、
実際にブラウザで完成ページからログインIDを入力すると、
全角で入力しても、エラーとはならず、そのまま処理がすすんでしまいます。
書籍の説明文では、
「文字数とバイト数が同じかどうかチェックしています。」
「同じの場合は半角文字ということになります。」
となっています・・・。
strlen()とmb_strlen()の意味も調べて理解しているつもりなのですが、なぜに全角で入力してもエラーとならないのか疑問です。
よろしくご教授くださいませ。
No.4ベストアンサー
- 回答日時:
ANo.1です。
見る限り特にマルチバイト文字関連の設定はしていないようですね。
とりあえず本件の解決のためにはmbstring.internal_encodingの値をphpファイルの文字エンコーディングと同じ値にしてやればいいでしょう。
mb_strlen()は第二引数を省略した場合、文字エンコ-ディングとして内部エンコーディングを使用するとあります。ですので内部エンコーディングがISO-8859-1では期待通りの動作をしてくれないということになります。
http://jp2.php.net/manual/ja/function.mb-strlen. …
No.3
- 回答日時:
なぜエラーなのかを考える際に
strlen($login_id)
mb_strlen($login_id)
の戻り値を調べてみると原因の解明に一歩近づけます。
例えば、
$login_id = "ログイン";
で
strlen($login_id)
の戻り値が4 ⇒ strlen()がおかしい
とりあえずこれを試してみて、原因を絞り込んでみてください。
この回答への補足
ご指導ありがとうございます。
strlen() と mb_strlen()を ”ログイン”にて戻り値を
調べたところ、
両者ともに
14
という数値になりました。
・・・・ このあとどう対処すればいいでしょうか・・・。
No.2
- 回答日時:
strlen()が、mb_strlen()としてオーバーロードされてしまっているのでしょう
http://www.php.net/manual/ja/mbstring.overload.php
半角英数チェックを行いたいのなら、入力に対して
preg_match()でチェックする方が良いです。
お礼が遅くなり申し訳ございません。
有難うございました。
オーバーロードの件ですが、
php.ini の mbstring.func_overload ディレクティブの値を確認したところ、
値は0となっていましたので、
関数strlen()がmb_strlenによってオーバーロードされていないようなんです。
やはり、半角英数チェックは、
preg_match()と、正規表現とをあわせて半角英数チェックするように
すればいいのでしょうか。
なんか今の私のレベルでは難しそうです。
また、しばらく研究してみます。有難うございました。
No.1
- 回答日時:
文字エンコーディングの問題が予想されます。
phpinfo()などでマルチバイト文字関連の設定を調べた結果はどうなっていますでしょうか。
特にmbstring.http_inputとmbstring.internal_encodingあたりの値が重要かと思います。
この回答への補足
申し訳ございません、
少し前の回答になりますが、その補足をさせてください。
phpinfoにて、確認しました。
Directive | Local Value | Master Value
mbstring.detect_order no value no value
mbstring.encoding_translation Off Off
mbstring.func_overload 0 0
mbstring.http_input pass pass
mbstring.http_output pass pass
mbstring.internal_encoding ISO-8859-1 no value
mbstring.language neutral neutral
mbstring.strict_detection Off Off
mbstring.substitute_character no value no value
上記がphpinfoの該当箇所です。
mbstring.http_inputとmbstring.internal_encoding の値をどうすればいいのでしょうか?
ちなみにですが、
文字コードの設定として、
.htaccess にて、 default_charsetの値はUTF-8に変更しています。
この件にかんしては関係ないと思いますが・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字の入力で横バー上段、中断...
-
メッセージボックスで1025文字...
-
エクセルのCOUNTIFが正しくカウ...
-
文字列中の両丸括弧を取り除くV...
-
海外購入PCでLENB関数を機能さ...
-
全角英数文字が嫌われる理由を...
-
日本語かどうかの判定について
-
Postgresの特定のカラムからス...
-
Excel関数「COUNTIF」で”文字”...
-
エクセルでの漢字、カタカナ、...
-
【PHP】ereg() で文字種判定...
-
VBAのコマンドボタンの文字列の...
-
VBAでCSVをExcelに取り込む時に...
-
小さいひらがな(っ、ょ、ぃ、ゃ...
-
正規表現で、半角大文字と半角...
-
文字化け変換方法
-
CSVファイルの改行コード判別
-
C++で空Enterの入力を判...
-
ラベル(スタティックテキスト)...
-
C#でのワイルドカードを使った...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字の入力で横バー上段、中断...
-
メッセージボックスで1025文字...
-
Excel関数「COUNTIF」で”文字”...
-
エクセルのCOUNTIFが正しくカウ...
-
全角括弧と全角読点の間隔を狭...
-
特定の文字を簡単な操作で半角...
-
エクセルでの漢字、カタカナ、...
-
VBAで英数字入力チェックしたい。
-
XMLのタグ名の禁則文字
-
Phonetic関数を利用して文章中...
-
全角英数文字が嫌われる理由を...
-
半角記号、全角記号を含む正規...
-
半角スペース の文字化け...
-
Replace関数は文字数の制限ある...
-
パソコンで全角、半角文字の切...
-
記号は半角と全角どちらがよい...
-
2つ以上の連続する空白文字を除去
-
文字列中の両丸括弧を取り除くV...
-
バッチファイル 全角検索
-
半角英数文字を全角英数文字に...
おすすめ情報