期限時間内にファィルの更新があったら作動する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スクリプト終了!!" );
}
?>
No.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作戦で愚直に探索するしかないかと。
ご返答が遅くなり申し訳ございません。
ご丁寧な回答、有難うございます。
結論から言いますと、phpそのものに問題はありませんでした。
このcgiが置かれている環境下に.htaccess でアクセス制限を掛けていたのが原因でした。
自分のテスト環境下では最初にパスワードで侵入していたため、
パソコンからのクリックでは.htaccess をクリアしcgiが稼働し、
サーバーからの指示であるphp経由では.htaccess に拒まれcgiに到達できないという
初歩的なミスでした。
自分のテスト環境でcgiが作動するため、全く気づきませんでした。
頂きましたアドバイスはいずれのアドバイスも有効でした。
本当にありがとうございました。
いずれのアドバイスも有効だったのですが、ひとつひとつクリアしていく指示を頂きましたこの
解凍をベストアンサーとさせていただきます。
No.2
- 回答日時:
多分、分かってくれるだろうとは思いつつ 一応 追記します。
ことごとく 「$」を忘れました。
↓↓↓↓↓↓ この部分 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が作動するため、全く気づきませんでした。
頂きましたアドバイスはいずれのアドバイスも有効でした。
本当にありがとうございました。
No.1
- 回答日時:
とりあえず、最初に謝っておきますが、スクリプトはちゃんと読んでません。
ただ、あまりにも読みづらいと感じたので、以下を 変更してみてください。
↓↓↓↓↓↓この部分↓↓↓↓↓↓
/日付を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 ………
のほうが 俺的には見やすいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP phpのメールフォームの完了画面でメール受信のコードを書いています。 1 2023/05/31 11:39
- PHP 共通の処理をまとめる方法がわからないのでアドバイスお願いします。 1 2022/12/19 20:20
- ホームページ作成・プログラミング CGIが実行可能なHP領域又はレンタルサーバーでおすすめの所を教えてください 現在ホームページ領域の 1 2023/01/01 11:47
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- CGI (フリーの)ツリー掲示版CGI、昔は多用させてもらいましたが・・今セキュリティ上どうでしょう? 2 2023/06/25 07:18
- CGI CGIが読み書きするデータファイルのパーミッションはさくらのインターネットでは何にするべき? 1 2023/05/02 16:44
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メールフォームのタイトルが文...
-
指定した時間にPHPプログラムを...
-
php 完了画面の送信メールのコ...
-
PHPMailerのコードエラーが解決...
-
メールの本文が取得できない
-
mb_send_mail関数が利用出来ない
-
ローカル環境でのメール送信
-
mail関数を使った場合のReturn-...
-
Mb_Send_mailで文字化け
-
POP Before SMTPでメールを送信...
-
onedrive にexcelファイルをア...
-
こちらはただの直列処理ですか?
-
ワードプレス、Contact Form 7...
-
拡張子php画像をjpg画像等に変...
-
PHPとCSVで簡易データベースな...
-
include先でのinclude元の変数...
-
リダイレクト元のURLの取得方法...
-
php エラー
-
PHPのif文でその処理を途中で抜...
-
VBでメールを送る時のSMT...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
php 完了画面の送信メールのコ...
-
さくらサーバーにて、phpからメ...
-
メールフォームのタイトルが文...
-
PHPsendmailにて送信元を変更
-
mb_send_mail関数が利用出来ない
-
PHPからロリポップ!のメールサ...
-
VBA 添付ファイルをつけてメー...
-
mailやmb_send_mail関数で、本...
-
sendmailでエラーがでます
-
PHPでの仮登録時の会員認証メー...
-
phpでメール送信できません 原...
-
mb_send_mail() 第 4、5 引数の...
-
PHPMailerのコードエラーが解決...
-
ローカル環境でのメール送信
-
PHPからメールを送る@さくらイ...
-
PHPでメールを送信するには
-
mb_send_mailについて
-
mail関数を使った場合のReturn-...
-
メールの本文をSmartyにしたい
-
サーバーによってはmb_send_mai...
おすすめ情報