アプリ版:「スタンプのみでお礼する」機能のリリースについて

サーバー内にファイルを保存するテストプログラムを
作成しています。
C:┬public_html ←公開用

└Temp     ←非公開
公開したディレクトリ配下にファイルを保存する事は
できるのですが、非公開のディレクトリに保存すると
アクセスできないとエラーが出力されます。
テキストファイル等スクリプト中で作成されるファイ
ルは、公開されているディレクトリ配下でないといけ
ないのでしょうか?
もし公開されいているディレクトリ配下の場合、皆さ
んはどのようにアクセスされないように対策している
のでしょうか?

-----テストプログラムです。-----
<?php
// OK
// $filename = "moji.dat";
// NG
// $filename = "C:\Temp\moji.dat";

$str = "文字列";

$fp = fopen($filename,"w");
fputs($fp, $str);
fclose($fp);

$fp = fopen($filename,"r");
$str = fgets($fp, 512);
fclose($fp);

print("$str");
?>
-----テストプログラムです。-----

A 回答 (4件)

書き方が不味かったかな。



php.iniは
safe_mode = Off
doc_root =
open_basedir =
でかまいません。
Document_rootと前回書いたのは、
Apacheのhttpd.conf側の話です。

php側では、safe_mode = Offのみで
全ファイルへのアクセスが可能です。

あと、arisa5さんのアドバイスに対する補足で
OSがWindows2000Proとなってますので、
phpの実行ユーザ(Apacheの実行ユーザ)に
対し、ファイルアクセス権を与える必要がありますが
そちらは大丈夫ですか?
    • good
    • 0
この回答へのお礼

iniとconfをご指摘どおりに修正したら動作しました。
Document_rootとdoc_rootを勘違いしていました。
ディレクトリの仕組みがかなりとんちんかんしていたようです。

>phpの実行ユーザ(Apacheの実行ユーザ)に対し、ファイルアクセス権を与える必要がありますが
書籍等を参考にしていたので、特に意識していませんでしたが、設定を修正したら動作したので、手を加えませんでした。

WEB的にまだ勉強不足で色々問題が多発すると思います。
これからもご指導よろしくお願いします。 > 皆さん

お礼日時:2003/06/27 15:03

$filename = "C:\\Temp\\moji.dat";


等のようにメタキャラを\でエスケープしてみては?
普段はUNIX系OSなので自信ないけど。

あと、public_html配下に置くのは見られても良いデータだけですね。普通は。
それ以外の物はpublic_html配下に置くのはタブーと言われてますね。
アビバとかTBCの二の舞になりかねないので。

この回答への補足

\\にもしてみましたが、エラーは同じでした。

現在のphp.iniでは、public_html配下にしかファイル
を作成できないのが現状です。
また、現在のApacheの設定では、ディレクトリ参照も
できてしまったので、どうにかpublic_html配下以外に
できないかと試行錯誤しています。
senberoさんのアドバイスを基に修正してみましたが、
新たな問題に直面です。

何か思いつく事ありましたらお願いします。

補足日時:2003/06/27 13:15
    • good
    • 0

パスの指定が間違っています。



> $filename = "C:\Temp\moji.dat";

'\'は"(ダブルクォーテション)内では、
エスケープ文字として扱われます。

やるなら
$filename = "C:\\Temp\\moji.dat";
$filename = 'C:\Temp\moji.dat';
もしくは、
$filename = 'C:/Temp/moji.dat';

一番下が、Unix,Windows兼用で記述出来るので
お勧めです。

上記変更でも、駄目な場合は、
php.iniのsafe_modeディレクティブを確認して下さい
OnになっているとDocument_root下以外へのアクセスを
制限されます。

この回答への補足

返事が遅くなりすみません。

現在の設定は、
safe_mode = On
doc_root =
open_basedir = C:/
です。
変更して、
safe_mode = Off
doc_root = C:/public_html
open_basedir = C:/files
にしました。

下記のようなメッセージに変わりました。
Warning: Unknown(): open_basedir restriction in effect. File(C:/public_html/test6.php) is not within the allowed path(s): (C:/files) in Unknown on line 0

Warning: Unknown(C:/public_html/test6.php): failed to create stream: Operation not permitted in Unknown on line 0

Warning: Unknown(): Failed opening 'C:/public_html/test6.php' for inclusion (include_path='.;c:/php4/pear') in Unknown on line 0

「line 0」というのが新たな疑問です。

補足日時:2003/06/27 12:18
    • good
    • 0

filenameがフルパスで指定されているのでしたら、他に考えられる原因は、Tempフォルダのアクセス権だと思います。


Tempフォルダのアクセス権(パーミッション)を775または777に設定してみてください。
[コマンド:chmod 777 Temp]
また、プログラム内からファイルを書き出す場合は、所有者とグループをnobodyに変更しないと書込みができません。
[コマンド:chown nobody Temp]
[コマンド:chgrp nobody Temp]

この回答への補足

返事が遅くなりすみません。
環境は、
OS     :Windows2000Pro SPなし
Webサーバー:Apatch 2.0
PHP    :PHP 4.3.2
です。

>Tempフォルダのアクセス権(パーミッション)を775または777に設定してみてください。
とありますが、Windowsなので、違う原因のようです。
何が考えられるでしょうか?

補足日時:2003/06/27 12:15
    • good
    • 0

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