[PHP-users 16526]Re: [PHP-users16334]他のディレクトリの変更

misono @ o-misono.com misono @ o-misono.com
2003年 7月 7日 (月) 00:26:17 JST


山本さん北尾さん

返信を有り難う御座います。

header の使い方の詳細がわかってきました。というより header の前には何も表示して
はいけない。エラーメッセージそのものだったのですね・・・。
print というのはデバッグをするという意味から何処にでもおいても良いものだと思って
いましたのでエラーメッセージの意味が理解できませんでした。

ご指導有り難う御座います。


> header関数の説明の一部を抜粋します。
> 
> 覚えておいて頂きたいのは、header() 関数は、通 常の HTML タグまたは PHP 
> からの出力にかかわらず、すべての実際の出 力の前にコールする必要があるこ
> とです。 頻出するエラーとして、include() または require() 関数、他のファ
> イルをアクセスする関数 に空白または空行があり、header() の前に出力が 行
> われてしまうというものがあります。同じ問題は、単一の PHP/HTMLファ イルを
> 使用している場合でも存在します。 

なるほどと思ってしまいました。意外に初心者にとってわかりにくい(誤動作の原因にな
っている)ものはこういう細かい点がのみ込めなくて動かないことにあるのでは・・・。
と思いました。

> > <?php 
> > $dirPath = "c:/My Documents/01gazoFolder/";
> > $dirDatePath = "2003/200306/20030610/";
> > $filename = "000019_20030610_S001.JPG";
> > $full_Path = $dirPath.$dirDatePath.$filename;
> >   header("Content-type: image/jpeg");
> >   readfile($full_Path);
> > ?>
> > 
> > とするとこれも
> > 
> > Warning: Cannot modify header information - headers already sent by 
> (output 
> > started at c:\program files\apache group\apache\htdocs\php\
> pictureviewtest.php:8)
> >  in c:\program files\apache group\apache\htdocs\php\pictureviewtest.php 
> > 
> > というエラーメッセージがでて表示されません。
> > 
> > しかし readfile のところを
> > readfile("c:/My Documents/01gazoFolder/2003/200306/20030610/000019_
> 20030610_S001.
> > JPG");
> > 
> > と変更すると表示されます。

ここで改行されて print されてしまうということを言いましたがそれはハッキリとはわ
からないのですが解決することができました。有り難う御座います。

VBの時も変数の宣言で悪戦苦闘した覚えがあったのですが、PHPは変数を勝手に設定し
てくれるので最初はこれは便利だと思い勉強する気になったのですが、意外にこれが落と
し穴でした。

例えば上記のように $filename = "000019・・・" というよに数字が最初にくるような場
合これを数値として扱ってしまうのではないかということです。数値でない / があって
もなのですが・・・。

自動判別に頼らずきちんと宣言することによってうまく動きました。

最初の質問内容として他のディレクトリからのアクセスはどうすれば良いのか・・・。と
いうことですが他のディレクトリであっても基本的には変わりはないということもわかり
ました。またセキュリティに関する問題をご指摘頂いたのですが、一応今の考えているこ
とに関してはローカルでの出力なのでセキュリティは意識せずに目的を達成しました。
もちろんWeb上にのせる場合セキュリティの注意があることの重要性についてはとても勉
強させて頂きました。

そこで当初のように php のみで実現するのではなく Apache に Alias を設定し、そこか
らファイルをとることを考えてみました。

ディレクトリからファイル名を取得し配列変数 $jpgFileGazo に複数のファイルを格納し

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>ViewPicture</title>
</head>

<body>
<table width="100%" border="1" cellpadding="1">
<?php
$fullPath = (string) $dir_webPath;
 foreach ( $jpgFileGazo as $value )
{
$Path = (string) $fullPath . $dirPath . "/" . $value;
?>
<tr><td>
<?php
print "<img src=$Path>";
?>
</td></tr>
<?php
}
?>
</table>
</body>
</html>

というような方法でテーブルに一覧できるようにしてみました。ここで $Path というの
が問題でした。 $fullPath の内容は "../patimg" というものですが、これを(string) 
しないとうまく表示されないということです。

ここで php の特長として 変数は自動設定してくれるけどあきらかに文字列であってもや
はり最初にしっかり宣言しておかないと思った通り働いてくれないことがあるということ
です。
まあしなければならないというよりは誤認するといけないのでハッキリ宣言しておいた方
がわかりにくい間違いがないということですね・・・。

多分こういう簡単なことがしっかりしていれば、最初からこういう問題は起きにくかった
のではないかなぁ〜と思いました。

複数の方からアドバイスを頂き私的にはセキュリティのことも教えて頂けたし、目的は達
成できたし、発見も多かったのでとても良かったと思っております。

本当に有り難う御座いました。m(_ _)m

これからもどうぞ宜しくお願い致します。

こちらの環境は、 Windwows XP HomeEdition Version 2002 Service Pack 1
Pentium(R) 4 CPU 1.70GHz 512 MB RAM 

Apache/1.3.27 Server at localhost Port 80
PHP Version 4.3.2

中村
mail: misono @ o-misono.com
http://www.o-misono.com/


PHP-users メーリングリストの案内