• ベストアンサー

日記のPHPにてWarning: mktime()というエラーが出ます

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

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

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

  • ベストアンサー
回答No.1

$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); のようにするのが正しいんじゃないかな?と思います。

sakasama0rska
質問者

お礼

こんにちは、回答ありがとうございます。 とりあえず$daysの値を書き出してみました。 10月26日の$dasyの値は20051026でした。 同様に他の日も調べてみましたが同様の形式でした。 mizuno3さんの仰る通り $yyyy = substr($days,0,4); $mm = substr($days,5,2); $dd = substr($days,8,2); のように変更してみましたが当然エラーは収まりませんでした。 もし他に修正可能な方法があれば是非ご教授下さい。

sakasama0rska
質問者

補足

ログをチェックしたら問題が見つかり、訂正したら無事直りました。 どうやら編集した際にログに問題が発生し2重投稿のような形になっていたようです。 ログの記述形式が 20051026,題名,本文 20051027,題名,本文 という具合になっていたのですが 20051026,題名,本文 051026,題名,本文 20051027,題名,本文 という具合になっていました。 回答して頂いた方のご指摘により気付くことが出来ました。 ありがとうございました。

その他の回答 (1)

  • katamari
  • ベストアンサー率66% (14/21)
回答No.2

時刻を求めようとしてエラーになっています。 Windowsでは1970年から2038年の間しかサポートされていないのに、その範囲外の時刻だったということのようです。 参考URLはエラーが出た関数の説明です。 ちなみにsubstrを0,0としたため、たぶん勝手に0が入り、最新日記の日時(mktimeの結果)が1970年1月1日となってしまっているため、本来の最新の日記が表示されなくなったのだと思います。 ただ、ここでエラーになっているのであれば、たとえば前日の日記とかもエラーになりそうなのですが、それは問題ないのでしょうか? $daysにどんな値が入っているのかがわかれば、原因が探れるかもしれません。 とりあえずサーバの時計がおかしくなってないか確認してみてください。

参考URL:
http://www.php.net/manual/ja/function.mktime.php
sakasama0rska
質問者

お礼

こんにちは、回答ありがとうございます。 最新の日記が表示されないのはそういう理由だったのですね。 勉強になります。 エラーは全ての日の日記で発生します。 $daysの値は、10月26日であれば"20051026"、10月27日であれば"20051027"が入っていました。 サーバーの時計についてはよく分からないのでまた調べてきます。 もしまだ何かあれば引き続き宜しくお願い致します。

