- ベストアンサー
期限時間内にファィル更新があったら作動するPHP
- 期限時間内にファイルの更新があったら作動するPHPを作っています。
- 5つのファイルをチェックし、昨日から今までの間に5つのうちのひとつでもファイルの更新があったらhoge.cgi?&act=2を実行するスクリプトです。
- 一方、5つのファイルのうち1つでも昨日以降更新したファイルがあるとPHPスクリプト終了の文字は出ません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
1つ気になるところがあります。 http://hoge.jp/hoge.cgi?&act=2 とありますが、&はいらないでしょう。 hoge.cgi?&act=2 でなく hoge.cgi?act=2 が通常の引数の書き方です。 さて、それ以外に文法ミスのようなのは見つかりませんでした。 効果あるかどうかわかりませんが私だったら試してみるだろうなって事は次のものです。 (1)とにかくif文の中が汚いので、改行やインデントをうまく使って見た目をきれいにする (2)orの代わりに||を使ってみる (3)if文がtrueの場合どこを通っているのか確かめるために、echo "21行目なう"などと全行に書く (3)については、Eclipseなどの開発環境があればデバッグ実行で1ステップずつ進めるほうが 楽ですけどね。もしその環境がないなら徹底的echo作戦で愚直に探索するしかないかと。
その他の回答 (2)
- bm_hiro
- ベストアンサー率51% (200/388)
多分、分かってくれるだろうとは思いつつ 一応 追記します。 ことごとく 「$」を忘れました。 ↓↓↓↓↓↓ この部分 Time は 全て $Time に置き換え。 ↓↓↓↓↓↓ if ((Time01 > $Yesterday) or (Time02 > $Yesterday) or (Time03 > $Yesterday) or (Time04 > $Yesterday) or (Time05 > $Yesterday) or (Time06 > $Yesterday) { あと 実験もしてませんし、頭の中で思っただけなのですが、if の中の 評価の順番が おかしくなってるせいじゃないかな~とか思いました。 括弧で明示的に評価の順番を決めてやらないと 左から順番に 評価していっちゃうんじゃないかと、思ったり。 俺の頭の中で思ったのは、以下のような評価の仕方を しちゃってるんじゃないかと。 ((((($Time01 > $Yesterday) or $Time02) > $Yesterday) or $Time03) > $Yesterday) 実証もなんもしてないので、明後日の方向の回答かもしれません。
お礼
ご返答が遅くなり申し訳ございません。 ご丁寧な回答、有難うございます。 結論から言いますと、phpそのものに問題はありませんでした。 このcgiが置かれている環境下に.htaccess でアクセス制限を掛けていたのが原因でした。 自分のテスト環境下では最初にパスワードで侵入していたため、 パソコンからのクリックでは.htaccess をクリアしcgiが稼働し、 サーバーからの指示であるphp経由では.htaccess に拒まれcgiに到達できないという 初歩的なミスでした。 自分のテスト環境でcgiが作動するため、全く気づきませんでした。 頂きましたアドバイスはいずれのアドバイスも有効でした。 本当にありがとうございました。
- bm_hiro
- ベストアンサー率51% (200/388)
とりあえず、最初に謝っておきますが、スクリプトはちゃんと読んでません。 ただ、あまりにも読みづらいと感じたので、以下を 変更してみてください。 ↓↓↓↓↓↓この部分↓↓↓↓↓↓ /日付をstrtotime()で変換して比較します if (filemtime("../../../05/dannetsu/mail.cgi") > strtotime ("yesterday") or filemtime("../../../05/gaikou/mail.cgi") > strtotime ("yesterday") or filemtime("../../../05/gaisou/mail.cgi") > strtotime ("yesterday") or filemtime("../../../05/kiso/mail.cgi") > strtotime ("yesterday") or filemtime("../../../05/kutai/mail.cgi") > strtotime ("yesterday") or filemtime("../../../05/naisou/mail.cgi") > strtotime ("yesterday")) { ↓↓↓↓↓↓こんな感じに変更↓↓↓↓↓↓ $Path = "../../../05/"; $Yesterday = strtotime ("yesterday"); $Time01 = filemtime(Path . "dannetsu/mail.cgi"); $Time02 = filemtime(Path . "gaikou/mail.cgi"); $Time03 = filemtime(Path . "gaisou/mail.cgi"); $Time03 = filemtime(Path . "gaisou/mail.cgi"); $Time04 = filemtime(Path . "kiso/mail.cgi"); $Time05 = filemtime(Path . "kutai/mail.cgi"); $Time06 = filemtime(Path . "naisou/mail.cgi"); if ((Time01 > $Yesterday) or (Time02 > $Yesterday) or (Time03 > $Yesterday) or (Time04 > $Yesterday) or (Time05 > $Yesterday) or (Time06 > $Yesterday) { ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ うん。書いてみて思いました。これも あまりスマートではないですね。 他にも 思いついたのがありますが、頭が回っていないので また後日。 ちなみに 一番最初に思ったのは、「括弧がないからなじゃなイカ?」 filemtime("../../../05/dannetsu/mail.cgi") > strtotime ("yesterday") or ……… でなくて、 ( filemtime("../../../05/dannetsu/mail.cgi") > strtotime ("yesterday") ) or ……… のほうが 俺的には見やすいです。
お礼
ご返答が遅くなり申し訳ございません。 ご丁寧な回答、有難うございます。 結論から言いますと、phpそのものに問題はありませんでした。 このcgiが置かれている環境下に.htaccess でアクセス制限を掛けていたのが原因でした。 自分のテスト環境下では最初にパスワードで侵入していたため、 パソコンからのクリックでは.htaccess をクリアしcgiが稼働し、 サーバーからの指示であるphp経由では.htaccess に拒まれcgiに到達できないという 初歩的なミスでした。 自分のテスト環境でcgiが作動するため、全く気づきませんでした。 頂きましたアドバイスはいずれのアドバイスも有効でした。 本当にありがとうございました。 いずれのアドバイスも有効だったのですが、ひとつひとつクリアしていく指示を頂きましたこの 解凍をベストアンサーとさせていただきます。