プロが教える店舗&オフィスのセキュリティ対策術

http://www.kenjiweb.com/
↑のサイト様のさわやか日記という日記のPHPを使っています。
(※さわやか日記→http://www.kenjiweb.com/?mode=diary#i_diary
それまで全く問題なく使用できていたのですが、10月26日に日記を更新した所

Warning: mktime(): Windows does not support negative values for this function in d:\****\****\php\i_diary\i_diary.php on line 156
(※サーバーのフォルダ名等は****に変更しています。)

上記のエラーが10数個画面に表示されました。
とりあえず該当PHPファイルの153行目からの

$yyyy = substr($days,0,4);
$mm = substr($days,4,2);
$dd = substr($days,6,2);
$chkday = mktime(0, 0, 0, $mm, $dd, $yyyy);

の部分を

$yyyy = substr($days,0,0);
$mm = substr($days,0,0);
$dd = substr($days,0,0);
$chkday = mktime(0, 0, 0, $mm, $dd, $yyyy);

上記のように変更すると、とりあえずエラーは収まりました。
ですがプログラム的な意味が分からないので不安です。
また、以前は日記を書いていない日に日記を表示すると一番新しい日の日記が表示されていたのですが、表示されなくなりました。
サイト様にて同様の質問をしましたが、どうやら更新が停止しているらしく返答をもらえませんでした。
マルチポストになるので一応削除をしてこちらにて質問させて頂きました。
正しい対処法があれば教えて下さい。

A 回答 (2件)

$daysの値がおかしくなっているのかも知れないですね。


何故10/26に発生したのかはわかりませんが。

可能であれば$daysの値をechoなどで書き出すなどしてみてはいかがでしょう?

$days = "20051026";

この値を

$yyyy = substr($days,0,4);
$mm = substr($days,4,2);
$dd = substr($days,6,2);

このように取り出す仕組みだと思います。

$yyyy = substr($days,0,4);
#左から0番目から始まる4バイトを取得 → 2005を$yyyyに代入
$mm = substr($days,4,2);
#左から4番目から始まる2バイトを取得 → 10を$mmに代入
$dd = substr($days,6,2);
#左から6番目から始まる2バイトを取得 → 26を$mmに代入


negative values のエラーなので、恐らく
$days = "2005-10-26"
という値に変わってしまっているのだと思います。
その場合は - の分を考慮して

$yyyy = substr($days,0,4);
$mm = substr($days,5,2);
$dd = substr($days,8,2);

のようにするのが正しいんじゃないかな?と思います。

この回答への補足

ログをチェックしたら問題が見つかり、訂正したら無事直りました。
どうやら編集した際にログに問題が発生し2重投稿のような形になっていたようです。
ログの記述形式が

20051026,題名,本文
20051027,題名,本文

という具合になっていたのですが

20051026,題名,本文
051026,題名,本文
20051027,題名,本文

という具合になっていました。
回答して頂いた方のご指摘により気付くことが出来ました。
ありがとうございました。

補足日時:2005/11/03 19:27
    • good
    • 0
この回答へのお礼

こんにちは、回答ありがとうございます。
とりあえず$daysの値を書き出してみました。
10月26日の$dasyの値は20051026でした。
同様に他の日も調べてみましたが同様の形式でした。

mizuno3さんの仰る通り

$yyyy = substr($days,0,4);
$mm = substr($days,5,2);
$dd = substr($days,8,2);

のように変更してみましたが当然エラーは収まりませんでした。
もし他に修正可能な方法があれば是非ご教授下さい。

お礼日時:2005/11/02 12:37

時刻を求めようとしてエラーになっています。


Windowsでは1970年から2038年の間しかサポートされていないのに、その範囲外の時刻だったということのようです。

参考URLはエラーが出た関数の説明です。

ちなみにsubstrを0,0としたため、たぶん勝手に0が入り、最新日記の日時(mktimeの結果)が1970年1月1日となってしまっているため、本来の最新の日記が表示されなくなったのだと思います。

ただ、ここでエラーになっているのであれば、たとえば前日の日記とかもエラーになりそうなのですが、それは問題ないのでしょうか?
$daysにどんな値が入っているのかがわかれば、原因が探れるかもしれません。
とりあえずサーバの時計がおかしくなってないか確認してみてください。

参考URL:http://www.php.net/manual/ja/function.mktime.php
    • good
    • 0
この回答へのお礼

こんにちは、回答ありがとうございます。
最新の日記が表示されないのはそういう理由だったのですね。
勉強になります。

エラーは全ての日の日記で発生します。
$daysの値は、10月26日であれば"20051026"、10月27日であれば"20051027"が入っていました。
サーバーの時計についてはよく分からないのでまた調べてきます。
もしまだ何かあれば引き続き宜しくお願い致します。

お礼日時:2005/11/02 12:40

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