プロが教える店舗&オフィスのセキュリティ対策術

よろしくお願いいたします。

カレンダーを利用した宿の空室状況を作っています。
「各日付」の下に空室状況を表す○、×等の「マーク」その下に祭日やイベントなどの「コ
メント」を表示し、これらを編集します。

上記の「マーク」や「コメント」の内容は月毎に用意したテキストファイルからfopen関数で呼び出し、fgets関数で一行ずつ配列にセットして表示の際に適宜呼び出しています。
(一日分が一行に書いてあります。)

例)201505.txt

(1行目)○お部屋割引あり!
(2行目)×
(3行目)○憲法記念日
(4行目)△みどりの日




編集(書き込み)の際のエラーチェックについて質問です。
下記のチェックを施しています。

コメント欄について、ローカルで動かした時はひらがな20文字まで書くことができるのですが、サーバーにアップするとひらがな6文字まではOKなのですが、7文字入れるとエラーになってしまいます。

・・・$fpは、fgets関数で取り出した一行です。

$status = mb_substr($fp , 0 , 1);
$comment = mb_substr($fp , 1);

// =======================================
// エラーチェック/コメント($_POST["comment"])
// =======================================

if (mb_strlen($comment) > 20) {
$result = $result . "エラー・c-1<br>";
}
mb_regex_encoding("UTF-8");
if (preg_match('/[^0-90-9a-zA-Zぁ-んァ-ヶー一-龠!?a-zA-Z\n\r!?]/u' , $comment)) {

$result = $result . "エラー・c-2<br>";
}

if($result != ""){
echo $result;

}

よろしくお願いいたします。

A 回答 (2件)

>20文字まで書くことができるのですが



>7文字入れるとエラー

これは3バイト文字が7文字いれると21バイトになるからでは?

ソースの初めの方に
mb_internal_encoding("utf8");
など明示するか

>mb_strlen($comment)
でチェックするときに、エンコードを指定するとか必要かも

mb_strlen($comment,"utf8")
    • good
    • 0
この回答へのお礼

早速のご回答をいただいたのに、お礼が遅れて申し訳ありません。

日本語は3バイト文字なのですね・mb_を入れる意味をキチンと理解していませんでした。

エンコードが食い違っているとのご指摘を受け、サーバーのPHPの設定を見たところ、mbstring.internal_encoding というのがありこれをUTF-8 にしたらうまくいきました。

元からうまくいっていたローカルのphp.iniを調べたら、ちゃんと
下記のように書き換えていました。
;mbstring.internal_encoding = EUC-JP

mbstring.internal_encoding = UTF-8

教科書に書いてあったので、そのままいうとおりにやったのですが、自分で書き換えたのに・・・頭のなかでつながっていませんでした。

ご指摘ありがとうございました。

お礼日時:2015/04/11 11:37

ちょっと調べてみたんだけど, 例えば


http://itpro.nikkeibp.co.jp/article/COLUMN/20070 …
みたいなこと?
    • good
    • 0
この回答へのお礼

お礼が遅れて申し訳ありません。

ご紹介いただいたリンクのとおりの現象でした!

”PHPの内部エンコーディング設定”

との食い違いと記載されていたので、そういえばと思い、サーバーのPHPの設定を見たところ、mbstring.internal_encoding というのがありこれをUTF-8 にしたらうまくいきました。

ローカルの方のPHP.iniは、教科書に書いてあったので、そのままいうとおりにやったので、既にUTF-8になっていました。
こちらは自分でやったのに・・・気付きませんでした。

ご指摘ありがとうございました。

お礼日時:2015/04/11 11:43

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