ポンクソフト

予定表 - PHPで日付・時刻の計算

前ページ PHPで日付・時刻の計算 TOP 次ページ

目次

  1. PHPで日付・時刻の計算
  2. 日付・時刻に関する関数
  3. 年齢計算
  4. 今月のカレンダー
  5. 年月を指定できるカレンダー
  6. 予定表
  7. 予定表(単一ソース)

予定表を作成する

前回作成したカレンダーに、予定を書き込める機能を追加して予定表を作成します。今回はフレームを利用し、左ページにカレンダー、右ページに予定を出すようにします。

フレームページの作成

まずフレーム部分のページを作成します。以下のソースを入力してください。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>予定表</title>
</head>
<frameset cols="200,*">
<frame name="cal" src="yotei_cal.php">
<frame name="main" src="yotei_main.php">
</frameset>
</html>
入力が終わったら「yotei.html」という名前でサーバにアップしてください。

左ページ(カレンダー)の作成

次に左ページに表示するカレンダーを作成します。以下のソースを入力してください。
<?php
$now = time();
$year = date("Y", $now);
$month = date("n", $now);
$day = date("j", $now);
if ($_POST['year']) {
  if ($year != $_POST['year'] || $month != $_POST['month']) {
    $year = $_POST['year'];
    $month = $_POST['month'];
    $day = 0;
    $now = mktime(0, 0, 0, $month, 1, $year);
  }
}
$dnum = date("t", $now);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>予定表カレンダー</title>
</head>
<body>
<form method="post" action="yotei_cal.php">
<select name="year" onChange="submit()">
<?php
for ($i = $year - 5; $i <= $year + 5; $i++) {
  print "<option";
  if ($i == $year) print " selected";
  print ">$i</option>\n";
}
?>
</select>年
<select name="month" onChange="submit()">
<?php
for ($i = 1; $i <= 12; $i++) {
  print "<option";
  if ($i == $month) print " selected";
  print ">$i</option>\n";
}
?>
</select>月
</form>
<?php
$wstr = array('日', '月', '火', '水', '木', '金', '土');
for ($i = 1; $i <= $dnum; $i++) {
  $t = mktime(0, 0, 0, $month, $i, $year);
  $w = date("w", $t);
  $ymd = date("Ymd", $t);
  print "<a href='yotei_main.php?ymd=$ymd' target='main'>";
  if ($i == $day) print "<strong>";
  if ($w == 0) print "<font color='red'>";
  print date("Y年m月d日", $t);
  print "(" . $wstr[$w] . ")";
  if ($w == 0) print "</font>";
  if ($i == $day) print "</strong>";
  print "</a>";
  print "<br>\n";
}
?>
</body>
</html>
入力が終わったら「yotei_cal.php」という名前でサーバにアップしてください。

右ページ(予定表編集)の作成

次に右ページに表示する予定表を編集する部分を作成します。以下のソースを入力してください。
<?php
$ymd = $_GET['ymd'];
if (!$ymd) $ymd = date("Ymd");
$year = substr($ymd, 0, 4);
$month = substr($ymd, 4, 2);
$day = substr($ymd, 6, 2);
$fname = "logs/$ymd.txt";
if (file_exists($fname)) $contents = file_get_contents($fname);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>予定表メイン</title>
</head>
<body>
<h3><?php print "{$year}年{$month}月{$day}日の予定" ?></h3>
<form method="post" action="yotei_submit.php">
<textarea name="contents" cols="60" rows="20"><?php print $contents ?></textarea>
<br><br>
<input type="submit" value="登録">
<input type="hidden" name="ymd" value="<?php print $ymd ?>">
</form>
</body>
</html>
入力が終わったら「yotei_main.php」という名前でサーバにアップしてください。

右ページ(予定登録)の作成

次に予定を実際に登録する部分を作成します。以下のソースを入力してください。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>予定表書き込み</title>
</head>
<body>
<p>
<?php
$contents = $_POST['contents'];
$contents = str_replace("\r\n", "\n", $contents);
$contents = str_replace("\r", "\n", $contents);
$fp = fopen("logs/{$_POST['ymd']}.txt", "w");
if ($fp) {
  fwrite($fp, $contents);
  fclose($fp);
  print "予定を登録しました";
} else {
  print "予定登録に失敗しました";
}
?>
</p>
</body>
</html>
入力が終わったら「yotei_submit.php」という名前でサーバにアップしてください。

ログディレクトリの作成

今回の予定表プログラムでは、日付.txt というログファイルを作成し、そこに毎日の予定を格納していくようにします。そのログファイルを格納するためのディレクトリをまず作成します。「logs」というディレクトリを上記ソースと同じ場所に作成し、FFFTPなどから「その他」の属性の「書込」にチェックを入れてください。ディレクトリに書き込み許可属性を与えることによって、そのディレクトリの中で新規ファイルを作成できるようになります。

プログラムの実行

yotei.html をブラウザで実行してみてください。日付をクリックすると、予定を書き込むことができます。

yotei.html ソースの解説

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
yotei.html はフレームを表示しているページなので、DOCTYPE に上記のような指定をしなければなりません。
<frameset cols="200,*">
frameset 要素の中身が、実際にフレームを定義している部分です。cols 属性でフレーム左右に分割、左フレームを 200 ピクセル、右フレームを残り全部と指定しています。
<frame name="cal" src="yotei_cal.php">
左フレームの名前を cal にし、yotei_cal.php を表示する指定をしています。name 属性はフォームやリンクのターゲットを指定するときに使われます。
<frame name="main" src="yotei_main.php">
右フレームの名前を main にし、yotei_main.php を表示する指定をしています。

