• ベストアンサー

助けてください

サーバーにフリーのPHPをアップしたところ、以下のようなメッセージが出てきて正常に動作しません。 発行元に問い合わせていますが、どうも返事が遅くなりそうなので、もしよろしければ解決の糸口を教えていただければと思い、投稿しました。 ------------------------------------------------ Warning: flock() expects parameter 1 to be resource, boolean given in /virtual/hpbuilder/public_html/mydic.php on line 131 Warning: fputs(): supplied argument is not a valid stream resource in /virtual/hpbuilder/public_html/mydic.php on line 133 Warning: flock() expects parameter 1 to be resource, boolean given in /virtual/hpbuilder/public_html/mydic.php on line 135 Warning: fclose(): supplied argument is not a valid stream resource in /virtual/hpbuilder/public_html/mydic.php on line 137 ------------------------------------------------ パーミッションの問題なのでしょうか。よろしくお願いします

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

  • ベストアンサー
  • asahina02
  • ベストアンサー率47% (95/202)
回答No.1

flock等の各関数の書き方(引数に与えているものなど)が間違っていないのであれば、fopenに失敗しているのではないでしょうか。 fopenでの戻り値をチェックしてみてください。

arimasouitirou
質問者

補足

返信ありがとうございます ソースは下記のようになっているんですが… //書き込み場合 if(isset($_GET['write'])&&!isset($_GET['delete'])){ $get_w_pass=$_GET['write']; //パスワードが正確 if( $get_w_pass==$pass ){ $w_script=$script_php."?write=".$get_w_pass; if ($_SERVER["REQUEST_METHOD"]=="POST"){ if(!$_POST['id']==""){ $idflag=1; //改行コード\nは<br>に変換しておく $getid=str_replace( "\n",'<br>',$_POST['id']); } else{ $idflag=0; $msg="名称が入力されていません!<br>\n<a href=\" javascript:history.back() \">戻る</a>"; } if(!$_POST['data']==""){ $dataflag=1; $getdat0=htmlspecialchars( $_POST['data'] ,ENT_QUOTES ); $getdata=str_replace( "\n",'<br>',$getdat0 ); } else{ $dataflag=0; $msg="名称が入力されていません!<br>\n<a href=\" javascript:history.back() \">戻る</a>"; } if($idflag&&$dataflag){ //配列を作成 $conl_new = "$getid|:$getdata\n"; //ディレクトリが存在していない場合は作成 if(!@opendir($DicDB)){ mkdir ("$DicDB", 0777); } //データベースが存在しているか調べる if(!file_exists($url)) { //存在していなけれな作成する $fp = @fopen($url,"w"); //ファイルの破損を防ぐ為、一時ロックする flock($fp,LOCK_EX); //書込み fputs($fp, $conl_new); //ロック解除 flock($fp,LOCK_UN); //ファイルを閉じる fclose($fp); //データベースの属性を変更 chmod ("$url", 0777); //※このときに親dirの属性がデフォルトに変更されてしまうのでまた変更 chmod ("$DicDB", 0777); $prinmsg="以上をデータベースに追加しました"; } else{ //ファイルデータを配列に入れておく $conl = file($url); $w_flag=0; //配列の数まで処理を繰り返す for($i=0; $i<count($conl); $i++){ //$tempデータを"|:"で分けてそれぞれに代入 list($tempid,$tempdata)=explode("|:",$conl[$i]); if($tempid==$getid){ $prinmsg="その名称は既にデータベースに存在しています!書き込み不可!"; $w_flag=1; break; } } if(!$w_flag){ //ファイルを開く $fp = @fopen($url,"a+"); //ファイルの破損を防ぐ為、一時ロックする flock($fp,LOCK_EX); //書込み fputs($fp, $conl_new); //ロック解除 flock($fp,LOCK_UN); //ファイルを閉じる fclose($fp); $prinmsg="以上をデータベースに追加しました"; } }

その他の回答 (7)

  • taskuni
  • ベストアンサー率71% (49/69)
回答No.8

/virtual/hpbuilder/public_html/mydic.php この配置ですが。 /virtual/hpbuilder/public_html/mydic/mydic.php として、 ディレクトリ/virtual/hpbuilder/public_html/mydic/ を、パーミッション「707or777」設定するのはだめですか?

  • asahina02
  • ベストアンサー率47% (95/202)
回答No.7

dic.datが・・ディレクトリになってるようですが!? 1度dic.datを削除した上で再度動作させてみてください。 この状態で94行目でエラーが出るようなら、dic.datという「ファイル」を自分でアップした上で、パーミッションを「777」に設定して再度確認を。 ・・そろそろ帰宅するので、これ以上の回答が必要な場合、明日になってしまいます。スイマセン

arimasouitirou
質問者

お礼

おかげさまで無事解決できました。 本当にお世話になりました。 ありがとうございました

arimasouitirou
質問者

補足

本当にお世話になりました… dic.datを削除した時点で今までのエラーは解消されました。ありがとうございます。 しかし!また新たなエラーが!! Warning: chmod() [function.chmod]: Operation not permitted in /virtual/hpbuilder/public_html/mydic.php on line 106 だそうです。 DicDBのパーミッションは確認してみたらちゃんと777になってるんですが…;; とりあえずデータベースには登録できるようになりました。こんな簡単なミスで申し訳ありません

  • asahina02
  • ベストアンサー率47% (95/202)
回答No.6

とりあえず補足ください。 >$fp = fopen($url,"a+"); これを書いたのは96行目です? 最初の質問の流れから130行目前後に書かれてるのかと思ったのですが?

arimasouitirou
質問者

補足

ありがとうございます おっしゃるとおり130行目です。 そして、先ほど出なかった「@」を消して…ですが、再度アップをしなおしてみたところ Warning: fopen(./DicDB/dic.dat) [function.fopen]: failed to open stream: Is a directory in /virtual/hpbuilder/public_html/mydic.php on line 129 が出てきました

  • asahina02
  • ベストアンサー率47% (95/202)
回答No.5

#1~#3です。 そちらと同様の状態で、手元の環境ではエラーが出ませんでした・・orz エラー内容から考えるにファイルハンドルが異常っぽいのですが・・ ちなみにfopenの@を消すと、エラーは出ますか? また、以下のようにするとどうなりますか? $fp = fopen($url,"a+"); if( !$fp ) {  print "error!";  exit; } print $fp;

arimasouitirou
質問者

補足

何度もすみません >$fp = fopen($url,"a+"); if( !$fp ) {  print "error!";  exit; } としたところ、 Parse error: parse error, unexpected '@' in /virtual/hpbuilder/public_html/mydic.php on line 96 というエラーがでました @を消しただけではエラーの内容はかわりませんでした。

  • taskuni
  • ベストアンサー率71% (49/69)
回答No.4

phpのバージョンによっては、 flock($fp,LOCK_EX); flock($fp,LOCK_UN); のような書き方は flock($fp,2); flock($fp,3); のようにしなければならない場合もありますが、 大丈夫でしょうか。

参考URL:
http://jp2.php.net/flock
arimasouitirou
質問者

補足

お返事ありがとうございます。 やってみましたが、エラーは変わりませんでした

  • asahina02
  • ベストアンサー率47% (95/202)
回答No.3

> //データベースへのパス > $url=$DicDB.$DBfile; この記述より上の行で$DicDB、$DBfileをそれぞれ設定(自分で設定するようになっている?)している部分があるかと思います。 そこの内容がどうなっていますか? パスが合っているか?  正しいパスですか?ちゃんと存在していますか? あとはそのパス&ファイルのパーミションの問題かと思います。 内容を考えるに666にする必要がありそうですが。

arimasouitirou
質問者

補足

本当にお忙しいところ、ご迷惑をかけて申し訳ありません。 ------------------------------------------------- //辞書データベースディレクトリを指定 $DicDB ="./DicDB/"; $DBfile="dic.dat"; ------------------------------------------------- というのがソースです。 サーバー内では Public_html    ├DicDB(777)    │ └dic.dat(777)    └mydic.php(604) となっています。

  • asahina02
  • ベストアンサー率47% (95/202)
回答No.2

$urlというファイルに書込みしているようですが、この変数を設定しているところがないのですが? まぁそれはたまたまこの部分から抜けているだけとしても、 もしかしてこの変数名から考えるに http://***.com/data.txt みたいなことになってませんか? 書込み等するときはurlではなく、OS上から見たパスで書かなくてはダメじゃなかったかと思うのですが。 /home/****/public_html/data.txt みたいに。

arimasouitirou
質問者

補足

たびたびすみません;;もう泣きそうです ソースは以下のようになってます ----------------------------------------------- //以下は変更しないでください/////////////////// //データベースへのパス $url=$DicDB.$DBfile; //このスクリプトの名前 $script_php=$_SERVER['SCRIPT_NAME']; //汎用カウントを初期化 $a=0; $n=0; ------------------------------------------------ 実を言うとこれ以前にほかのエラーも一緒に出ていたのですが、そのエラーは自分でDicDB とその中にdic.dat というファイルを作った事で解消されたっぽいです。(コレは自動的に作られるはずなのでは…?)なんかこのphpは本当に使えるのでしょうか…

関連するQ&A