• ベストアンサー

if文の使い方

自分では解決できない為、質問させていただきます。 Webサイトの任意の場所に下のスクリプトを埋め込み、 ./testディレクトリに7日以内に更新ファイルがあり、かつファイル名にrrrという文字列がなければWEBサイトの埋め込んだ場所にABCDEFGHIJKと表示させることを考えています。 よって7日以内に更新があってもファイル名にrrrが含まれる場合や、 7日以内に更新がない場合はwebサイトにABCDEFGHIJKと表示させたくありません。 自分で書いてみた下記スクリプトではいつでもABCDEFGHIJKと表示されてしまいます。 ※下記9行目の$latestfilenameをechoするとちゃんと最終更新ファイル名を表示してくれます。(ここまでは上手くいっています) <? $dir = opendir("./test"); $latestfile=0; while (($fnm = readdir($dir)) !== false) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("./test/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename = $fnm; } } if($fnm == "." || $fnm == "..") continue; if(preg_match("/rrr/",$latestfilename)){ printf(""); break; } else if($nowdate - $fftime < 604800) { printf("ABCDEFGHIJK"); } else if($nowdate - $fftime > 604800) { printf(""); } closedir($dir); ?> 何がおかしいのかご教授ください。

  • PHP
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • i2719
  • ベストアンサー率35% (11/31)
回答No.3

素直にアルゴリズムを考えると以下のようなことがしたいのでは。 $message = ''; $dir = opendir('./test'); $ctime =time() -604800; while ($fnm = readdir($dir)) { if($fnm != '.' && $fnm != '..' && filemtime("./test/$fnm") > $ctime) { if(preg_match('/rrr/',$fnm)==0) $message='ABCDEFGHIJK'; } } closedir($dir); print $message;

wf3255
質問者

お礼

すみません。 ./testディレクトリのファイル生成アルゴリズムに別工程があり、 rrr123.txtというファイルと側の123.txtというファイルが同じ更新日付のために、ABCDEFGHIJKが表示されてしまうことがわかりました。 123.txtのほうも対象から除くステップが必要みたいです。 お騒がせして申し訳ないです。どうもありがとうございました。

wf3255
質問者

補足

参考意見ありがとうございます。 上記の方法で実行してみましたが、 ファイル名にrrrがあっても。7日以内の更新日付だと表示されてしまいます。 ファイル名の取得までは希望どうり動きます。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

ケアレスミスの連発ですね 不要なbreak(そのルーチンをとおるとエラーになる)があったり、 $nowdateと未定義の変数でチェックしたり(これは単純にtime()とすればよいでしょう) $ftimeと$fftimeというスペルミスがあったり、そもそもが$ftimeではなく $latestfileのような・・・。 ってことでifの項目で if($nowdate - $fftime < 604800) とかなっているところを if(time8) - $latestfile < 604800) などに書き換える必要があると思います

wf3255
質問者

お礼

無事解決いたしました。 貴重なご意見ありがとうございました。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

このプログラムの中では $nowdate が定義されてませんが、これはどこかで定義されているのでしょうか?

wf3255
質問者

お礼

参考意見ありがとうございます。 $nowdate定義を完全に忘れていました。 #2さま、#3さまの方法を確認しつつ直したいと思います。

関連するQ&A

  • shtmlファイルでのif文

    質問させていただきます。 htmlファイルへの埋め込みだとうまくいくのですが、 shtmlファイルへ下記スクリプトを埋め込むと、 『あかさたな!")); break; } else { printf(""); break; } } ?> 』 とスクリプトの部分まで表示されてしまいます。 この消し方(『あかさたな』とだけ表示させたい)をご存知の方、 お教えください。 <? $dir = opendir("./aaa/bbb/ccc"); $latestfile = 0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filectime("./aaa/bbb/ccc/$fnm"); $nowdate =strtotime(date("Y-m-d")); if(strtotime($nowdate) - $ftime <= 7*24*60*60) { printf("<FONT size="2"><B>あかさたな</B></FONT>"); break; } else { printf(""); break; } } ?>

    • ベストアンサー
    • PHP
  • filemtimeについて

    filemtime関数を使ってあるディレクトリ(./aaa)の中の最新のファイルを表示させようとしていますが、少し前までは上手くいっていたのですが、急に予定通りに動かなくなってしまい、ちょっと自分では解決できないため質問させていただきます。 スクリプトは下記になります。 <?php $dir = opendir("./aaa"); $latestfile=0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; clearstatcache(); $ftime = filemtime("./aaa/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename = $fnm; $filename = "./aaa/$latestfilename"; echo "$filename"; } } closedir($dir); ?> これで実行すると、aaaディレクトリ内のファイル名が全て表示されてしまいます。※ファイルの更新日時はファイルごとに異なっています。 どなたかご教授願います。

    • ベストアンサー
    • PHP
  • printfで表示させるのは一度にしたい

    QNo.2814162で質問させていただいた者です。 下記のスクリプトで./tttディレクトリに5日以内に作成されたファイルがあれば"ABCDEFGHI"と表示させようと思っております。 (5日以内に作成されたファイルが無ければ何も表示しない) しかし、./tttディレクトリにマッチしたファイルの数だけ "ABCDEFGHI"が表示されてしまいます。 もしマッチしたファイルが合った場合、 一度だけ"ABCDEFGHI"と表示させるようにするにはどうしたらよいでしょうか? <? $dir = opendir("./ttt"); $latestfile = 0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filectime("./ttt/$fnm"); $nowdate =strtotime(date("Y-m-d")); if(strtotime($nowdate) - $ftime <= 5*24*60*60) { printf("ABCDEFGHI"); } else { printf(""); } } ?>

    • ベストアンサー
    • PHP
  • ディレクトリ内の最新ファイルのみをコピーが上手くいかない

    下記のようなスクリプトにより、 ./ディレクトリ内の更新日付が最新のファイル名を取得し、 そのファイルを./bbbディレクトリにコピーするということを行いたいのですが、 更新日付が最新のものに関わらず全てのファイルがコピーされてしまいます。 <?PHP $dir = opendir("./"); $latestfile = 0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename =$fnm; $to="./bbb/".$fnm; if(!file_exists($to)) copy("./".$fnm,$to); } } closedir($dir); ?> 自力ではどこがヘンなのか理解できないため、どなたか教えてください。

    • ベストアンサー
    • PHP
  • 条件によりそれ以下を実行しない方法

    あるディレクトリ(./ppp)をオープンして、ディレクトリ内の最新ファイル名を取得し、その最新ファイル名(下記スクリプト中の$filename)に".gz"という文字列が含まれていたらそれ以下のスクリプトを実行せずにディレクトリクローズしてスクリプトを中止するスクリプトを考えています。下記スクリプト中の■■■の部分にあたる部分がわかりませんのでご教授願います。phpは4.3.2です。 =========== <?php $dir = opendir("./ppp");//ディレクトリオープン $latestfile = 0;//最新ファイル名取得 while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("./ppp/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename =$fnm; $filename = "./ppp/$latestfilename"; } } ■■■ ・ ・ ・ closedir($dir); ?> ===========

    • ベストアンサー
    • PHP
  • fopenで変数で指定したファイルの開き方

    同階層にあるディレクトリの中の更新日付が最新のファイルを整形してHTML形式にて出力するスクリプトを書いています。 下記に例を書きます。 注)aaa→同階層にあるディレクトリです。   PHP→Ver4.3.8 <?php $dir = opendir("./aaa"); $latestfile=0; while ($fnm = readdir($dir)) { $ftime = filemtime($fnm); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename = $fnm; $handle = @fopen("$latestfilename", "r"); if ($handle) { while (!feof($handle)) {    ・    ・    ↓   sring処理へと続く   echo(nl2br($String処理後の変数名));      } } fclose($handle); } } closedir($dir); ?> この方法だと上手くいきません。 エラー内容は『fclose(): supplied argument is not a valid stream resource』です。 ファイルが開かれていません。 よってfopenで変数で指定されたファイルを開く方法をご教授願います。 もし『fopen使うこと自体が誤っている』ということでしたら正しい書き方をご教授願います。

    • ベストアンサー
    • PHP
  • fwrite~サーバ環境で、なぜか0バイト

    ちょっと悩んでしまい質問させていただきます。 下記スクリプトにて、 (1)./aaaディレクトリ内の最新更新日付ファイルをオープン (2)文頭18バイトを削除し、残りのデータを同じファイルに保存する。 というスクリプトを作成しました。 っがしかし、ローカル環境(XAMPP)では上手く動いたのですがサーバー上ではなぜか当該ファイルが0バイトになってしまします。解決策がわかりませんのでご教授願います。 ただ、一点気がかりなのがサーバーは仕様でPHP4.3.2であるので、マニュアルのftruncateにある“注意”の内容が気にかかっています。戻り値が異なることが関係有るかも含めてご教授いただけると助かります。 ======== <?php $dir = opendir("./aaa"); $latestfile = 0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("./aaa/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename =$fnm; $filename = "./aaa/$latestfilename"; } } $fp = fopen($filename, "rwb+"); fread($fp, 18); //18バイト読み飛ばす ftruncate($fp, 0);//上記18バイトを削除 $warn = ''; while (!feof($fp)) { $warn .= fread($fp, 8192); } rewind($fp); fwrite($fp, $warn); fclose($fp); closedir($dir); ?> ========

    • ベストアンサー
    • PHP
  • 特殊な条件一致

    ちょっと前に似た質問をさせていただき、 解決に至ったかに見えたのですがさらに困難な状態になってしまい、質問させていただきます。 タイトルの『特殊な条件一致』は「./testディレクトリ内のファイル名を取得し、下記の3つの条件をクリアしていればwebサイトの任意の場所にABCDと表示させる」と言うものです。 その条件は ======== 条件1.7日以内に更新があったファイルがある。 条件2.ファイル名にrrrという文字列を含んでいない。 条件3.rrrと言う文字列を含んだファイル名のファイルはrrrを含まないファイル名を持っており(元ファイル→abc.txt 現在のファイル名→rrrabc.txt)そのファイルは更新日付が新しくとも除外。 ======== になります。 例えば./test内に下記ファイル達がいるとします。 abc.txt   →2日前更新 rrrabc.txt  →2日前更新 def.txt   →8日前更新 ghi.txt   →4日前更新 この場合にwebサイトの任意の場所にはghi.txtの存在によりABCDと表示されることになります。 条件3がないとしたら、下記のスクリプトで希望どおりの表示がされます。 ======== $message = ''; $dir = opendir('./test'); $ctime =time() -604800; while ($fnm = readdir($dir)) { if($fnm != '.' && $fnm != '..' && filemtime("./test/$fnm") > $ctime) { if(preg_match('/rrr/',$fnm)==0) $message='ABCD'; } } closedir($dir); print $message; ======== 6行目のif文で条件3の為の処理が必要になると思うのですが、それがわかりません。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • renameでのPermission deniedエラー

    下記スクリプトを実行すると、『Warning: rename(./aaa/bbb.send,./aaa/bbb.send.gz) [function.rename]: Permission denied in ...line 31←renameの行数』というエラーになります。 =========== <?php $dir = opendir("./aaa"); $latestfile=0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("./aaa/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename =$fnm; $filename = "./aaa/$latestfilename"; $fp = fopen($filename, "rwb+"); fread($fp, 18); //18バイト読み飛ばす ftruncate($fp, 0); $warn = ''; while (!feof($fp)) { $warn .= fread($fp, 8192); } rewind($fp); fwrite($fp, $warn); rename($filename,"$filename.gz"); fclose($fp); } } closedir($dir); ?> ============= renameの手前でchmodを実行させ、aaaディレクトリ及びファイル自身(./aaa/$filename)にパーミッション0777を与えても現象は変わりません。renameする$filenameにつきましても./aaa/$filenameとしたり、./aaa/$latestfilenameとしてみましたがやはり変わりませんでした。 解決策があればご教授願います。

    • ベストアンサー
    • PHP
  • 指定文字を含むファイル名の取得

    こんばんは、質問させてください。 今あるディレクトリのファイルを取得しようと考えています。ですが、取得したいファイルはファイル名末尾が"tmp"となったものだけを取得したいと考えています。 $dir = "/home/httpd/test/"; while($fnm[] = readdir($dir)); closedir($dir); sort($fnm); reset($fnm); while($a = each($fnm)){ if(($a[1] != ".") and ($a[1] != "..") and ($a[1] != "")){ $file_data[] = $a[1]; } } ってとこまでしかわからず、欲しくないファイル名まで$file_dataに入ってしまいます。 aaaaa_1111.txt(取得したくない) aaaaa_1111.txt.tmp(取得したい) aaaaa_1111.tmp.txt(取得したくない) 末尾が"tmp"のみ欲しいです。 すみませんが、宜しくお願い致します。

    • ベストアンサー
    • PHP