yotei_cal.php ソースの解説

左フレームのカレンダー部分は、予定表を出すためのリンクの追加以外は前回のソースとほぼ同じです。
$ymd = date("Ymd", $t);
print "<a href='yotei_main.php?ymd=$ymd' target='main'>";
日付のリンクに GET メソッドの変数 ymd としてその日付を YYYYMMDD(年が4桁、月が2桁、日が2桁)の形式で渡すようにしています。target 属性にフレームの名前をセットすることにより、そのフレームにリンク先のページを表示するようにしています。

yotei_main.php ソースの解説

予定を出力・編集する部分です。
$ymd = $_GET['ymd'];
yotei_cal.php から GET メソッドで渡された YYYYMMDD 形式の日付を $ymd に格納します。
if (!$ymd) $ymd = date("Ymd");
$ymd が空、つまり GET メソッドで ymd を渡されないのは最初にフレーム yotei.html から呼ばれたときです。そのときは $ymd に現在日付を YYYYMMDD 形式で格納します。
$year = substr($ymd, 0, 4);
$month = substr($ymd, 4, 2);
$day = substr($ymd, 6, 2);
$ymd から年・月・日を取得して $year, $month, $day にそれぞれ格納します。
$fname = "logs/$ymd.txt";
$fname にログファイルを設定します。logs ディレクトリの中に日付に拡張子 txt を付加したものがファイル名になります。
if (file_exists($fname)) $contents = file_get_contents($fname);
file_exists 関数は、引数で指定したファイルが存在しているなら true、存在しないなら false を返す関数です。ログファイルが既に存在する場合は、変数 $contents にその内容を全て格納します。
<h3><?php print "{$year}年{$month}月{$day}日の予定" ?></h3>
見出しとして、編集する日付を出力しています。
<form method="post" action="yotei_submit.php">
登録ボタンを押したときに、yotei_submit.php を実行します。
<textarea name="contents" cols="60" rows="20"><?php print $contents ?></textarea>
既に予定が存在する場合は、テキストエリアにその予定 ($contents) を表示します。
<input type="hidden" name="ymd" value="<?php print $ymd ?>">
予定を登録するときに、編集している日付が分からないと困るので、隠しフィールドとして日付を渡しています。

yotei_submit.php ソースの解説

予定を実際に登録する部分です。
$contents = $_POST['contents'];
yotei_main.php のテキストエリアに書かれた予定を変数 $contents に格納します。
$contents = str_replace("\r\n", "\n", $contents);
$contents = str_replace("\r", "\n", $contents);
全ての改行を UNIX 標準である \n に合わせています。
$fp = fopen("logs/{$_POST['ymd']}.txt", "w");
yotei_main.php の隠しフィールドから渡された日付をもとにログファイルを書き込み専用でオープンしています。
if ($fp) {
  fwrite($fp, $contents);
  fclose($fp);
  print "予定を登録しました";
ファイルがオープンできた場合は、予定の内容 $contents をファイルに書き込み、メッセージを出力します。
} else {
  print "予定登録に失敗しました";
}
ファイルがオープンできなかった場合は、エラーメッセージを出力します。
前ページ PHPで日付・時刻の計算 TOP 次ページ
このエントリーをはてなブックマークに追加 そっか0

このページに関するコメントをどうぞ

お名前:



すごく参考になりました!
ありがとうございます。
2017/03/30 09:47

名無しのリーク
香川県ルーちゃん餃子のフジフーヅはバイトにパワハラの末指切断の大けがを負わせた犯罪企業
2017/03/29 23:34

高級時計 ブランド レディース
特恵中-新作入荷!
当社の商品は絶対の自信が御座います
迅速、確実にお客様の手元にお届け致します
実物写真、付属品を完備しております。
低価格を提供すると共に、品質を絶対保証しております
ご注文を期待しています
2017/03/28 18:37

カルティエ ソリテール
ブランドコピーブランドN級品専門店
史上最も激安ブランドブランドコピー-即日 配送可,100%入荷。
当店は正規品と同等品質は品質3年保証でご注文から5 日でお届け致します。
レディースとメンズ激安通販専門店!品質と本物は同様です。
全て新品、高い品質、激安 、送料は無料です( 日本全国)すべての商品は品質2年無料保証です。
ブランドコピー時計:
2017/03/24 14:04

カリマー
解りやすくて、とてもいいサイトですね!
phpは初心者ですが、最後まで到達できるよう頑張ります!
2017/03/23 04:03


ああああ
2017/03/23 00:54

オメガ ボーイズ
★2017最高等級新しい商品大量入荷!
■在庫情報随時更新!(*^-^*)
■信用第一、良い品質、低価格は。
★歓迎光臨★送料無料(日本全国)
ご注文を待ちしております
よろしくお願いいたします_(._.)_
2017/03/22 09:09


テスト
2017/03/21 14:02

ゆうた
かりんがすき
2017/03/17 14:36

saraebo
別windowsとして実装することなく、actionのphpで、コマンドとするデータベース等の更新で、その結果をクライアントに返さない(homeページの元画面は変わらない。)とする事はできるのでしょうか?
2017/03/17 12:09

残りを読む »