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

期限時間内にファィルの更新があったら作動するPHPを作ってます。
5つのファィルをチェックし、「昨日から今までの間に5つのうちのひとつでもファィルの更新があったら」「hoge.cgi?&act=2」を実行するスクリプトです。

下記が完成形のつもりです。
テストをしたところ、5つのファィル全部が「一昨日以前の日にち」だと「PHPスクリプト終了!!」の文字が出ます。(計算通りです)
一方、5つのファィルのうち「1つでも昨日以降更新したファィル」があると「PHPスクリプト終了!!」の文字は出ません。これも計算通りです。
また、echo filemtime("../../../05/dannetsu/mail.cgi");の部分では、それぞれの時間が表示されます。(linux時間)これも計算通りです。

ただ、なぜか、http://hoge.jp/hoge.cgi?&act=2 の実行だけがされません。

if (filemtime.... の部分を「orで繋げず、1つのファィルを読みに行くだけで実行可否を判断」するようにするとhttp://hoge.jp/hoge.cgi?&act=2 は実行されます。

従い、orで繋げている部分のミスだと思うのですが、どう見直してもミスが見つかりません。
後は私の根本的な勘違いが潜んでいるのではないかと思い、相談する次第です。
宜しくお願い致します。。

ソース

<?php
date_default_timezone_set('Asia/Tokyo');
$script_tz = date_default_timezone_get();
if (strcmp($script_tz, ini_get('date.timezone'))){
echo 'Script timezone differs from ini-set timezone.';
} else {
echo 'Script timezone and ini-set timezone match.';
}
echo filemtime("../../../05/dannetsu/mail.cgi");
echo filemtime("../../../05/gaikou/mail.cgi");
echo filemtime("../../../05/gaisou/mail.cgi");
echo filemtime("../../../05/kiso/mail.cgi");
echo filemtime("../../../05/kutai/mail.cgi");
echo filemtime("../../../05/naisou/mail.cgi");
echo strtotime ("yesterday");
//日付を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")) {
$buf = file_get_contents('http://hoge.jp/ho/ge/ho/hoge.cgi?&act=2');
echo $buf;
}else{
exit( "PHPスクリプト終了!!" );
}
?>

A 回答 (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作戦で愚直に探索するしかないかと。
    • good
    • 0
この回答へのお礼

ご返答が遅くなり申し訳ございません。
ご丁寧な回答、有難うございます。

結論から言いますと、phpそのものに問題はありませんでした。

このcgiが置かれている環境下に.htaccess でアクセス制限を掛けていたのが原因でした。

自分のテスト環境下では最初にパスワードで侵入していたため、
パソコンからのクリックでは.htaccess をクリアしcgiが稼働し、
サーバーからの指示であるphp経由では.htaccess に拒まれcgiに到達できないという
初歩的なミスでした。

自分のテスト環境でcgiが作動するため、全く気づきませんでした。

頂きましたアドバイスはいずれのアドバイスも有効でした。

本当にありがとうございました。

いずれのアドバイスも有効だったのですが、ひとつひとつクリアしていく指示を頂きましたこの
解凍をベストアンサーとさせていただきます。

お礼日時:2010/11/27 11:27

多分、分かってくれるだろうとは思いつつ 一応 追記します。



ことごとく 「$」を忘れました。

↓↓↓↓↓↓ この部分 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)


実証もなんもしてないので、明後日の方向の回答かもしれません。
    • good
    • 0
この回答へのお礼

ご返答が遅くなり申し訳ございません。
ご丁寧な回答、有難うございます。

結論から言いますと、phpそのものに問題はありませんでした。

このcgiが置かれている環境下に.htaccess でアクセス制限を掛けていたのが原因でした。

自分のテスト環境下では最初にパスワードで侵入していたため、
パソコンからのクリックでは.htaccess をクリアしcgiが稼働し、
サーバーからの指示であるphp経由では.htaccess に拒まれcgiに到達できないという
初歩的なミスでした。

自分のテスト環境でcgiが作動するため、全く気づきませんでした。

頂きましたアドバイスはいずれのアドバイスも有効でした。

本当にありがとうございました。

お礼日時:2010/11/27 11:26

とりあえず、最初に謝っておきますが、スクリプトはちゃんと読んでません。



ただ、あまりにも読みづらいと感じたので、以下を 変更してみてください。

↓↓↓↓↓↓この部分↓↓↓↓↓↓

/日付を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 ………

のほうが 俺的には見やすいです。
    • good
    • 0

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