重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

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

よろしくお願いします。
PHPを勉強中です。
ログインページを制作していまして、ログインIDを入力し、
それのエラーチェックを行うコードに疑問を抱きました。

if($login_id == ""){
$mes[] = "ログインIDを入力してください。";
}elseif(strlen($login_id) != mb_strlen($login_id)){
$mes[] = "ログインIDは半角英数字で入力してください。";
}else{....

上記のelseif部分に、半角英数字のみ、IDの入力を受け付ける処理を
書籍の通りに制作しましたが、
実際にブラウザで完成ページからログインIDを入力すると、
全角で入力しても、エラーとはならず、そのまま処理がすすんでしまいます。
書籍の説明文では、
「文字数とバイト数が同じかどうかチェックしています。」
「同じの場合は半角文字ということになります。」
となっています・・・。

strlen()とmb_strlen()の意味も調べて理解しているつもりなのですが、なぜに全角で入力してもエラーとならないのか疑問です。
よろしくご教授くださいませ。

A 回答 (4件)

ANo.1です。



見る限り特にマルチバイト文字関連の設定はしていないようですね。

とりあえず本件の解決のためにはmbstring.internal_encodingの値をphpファイルの文字エンコーディングと同じ値にしてやればいいでしょう。

mb_strlen()は第二引数を省略した場合、文字エンコ-ディングとして内部エンコーディングを使用するとあります。ですので内部エンコーディングがISO-8859-1では期待通りの動作をしてくれないということになります。
http://jp2.php.net/manual/ja/function.mb-strlen. …
    • good
    • 0

なぜエラーなのかを考える際に


strlen($login_id)
mb_strlen($login_id)
の戻り値を調べてみると原因の解明に一歩近づけます。

例えば、
$login_id = "ログイン";

strlen($login_id)
の戻り値が4 ⇒ strlen()がおかしい

とりあえずこれを試してみて、原因を絞り込んでみてください。

この回答への補足

ご指導ありがとうございます。
strlen() と mb_strlen()を ”ログイン”にて戻り値を
調べたところ、
両者ともに
14

という数値になりました。
・・・・ このあとどう対処すればいいでしょうか・・・。

補足日時:2008/09/13 00:15
    • good
    • 0

strlen()が、mb_strlen()としてオーバーロードされてしまっているのでしょう


http://www.php.net/manual/ja/mbstring.overload.php

半角英数チェックを行いたいのなら、入力に対して
preg_match()でチェックする方が良いです。
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ございません。
有難うございました。

オーバーロードの件ですが、
php.ini の mbstring.func_overload ディレクティブの値を確認したところ、
値は0となっていましたので、
関数strlen()がmb_strlenによってオーバーロードされていないようなんです。

やはり、半角英数チェックは、
preg_match()と、正規表現とをあわせて半角英数チェックするように
すればいいのでしょうか。
なんか今の私のレベルでは難しそうです。
また、しばらく研究してみます。有難うございました。

お礼日時:2008/10/13 15:30

文字エンコーディングの問題が予想されます。


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に変更しています。
この件にかんしては関係ないと思いますが・・・。

補足日時:2008/10/13 14:57
    • good
    • 0

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