• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ifの判定ができません。)

PHPのif文判定でelseの処理が実行される問題が発生しています

このQ&Aのポイント
  • PHPのif文で条件判定を行っていますが、正しく処理が実行されません。
  • URLの日本語や英数字をカウントする際に文字数が正しく計算されない可能性があります。
  • 改善策としては、文字列の長さを取得する際にmb_strlen関数を使用することが推奨されます。

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.6

urldecodeとurlencodeの見間違い…かな? $url には url"decode" された値が入っているので、もちろんマルチバイト文字を含む可能性はありますね。そのマルチバイト文字の有無を判定するのであれば $url = urldecode($_SERVER['REQUEST_URI']); if (strlen($url) === mb_strlen($url, 'UTF-8')) {  /* マルチバイト文字を含まない */ } else {  /* マルチバイト文字を含む */ } これだけのことで済みますが。 >> ($counthensu=8 $mbhensu=8とechoでは表示されていても) ちょっとこれは考えられないです。何らかのコーディングミスがあったと考えるのが普通です。もし異議があれば、echoで表示している実際のソースコードの提示をお願いします。

uewouuc73jmmdjd
質問者

お礼

To_aru_Userさん、ご回答ありがとうございました。 恥ずかしながらおっしゃる通りifの処理内における コーディングミスが原因でした。 結局自分の上記コードでも動作しましたし、 アドバイスいただいたコードでも動作を させることができました。 このたびは貴重なご回答いただきましてありがとうございました。

その他の回答 (6)

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.7

おおっと、たしかにurldecodeですね(汗 $url = urldecode($_SERVER["REQUEST_URI"]); #指摘thx.>To_aru_Userさん ただ、これで本当にutf-8の文字列だとしたら、QueryStringに日本語が含まれていなければ、手元の環境(&提示されたソース)ではどうやっても if は真になるんですよね。 どういうQueryStringで試しているのかを書いていただけるといいかもしれません(まさか日本語しか試していないってことじゃないですよね?)

uewouuc73jmmdjd
質問者

お礼

agunuzさん、ご回答ありがとうございます。 お返事が遅れ申し訳ありません。 たくさんのご回答をいただき 非常に恐縮なのですが、No6さんのおっしゃる通り ifの処理内におけるコーディングミスでした。 しかしながら皆さんの助言の中に深い 知識、ノウハウがあり私としても 大変勉強になりました。 このたびは貴重なご回答ありがとうございました。

回答No.5

No4さん。。 $url = urldecode($_SERVER["REQUEST_URI"]); たしかに!! その通りだわ。私も見落としてた。 すでに、生じゃないですね。この時点で。 最初からラテン変換終わってる(w)

uewouuc73jmmdjd
質問者

お礼

AsarKingChangさん、ご回答ありがとうございます。 お返事が遅れ申し訳ありません。 たくさんのご回答をいただき 非常に恐縮なのですが、No6さんのおっしゃる通り 原因はifの処理内におけるコーディングミスでした。 しかしながら皆さんの助言の中に深い 知識、ノウハウがあり私としても 大変勉強になりました。 このたびは貴重なご回答ありがとうございました。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.4

>判定がすべてelseの処理となってしまいます。 逆じゃないんですか? urlencodeした文字列($url)からは、すでにマルチバイト文字は消えてしまっているハズです(でないとurlencodeした意味がない)。

回答No.3

"%82%d9%82%c9%82%e1%82%e7%82%e7" 追加です~ これ、UTFじゃなくてSJISですね^ 「ほにゃら」じゃないですか(w) UTF8なら、 E3 81 BB E3 81 AB E3 82 83 E3 82 89 ですな(w) ただ、どっちにしても7ビット目をチェックするだけで ASCII文字だけか?はチェックできますけどね。 SJISの1バイト目も、UTF8の1バイト目も、絶対に00-7Fの 範囲外なのは保証されていますので。

回答No.2

>要はURLに日本語が含まれているかどうかという判定を行っています。 あ~ $mbhensu = mb_strlen($url,'utf8'); if(strlen($url) == $mbhensu) { ifの処理 } else { elseの処理 } こんなのどうでしょ? %~~が変換されたのであれば、長さが変わるので、falseとなり %を含まないなら、長さは同じになる!。 ただ、これですが、%~~=日本語ではなくて URLに書くことが出来ない文字も%20=spaceだったりもするので、 それは正しいわけではない!という点は注意が必要です。 厳密にやりたいなら、UTLの1バイト目の文字があるか? を使うべきでしょう。。 ord() 文字コードを返す これを使って、 http://www.seiai.ed.jp/sys/text/java/utf8table.html 8x,9x,Ax,Bx 多バイト文字の2バイト目以降 <をチェックしたいが、 その前に、 00-7x 1バイト文字 ならば、簡単で、 if (ord(target)&0x80) /* 2バイトあり */ ってことですね。 これを $japaneseorenglish = str_split($url); $counthensu = count($japaneseorenglish); この変数の分まわせばチェックできますね。 と言うのを関数にして、 function check_1byte_char($url) { // } とでも、作成すれば後から改良もできますし。 どうでしょうか?

回答No.1

渡しているつもりの変数のECHOと $url = urldecode($_SERVER["REQUEST_URI"]); $japaneseorenglish = str_split($url); $counthensu = count($japaneseorenglish); $mbhensu = mb_strlen($url,'utf8'); 取り込み後の、ECHOがほしいですね。 if (strpos($_SERVER['REQUEST_URI'], '/honyarara/') === 0) { こっちは、含まれるか?なので、"=="ではないので、種類が違う判定でもありますね。 気になるのは、 $japaneseorenglish = str_split($url); http://www.php.net/manual/ja/function.str-split.php 1文字単位でばらしていますね。 $counthensu で、カウント?.length的値? その後、文字列の長さとして、入手? $mbhensu = mb_strlen($url,'utf8'); これを比較というのが、よくわからないのですが、 具体的に何を比較したいのでしょうか?

uewouuc73jmmdjd
質問者

お礼

AsarKingChangさん、さっそくのご回答ありがとうございます。 要はURLに日本語が含まれているかどうかという判定を行っています。 "%82%d9%82%c9%82%e1%82%e7%82%e7" $urlは"ほにゃらら"みたいな形なのですが なにかお心当たりありますでしょうか。 よろしくお願いいたします。

uewouuc73jmmdjd
質問者

補足

$url = urldecode($_SERVER["REQUEST_URI"]); $_SERVER["REQUEST_URI"]で "%82%d9%82%c9%82%e1%82%e7%82%e7" $urlはurldecode()で"ほにゃらら"みたいになってます。

関連するQ&A

専門家に質問してみよう