関連するQ&A

  • phpカレンダー縦型から格子型へ

    予約状況用の既存スクリプトから表示を変更させたいのですが、 変更内容は以下の通りです。(PHP+MySQL) ▼縦型から ------------------------ |1日 |○| |2日 |×| ・・・ |31日 |×| ▼カレンダー形式へ ------------------------ | |1|2|3|4|5|6| |○|×|△|○|○|×|×| |7|8|9|10|11|12|13| |○|×|△|○|○|×|×| ・・・ ------------------------------------------------ <table border="1"> <tr bgcolor="#ffd700"> <td>日付</td> <?php // 部屋表示 while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { $roomid = $row["roomid"]; $roomname = cnv_dispstr($row["roomname"]); $link = $_SERVER["PHP_SELF"]."?act=det&roomid=".$roomid; ?> <td><a href="<?php echo $link?>"> <?php echo $roomname ?></a></td> <?php } ?> </tr> <?php $lastd = date("d", mktime(0, 0, 0, $mm + 1, 0, $yyyy)); for ($i = 1; $i <= $lastd; $i++) { ?> <tr> <?php $ts = mktime(0, 0, 0, $mm, $i, $yyyy); $ymd = date("Y/m/d", $ts); $ymdstr = strftime("%Y年%m月%d日(%a)", $ts); ?> <td><?php echo $ymd ?></td> <?php // 部屋ごとの予約表示 $res = mysql_query($sql, $conn) or die("データ抽出エラー"); while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { $roomid = $row["roomid"]; $roomname = cnv_dispstr($row["roomname"]); $link = $_SERVER["PHP_SELF"]. "?act=upd&hiduke=".$ymd."&roomid=".$roomid; ?> <td><a href="<?php echo $link?>"> <?php echo yoyakuchk($ymd,$roomid) ?></a></td> <?php } ?> </tr> <?php } ?> </table> ------------------------------------------------ 調べたところ $lastd = date("d", mktime(0, 0, 0, $mm + 1, 0, $yyyy)); for ($i = 1; $i <= $lastd; $i++) { $days = date("d", mktime(0, 0, 0, $mm, $i, $yyyy)); $first_day = date('w', mktime(0, 0, 0, $mm, 1, $yyyy)); $last_day = date('w', mktime(0, 0, 0, $mm, $days, $yyyy)); } $last_week_days = ($days + $first_day) % 7; if ($last_week_days == 0){ $weeks = ($days + $first_day) / 7; }else{ $weeks = ceil(($days + $first_day) / 7); } 今月の日数、最初の日、最後の日の曜日、最後の週の曜日を得ればいいんだろうというところまでは分かったんですが、どう書き換えていいかわかりません。どなたか参考となるソースをご指南頂けると、とても助かります。

    • ベストアンサー
    • PHP
  • 日付取得、計算及び表示コードが動作しません。

    日付取得、計算及び表示コードが動作しません。 下記のコードのどこが間違っているのか、どなたかお分かりですか? このコードでは、今日の日付をサーバから取得し、それから10日後の日付を計算して表示したいです。 $currentdate = .getdate(); $yyyy = $currentdate["year"]; $mm = $currentdate["mon"]; $dd = $currentdate["mday"]; $int_day = 10; $duedate = .date("y/m/d", mktime(0, 0, 0, $mm, $dd+$int_day, $yyyy)); echo "$duedate" また、上記のコードが動作するようになったとして、表示される日付は「2008/06/10」のようになるかと思いますが、これを「2008年06月10日」のように表示させる方法をご存知でしょうか? >$duedate = .date("y/m/d", mktime(0, 0, 0, $mm, $dd+$int_day, $yyyy)); 上記コードを下記のように変更してもだめです。 >$duedate = .date("y年m月d日", mktime(0, 0, 0, $mm, $dd+$int_day, $yyyy)); よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP タイムスタンプ

    タイムスタンプで値を取得して、比較するプログラムなのですが、なぜか $time = mktime(0, 0, $_POST['hh'], $_POST['dd'], $_POST['mm'], $_POST['yyyy']); の値が”-1”で返ってきてしまいます。 何故でしょうか? <?php echo "<select name=\"yyyy\">"; for ($i = 2010; $i < 2012; $i++) { $selected=$i==$_REQUEST["yyyy"]?" selected":""; echo "<option value=\"{$i}\"{$selected}>{$i}</option>\n"; } echo "</select> 年 "; echo "<select name=\"mm\">"; for ($i = 1; $i < 13; $i++) { $selected=$i==$_REQUEST["mm"]?" selected":""; echo "<option value=\"{$i}\"{$selected}>{$i}</option>\n"; } echo "</select> 月 "; echo "<select name=\"dd\">"; for ($i = 1; $i < 32; $i++) { $selected=$i==$_REQUEST["dd"]?" selected":""; echo "<option value=\"{$i}\"{$selected}>{$i}</option>\n"; } echo "</select> 日 "; echo "<select name=\"hh\">"; for ($i = 0; $i < 24; $i++) { $selected=$i==$_REQUEST["hh"]?" selected":""; echo "<option value=\"{$i}\"{$selected}>{$i}</option>\n"; } echo "</select> 時 <br />"; $time = mktime(0, 0, $_POST['hh'], $_POST['dd'], $_POST['mm'], $_POST['yyyy']);

    • ベストアンサー
    • PHP
  • 月曜日から始まる週間カレンダーの作り方

    いつもありがとうございます。 下記のようなコードを書いて1週間のカレンダーを作っていますが、 どうしても日曜日からの表示になります。 この表示を月曜日から始まり、日曜日で終わるカレンダーにならないものか考えるのですが、どうもうまくいきません。 よきアドバイスをお願いします。 <? //来週・前週の---日曜日----をgetした値 $get_sunday = htmlspecialchars($_GET["get_sunday"]); $entry_day = htmlspecialchars($_GET["entry_day"]); //変数の値の識別カレンダー表示 //get_sunday (来週・前週)の値がgetされていたら if($get_sunday!=""){ //getされた日曜日の日付 $mm = date("m",strtotime($get_sunday)); $dd = date("d",strtotime($get_sunday)); $yyyy = date("Y",strtotime($get_sunday)); //getされた日曜日の日付(日のみ) $sunday_num = $dd; //getされた日曜日の日付(年月日) $kyujin_day = date("Y-m-d",mktime(0,0,0,$mm,$dd,$yyyy)); } // ================================================= //変数の値の識別           カレンダー表示 //entry_day (指定した日)の値をgetされたら if($entry_day!=""){ $mm = date("m",strtotime($entry_day)); $dd = date("d",strtotime($entry_day)); $yyyy = date("Y",strtotime($entry_day)); //$week_numに今日の曜日ナンバーを代入(mktime(0,0,0,今日の月,今日の日,今日の年) //日0・月1・火2・水3・木4・金5・土6 $week_num = date("w", mktime(0,0,0,$mm,$dd,$yyyy)); //entry_dayの値 $kyujin_day = date("Y-m-d",mktime(0,0,0,$mm,$dd,$yyyy)); //日曜日の日付(日のみ) $sunday_num = $dd - $week_num; } // ================================================= //変数の値がない場合は本日の日付の取得 カレンダー表示 if($get_sunday=="" and $entry_day==""){ $mm = date("m",time()); $dd = date("d",time()); $yyyy = date("Y",time()); //$week_numに今日の曜日ナンバーを代入(mktime(0,0,0,今日の月,今日の日,今日の年) $week_num = date("w", mktime(0,0,0,$mm,$dd,$yyyy)); $kyujin_day = date("Y-m-d",mktime(0,0,0,$mm,$dd,$yyyy)); //日曜日の日付(日のみ) $sunday_num = $dd - $week_num; } //前週、次週に日曜日の日付を取得    カレンダー表示 $sunday_last = $sunday_num - 7; $sunday_next = $sunday_num + 7; ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>レンダー画面</title> </head> <body> <table> <tr> <td></td> <td bgcolor="#00FFFF">日</td> <td bgcolor="#00FFFF">月</td> <td bgcolor="#00FFFF">火</td> <td bgcolor="#00FFFF">水</td> <td bgcolor="#00FFFF">木</td> <td bgcolor="#00FFFF">金</td> <td bgcolor="#00FFFF">土</td> <td></td> </tr> <tr> <form method="get" name="form2"action="test2.php"> <td> <input type="hidden" name="get_sunday" value= "<?php echo date("Y-m-d", mktime(0, 0, 0, $mm, $sunday_last, $yyyy)); ?>"> <input type="submit" name="Submit2" value="前週へ"> </td> </form> <? //週カレンダー(前週ボタン作成)ここまで //週カレンダー日付を入れる $w2 = $sunday_num; $select_day = date("Y-m-d", mktime(0, 0, 0, $mm, $w2, $yyyy)); $i = 0; while($i < 7) { //日曜日から順に日付を$select_dayに入れていく ?> <td bgcolor="#CCFFFF"><? echo date("m月d日", mktime(0, 0, 0, $mm, $w2+$i, $yyyy)) ?></td> <? // 日付けを一つ繰り上げる $i++; } ?> <form method="get" name="form2" action="test2.php"> <td> <input type="hidden" name="get_sunday" value= "<?php echo date("Y-m-d", mktime(0, 0, 0, $mm, $sunday_next, $yyyy)); ?>"> <input type="submit" name="Submit" value="次週へ"> </td> </form> </table> </body> </html>

    • 締切済み
    • PHP
  • PHPのカレンダーに曜日をつけられづに困っています。

    <?php // 日付 if (!isset($hiduke)) { $hiduke = date("Y-m-d"); } if (!isset($yyyy)) { $yyyy = date("Y", strtotime($hiduke)); } if (!isset($mm)) { $mm = date("m", strtotime($hiduke)); } if (!isset($dd)) { $dd = date("d", strtotime($hiduke)); } // 表示ページ if (isset($_GET["act"])) { $act = $_GET["act"]; } if (!isset($act)) { $act = ""; } // ================================================= //  処理開始 ?> <?php conndb();?> <html> <head> <meta http-equiv="content-type" content="text/html; charset=Shift_JIS"> <title>予約システム</title> </head> <body> <h2>予約システム</h2> <?php // -- ページ内容の表示 switch ($act) { case "upd": // 更新 gamen_upd(); break; case "updconf": // 更新確認 gamen_updconf(); break; case "delconf": // 削除確認 gamen_delconf(); break; case "det": // 詳細表示 gamen_detail(); break; default: gamen_iti(); } ?> </body> </html> <?php closedb(); ?> <?php // ================================================= // ----- 一覧表示画面 function gamen_iti() { global $conn; global $hiduke; global $yyyy; //年 global $mm; //月 $array = cnv_formstr($_POST); extract($array, EXTR_SKIP); if (isset($kbn)) { if ($kbn == "upd" or $kbn == "del") { update_yoyaku($kbn); } } $sql = "SELECT * FROM jikan ORDER BY timeid"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); ?> <form method="post" action="<?php echo $_SERVER["PHP_SELF"]?>"> <table border="1"> <tr> <td><?php setmonth(); ?></td> <td><input type="submit" name="sub" value="予約表示"></td> </tr> </table> <input type="hidden" name="act" value="iti"> <input type="hidden" name="kbn" value="go"> </form> <p><?php echo date("Y 年 m 月 ", mktime(0, 0, 0, $mm, 1, $yyyy)) ?>予約一覧 <table border="1"> <tr bgcolor="#ffd700"> <td>日付</td> <?php // 時間表示 while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { $timeid = $row["timeid"]; $jikan = cnv_dispstr($row["jikan"]); ?> <td><?php echo $jikan ?></td> <?php } ?> </tr> <?php //カレンダー $lastd = date("d", mktime(0, 0, 0, $mm + 1, 0, $yyyy)); for ($i = 1; $i <= $lastd; $i++) { ?> <tr> <?php $ts = mktime(0, 0, 0, $mm, $i, $yyyy); $ymd = date("Y/m/d" ,$ts) ; $ymdstr = strftime("%Y年%m月%d日(%a)", $ts); ?> <td><?php echo $ymd ?></td> <?php   <?php } ?> </table> <?php } // ================================================= // ----- 年月選択リスト表示 function setmonth() { global $yyyy; global $mm; $array = cnv_formstr($_POST); extract($array, EXTR_SKIP); echo "<table><tr><td>"; // 年 echo "<select name=\"yyyy\">"; for ($i = 2008; $i <= 2025; $i++) { echo "<option"; if ($i == $yyyy) { echo " selected "; } echo ">$i"; } echo "</select>年"; // 月 echo "<select name=\"mm\">"; for ($i = 1; $i <= 12; $i++) { echo "<option"; if ($i == $mm) { echo " selected "; } echo ">$i"; } echo "</select>月"; echo "</td>"; echo "</tr></table>"; } ?> と参考書を見ながら、作っています。 PHPはまったくの初心者です。カレンダーの日付に曜日をつけられづに困っています。コードを含め詳しくをしえてもらえると助かります。よろしくお願いします。

    • 締切済み
    • PHP
  • date型

    date型のカラムに1:00という時間を入れたいけどうまくいきません。yyyy/mm/dd hh:mmという形になります。PHPで取り出すときにSUBSTR関数を使って取り出そうとしても取り出せません。無理なのでしょうか??

  • おすすめの日記

    現在http://diary.fc2.com/の絵日記を使っています。 更新など簡単で気に入っていたのですが、 まったく検索に引っかかってくれません。 もう2年以上も使っているので、5年分しか保存が出来ない点もネックです。 オススメの日記はないでしょうか。

  • 縦カレンダーの曜日に色づけ

    <?php $lastd = date("d", mktime(0, 0, 0, $mm + 1, 0, $yyyy)); for ($i = 1; $i <= $lastd; $i++) ?> <tr> <?php  $ts = mktime(0, 0, 0, $mm, $i, $yyyy);  $ymd = date("Y/m/d", $ts);  $ymdstr = strftime("%Y年%m月%d日(%a)", $ts); ?> <td><?php echo $ymd ?></td> <?php //曜日表示  $_m =$m;  $dd = $i;  $aday = array("日", "月", "火", "水", "木", "金", "土"); while( $m==$_m ){ printf("<td><center>%s</center></td>", $aday[date("w", $ts)]); $d++; //次の日の月を$_mに代入 $_m = date("m",$ts); } ?> 日付の部分を"switch文"を使って書きたいのですが、わからずに苦労しています。教えてもらえると助かります。よろしくお願いします。

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

    PHPで修正をしたら下記のエラーがでました。 Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /usr/home/g105427/html/test/blog_special.php on line 199 ble border="0" cellpadding="3" cellspacing="0"> <?php $i = 0; do { $i = $i + 1; ?> <tr> <td><IMG src="image/list.gif" width="13" height="13" border="0"><font color="#FF8000"><a href="blog_02.php?id=<?php echo $row_rs_blog_02['id']; ?>"> <?php echo mb_substr($row_rs_blog_02['title'],0,50); ?> <?php if (mb_strlen($row_rs_blog_02['title']) >= '50') { echo('…'); } ?> </a> <?php echo "("; echo substr($row_rs_blog_02['date'], 4,2); echo "/"; echo substr($row_rs_blog_02['date'], 6,2); echo ")"; ?></font></td> </tr> <?php } while ($row_rs_blog_02 = mysql_fetch_assoc($rs_blog_02) and $i < 2); ?> </table> <BR> <BR> ちなみに199行目は ?php } while ($row_rs_blog_02 = mysql_fetch_assoc($rs_blog_02) and $i < 2); ?> になっています。 教えてください。 説明が悪くてすいません。

    • ベストアンサー
    • PHP
  • phpのエラー(Warning: explode() [functio

    phpのエラー(Warning: explode() [function.explode]: Empty delimiter in..)と(Warning: Invalid argument supplied for foreach() in) PHP4のサーバーにて問題なく作動しているプログラムなのですが、PHP5のサーバーにて設置したところ、以上のエラー表示がされ、解決策が見つからず質問いたしました。 エラーの出たサーバー情報 PHP Version 5.2.11 Server API Apache エラーの出たファイル1 --------------------- $fname = "als_admin/alslist.dat"; $fp = fopen($fname, "r"); $buf = fread($fp, filesize($fname)); $buf = explode( LB(), substr($buf, 0, strlen($buf)-strlen(LB()) ) );    ※ //tab毎に分割 foreach($buf as $key => $value) { //表示対象を抽出   ※ $buf[$key] = explode("\t", $value); } //詳細情報に代入 $write = ""; foreach($buf as $key => $value)     ※ { //idが一致するデータのみを取得 if( $value[0] != $_GET['id'] ){ continue; } //非表示中はアクセス不可(一覧には出ないが直リン対策) if( $value[13] < 0 ){ //リストNoがマイナスになっている exit("ページが存在しません。<a href=\"top.php\"> TOPへ</a>"); } //データをセット foreach($gkey as $fk => $fv){ $g[$fv] = $value[$fk] ? $value[$fk] : ""; } break; } エラーの出たファイル2 --------------------- <? include "../modules.php"; if(empty($_GET['r'])) : //リスト表示の場合 $fname = "galslist.dat"; $buf = file_get_contents($fname); if(!empty($buf)) { $buf = explode( LB(), substr( $buf, 0, strlen($buf) - strlen(LB()) ) ); ※ foreach($buf as $key => $value) {     ※ $buf[$key] = explode("\t", $value); if(isset($buf[$key][13]) && $buf[$key][13] > 0) $view[] = $buf[$key]; else $noview[] = $buf[$key]; } } endif; ?> エラー表示が出たところに※印をいれました。 文字数制限があり、お答えを頂く上で以上の記載で足らない部分がありましたらご指摘頂けますでしょうか。恐れ入りますがよろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう