CakePHP Ver1.3.6で開発をしています。

アクションの中で、画像の存在判定にfile_exists関数を使ったのですが、
2バイトのファイル名のファイルの場合、存在するファイルがfalseになって
しまいます。

対象のファイルが存在するときに、

if (file_exists('img/漢字.jpg')) echo 'あります';
else echo 'ありません';

if (file_exists('img/filename.jpg')) echo 'あります';
else echo 'ありません';

このとき、前者は’ありません’、後者は’あります’と表示されます。

app/webrootフォルダにtest.phpを作り、その中で同じ判定をすると、
両方とも’あります’と表示されます。

なぜアクションの中に記述したときのみ、2バイトファイル名を正しく
判定できないのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

文字コードは統一できていますか?



・システム側で、ファイルシステムに使われている文字コード
・PHPファイル中でファイル名の指定に使っている文字コード

この二つが一致していないと、一見同じに見えても文字コードのバイト列レベルでは別の文字列になり、「ありません」と判定されることになります。

おそらく、たまたまtest.phpの方はファイルシステムと同じ文字コードで記述されているだけなのではないかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。おっしゃる通りでした。実に基本的なところを見落としていて、恥ずかしいです。

いついもLinux上での開発をしていたところ、今回WindowsのXAMPPでの開発に移ったことが原因のようです。

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

お礼日時:2011/04/08 17:09

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q【file_exists】ファイルが存在するのに、存在しないとなります

いつもお世話になっております。
■環境■
PHP5 Windows
■状況■
フォルダ内にtextファイルが20~45個入っております(個数は状況によって変わります)。
■目的■
フォルダのtextファイルの中身を参照し、各textファイルに必ず含まれる数字を取り出す。でございます。

■方法■
(1)フォルダにあるファイル名を取りだす
(2)fopenで読み込み(r)で全部を見、数字を別ファイルに書き込む

と考えたのですが、(1)で.、..というよくわからないファイルも一緒に出てきてしまったので、file_existsでファイルが存在するか確認してから(2)に移ろうとお思いました。
が、ファイル名は全部ないといわれてしまうのです。
しかしfile_exists($filename)の$filenameを表示させ、ブラウザにこぴぺするとtextデータは出てきます。

以下プログラムの一部です
※$cは(1)で得たフォルダ内にあるファイル名をループでまわしている値です

for($b=0;$b<$a;$b++){
 $filename="C:/Inetpub/wwwroot/php/kore/1/".$c;
if (file_exists($filename)) {
print "あるよ<BR>";
} else {
print "ないよ<BR>";
}
}

結果は(一部です)
C:/Inetpub/wwwroot/php/kore/1/.text⇒ないよ
C:/Inetpub/wwwroot/php/kore/1/..text⇒ないよ
C:/Inetpub/wwwroot/php/kore/1/0155442A5.txt⇒ないよ
C:/Inetpub/wwwroot/php/kore/1/01762602A.txt⇒ないよ
です。
上記の
C:/Inetpub/wwwroot/php/kore/1/01762602A.txt
C:/Inetpub/wwwroot/php/kore/1/0155442A5.txt
は確実に存在しております。

どこがおかしいのか、ご教授いただければ幸いです
よろしくお願いいたします

いつもお世話になっております。
■環境■
PHP5 Windows
■状況■
フォルダ内にtextファイルが20~45個入っております(個数は状況によって変わります)。
■目的■
フォルダのtextファイルの中身を参照し、各textファイルに必ず含まれる数字を取り出す。でございます。

■方法■
(1)フォルダにあるファイル名を取りだす
(2)fopenで読み込み(r)で全部を見、数字を別ファイルに書き込む

と考えたのですが、(1)で.、..というよくわからないファイルも一緒に出てきてしまったので、file_exists...続きを読む

Aベストアンサー

直接の回答ではありませんが、「.」や「..」という名前が出て来るということは、scandirやopendirしてreaddirでファイル名の一覧を取得しているということですよね。

一覧すべてを取得するのではなく、目的とするファイルのみ一覧で取得できるglobを使う方が便利ではないかと思います。たとえば glob("*.txt") を実行すれば、拡張子がtxtのファイルの一覧を返してくれます。

file_existsがtrueで返らない理由については、他の方もおっしゃっているとおり、まず渡しているファイル名が本当に思っているものなのかどうかを確認してみた方が良いと思います。ありそうなのは、$c にディレクトリ名の一部が入っている、とか。

Qサーバにある画像の存在をチェックする方法

宜しくお願いします。
サーバにアップロードした画像がちゃんと存在しているかをリアルタイムにチェックするシステムを構築したいと思っております。
PHPのGD機能(getimagesize)で、画像のファイルサイズを抽出したのですが、画像が存在しない場合、エラーが表示されてしまい、チェックになりません。
このエラーを表示させず、エラーの判別ができる方法か、もしくは、GD自体を使わずにチェックする方法があれば教えて下さい。
PHPのバージョンは4.3.10です。
宜しくお願い致します。

Aベストアンサー

file_exists("ファイル名")
で指定したファイルがあるか無いかを調べることができます。
有る場合trueになります。
その上で画像のファイルサイズを調べれば良いと思います。

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?


人気Q&Aランキング