第19回 スケジューラーを作ろう(9) - スケジューラー完成 - - PHP基礎講座
Saity先生のPHP基礎講座
Lecutures on PHP
第19回 スケジューラーを作ろう(9) - スケジューラー完成 - (その2)
デザインを整えて
- これで機能的には一通りそろったかな。
- あとは、見た目ですね~。このままじゃちょっと。。。

- よし、じゃあCSSとHTMLのデザインを熊ちゃんにお願いしてみよう。お願いします、熊ちゃん!
- わかりました。それではささっとやっつけてしまいましょう。
- わっ。(い、いつの間に現れたんだろう。。。
- (カタカタ...)ふぅ。。。こんな感じでしょうか。
schedule_calendar.php
<?php
// カレンダーの年月をタイムスタンプを使って指定
if (isset($_GET["date"]) && $_GET["date"] != "") {
$date_timestamp = $_GET["date"];
} else {
$date_timestamp = time();
}
$month = date("m", $date_timestamp);
$year = date("Y", $date_timestamp);
$first_date = mktime(0, 0, 0, $month, 1, $year);
$last_date = mktime(0, 0, 0, $month + 1, 0, $year);
// 最初の日と最後の日の「日にち」の部分だけ数字で取り出す。
$first_day = date("j", $first_date);
$last_day = date("j", $last_date);
// 全ての日の曜日を得る。
for($day = $first_day; $day <= $last_day; $day++) {
$day_timestamp = mktime(0, 0, 0, $month, $day, $year);
$week[$day] = date("w", $day_timestamp);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<title>カレンダー</title>
<style type="text/css">
a:link {color: #3366FF; background-color: transparent;
text-decoration: none; font-weight: bold;}
a:visited {color: #2B318F; background-color: transparent;
text-decoration: none; font-weight: bold;}
a:hover {color: #00BFFF; background-color: transparent;
text-decoration: underline;}
body {color: #333333; background-color: #FFFFFF;}
table {border: 1px solid #CCCCCC; border-collapse: collapse;
margin-bottom: 1em;}
td {border: 1px solid #CCCCCC; width: 2.5em; height: 2.5em;
text-align: right; vertical-align: bottom; padding: 2px;}
th {border: 1px solid #CCCCCC; color: #333333;
background-color: #F0F0F0; padding: 5px;}
</style>
</head>
<body>
<table border="1">
<tr>
<th colspan="2"><a href="schedule_calendar.php?date=
<?php print(strtotime("-1 month", $first_date)); ?>">前月</a></th>
<th colspan="3"><?php print(date("Y", $date_timestamp) . "年" . date("n", $date_timestamp) . "月"); ?></th>
<th colspan="2"><a href="schedule_calendar.php?date=
<?php print(strtotime("+1 month", $first_date)); ?>">次月</a></th>
</tr>
<tr>
<th>日</th>
<th>月</th>
<th>火</th>
<th>水</th>
<th>木</th>
<th>金</th>
<th>土</th>
</tr>
<tr>
<?php
// カレンダーの最初の空白部分
for ($i = 0; $i < $week[$first_day]; $i++) {
print("<td></td>\n");
}
$filename = "samplefile.txt";
$schedule_list = file($filename);
for ($day = $first_day; $day <= $last_day; $day++) {
if ($week[$day] == 0) {
print("</tr>\n<tr>\n");
}
// スケジュールが存在するかどうかチェックする
$exist_schedule = false;
foreach ($schedule_list as $lineno => $line) {
list($schedule_date, $title, $body) = explode("|", $line);
if ($schedule_date == $year . $month . sprintf("%02d", $day)) {
$exist_schedule = true;
break;
}
}
// スケジュールが存在したらリンクをつける
if ($exist_schedule) {
print("<td><a href=\"schedule_list.php?year=" .$year .
"&month=". $month . "&day=$day\">$day</a></td>\n");
} else {
print("<td>$day</td>\n");
}
}
// カレンダーの最後の空白部分
for ($i = $week[$last_day] + 1; $i < 7; $i++) {
print ("<td></td>\n");
}
?>
</tr>
</table>
<a href="schedule_edit.php">スケジュールの新規作成</a>
</body>
</html>
schedule_list.php
<?php
$filename = "samplefile.txt";
$schedule_list = file($filename);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<title>スケジュール一覧</title>
<style type="text/css">
a:link {color: #3366FF; background-color: transparent;
text-decoration: none; font-weight: bold;}
a:visited {color: #2B318F; background-color: transparent;
text-decoration: none; font-weight: bold;}
a:hover {color: #00BFFF; background-color: transparent;
text-decoration: underline;}
body {color: #333333; background-color: #FFFFFF;}
table {border: 1px solid #CCCCCC; border-collapse: collapse;
margin-bottom: 1em;}
td {border: 1px solid #CCCCCC; height: 2.5em;
vertical-align: middle; padding-left: 1em; padding-top: 2px;
padding-right: 1em; padding-bottom: 2px;}
th {border: 1px solid #CCCCCC; color: #333333;
background-color: #F0F0F0; padding: 5px;}
</style>
</head>
<body>
<table border="1">
<tr>
<th>日付</th>
<th>タイトル</th>
<th>内容</th>
<th>編集</th>
<th>削除</th>
</tr>
<?php
foreach ($schedule_list as $lineno => $line) {
list($schedule_date, $title, $body) = explode("|", $line);
if ($schedule_date == date("Ymd", mktime(0, 0, 0, $_GET["month"],
$_GET["day"], $_GET["year"]))) {
print("<tr>\n");
print("<td>$schedule_date</td>\n");
print("<td>$title</td>\n");
print("<td>$body</td>\n");
print("<td><a href=\"schedule_edit.php?lineno=$lineno&mode=edit\">編集する</a></td>\n");
print("<td><a href=\"schedule_edit.php?lineno=$lineno&mode=
delete\">削除する</a></td>\n");
print("</tr>\n");
}
}
?>
</table>
</body>
</html>
※編集部注:「samplefile.txt」がない場合は警告が出ますのでご自分で作成してください。
- おおっ。相変わらずきれいな画面、さすが熊ちゃん☆
- あれ?今回出てきた[ a:link { ・・・ } ]みたいな指定のしかた、初めて見るわ。タグの後ろをコロン(:)で区切るのは、以前は教わらなかったような。。。
- そうですね。この、コロンで区切った後ろの部分は、前のタグ(ここでは<a>タグ)の状態別にスタイルを定義しているんです。
- うーん・・・??
- 今の場合であれば、a:linkはまだアクセスをしたことがないリンク、a:visitedはすでにアクセスしたことのあるリンク、a:hoverは今マウスが乗っているリンクの状態をそれぞれ表しているんです。

- ふむ~。たしかに、<a>タグってそういういろんな状態がありますもんね。
- やはりPHP講座なので深い話は避けますが、このように指定することで、リンクの状態に応じてスタイルを柔軟に変更できるんですよ。
- なるほろ。。。 またひとつCSSの勉強になったわ☆
- うんうん、そうだね~。熊ちゃん、ありがとう!
- いえいえ。それでは私はこの辺で。
- ありがとうございました~。
最後に
- これでスケジューラの画面も整いましたね!
- そうだね。さて、これらに加えて、以前作成していた登録、編集用のschedule_edit.phpも再掲しておこう。
schedule_edit.php
<?php
$filename = "samplefile.txt";
if (isset($_POST["regist"])) {
// 登録の処理を開始する
// 入力チェック
$error_message = array();
if (isset($_POST["year"]) && is_numeric($_POST["year"])
&& $_POST["year"] > 2000) {
$year = $_POST["year"];
} else {
$error_message[] = "年を正しく入力してください。";
}
if (isset($_POST["month"]) && is_numeric($_POST["month"]) &&
$_POST["month"] > 0 && $_POST["month"] < 13) {
$month = $_POST["month"];
} else {
$error_message[] = "月を正しく入力してください。";
}
if (isset($_POST["day"]) && is_numeric($_POST["day"]) &&
$_POST["day"] > 0 && $_POST["day"] < 32) {
$day = $_POST["day"];
} else {
$error_message[] = "日を正しく入力してください。";
}
if (isset($_POST["title"]) && $_POST["title"]) {
if (strstr($_POST["title"], "|")) {
$error_message[] =
"申し訳ありませんが、タイトルに|文字は使えません。";
} else {
$title = $_POST["title"];
}
} else {
$error_message[] = "タイトルを入力してください。";
}
if (isset($_POST["body"]) && $_POST["body"]) {
if (strstr($_POST["body"], "|")) {
$error_message[] = "申し訳ありませんが、内容に|文字は使えません。";
} else {
$body = $_POST["body"];
}
} else {
$error_message[] = "内容を入力してください。";
}
if (!count($error_message)) {
// 内容の改行を<br>タグに変換する
$body = str_replace(array("\r\n", "\r", "\n"), "<br>", $body);
$schedule_date = sprintf("%04d%02d%02d", $year, $month, $day);
$new_line = $schedule_date."|".$title."|".$body."\n";
if (isset($_POST["lineno"])) {
schedule_edit($filename, $_POST["lineno"]);
} else {
$fp = fopen($filename, "a");
fwrite($fp, $new_line);
fclose($fp);
}
// カレンダー画面へリダイレクト
header("Location: http://localhost/schedule_calendar.php");
exit;
}
} elseif (isset($_GET["mode"]) && $_GET["mode"] == "delete") {
schedule_edit($filename, $_GET["lineno"]);
header("Location: http://localhost/schedule_calendar.php");
exit;
} else {
if (isset($_GET["lineno"])) {
$lineno = intval($_GET["lineno"]);
$schedule_list = file($filename);
$line = $schedule_list[$lineno];
if (!$line) {
// スケジュールが見つからなかった場合
print("指定されたスケジュールは見つかりません");
exit;
}
list($schedule_date, $title, $body) = explode("|", $line);
$year = intval(substr($schedule_date, 0, 4));
$month = intval(substr($schedule_date, 4, 2));
$day = intval(substr($schedule_date, 6, 2));
}
}
function schedule_edit ($filename, $linenumber) {
$schedule_list = file($filename);
$fp = fopen($filename, "w");
foreach ($schedule_list as $lineno => $original_line) {
if ($lineno == $linenumber) {
if (isset($_GET["mode"]) && $_GET["mode"] == "delete") {
// 何も書き込まない
} else {
fwrite($fp, $GLOBALS["new_line"]);
}
} else {
fwrite($fp, $original_line);
}
}
fclose($fp);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<title>スケジュール登録</title>
<style type="text/css">
h1 {color: #666666; font-size: 1.3em; font-weight: bold;
border-left: 10px solid #99CC99; border-bottom: 2px
solid #99CC99;}
form {color: #333333; background-color: #FFFFFF;}
label {font-weight: bold; color: #333333;
background-color: transparent;}
input, textarea {border: none; color: #333333;
background-color: #FFFFFF;}
#schedule-year {width: 3em; border-bottom: 1px solid #000000;}
#schedule-month {width: 2em; border-bottom: 1px solid #000000;}
#schedule-day {width: 2em; border-bottom: 1px solid #000000;}
#label-year, #label-month, #label-day {margin-right: 5px;}
#schedule-title {margin-bottom: 10px; width: 20em;
border-bottom: 1px solid #000000;}
#schedule-body {width: 20em; height: 15em; border: 1px
solid #000000;}
#regist {font-weight: bold; padding: 3px;
border-top: 3px double #CCCCCC; border-right: 3px
double #333333; border-bottom: 3px double #333333;
border-left: 3px double #CCCCCC; color: #333333;
background-color: #EDECEC;}
#error-message {font-weight: bold; color: #DD5757;
background-color: transparent;}
#error-message li {list-style: circle; line-height: 1.5;}
</style>
</head>
<body>
<h1>スケジュール登録</h1>
<?php
// エラーメッセージを出力する
if (count($error_message)) {
print("<div id=\"error-message\"><ul>");
foreach ($error_message as $message) {
print("<li>".$message."</li>");
}
print("</ul></div>");
}
?>
<form action="schedule_edit.php" method="post">
<input type="text" name="year" id="schedule-year"
value="<?php print(htmlspecialchars($year, ENT_QUOTES)); ?>" />
<label for="schedule-year" id="label-year">年</label>
<input type="text" name="month" id="schedule-month"
value="<?php print(htmlspecialchars($month, ENT_QUOTES)); ?>" />
<label for="schedule-month" id="label-month">月</label>
<input type="text" name="day" id="schedule-day"
value="<?php print(htmlspecialchars($day, ENT_QUOTES)); ?>" />
<label for="schedule-day" id="label-day">日</label>
<dl>
<dt><label for="schedule-title" id="label-title">タイトル </label></dt>
<dd><input type="text" name="title" id="schedule-title"
value="<?php print(htmlspecialchars($title, ENT_QUOTES)); ?>" />
</dd>
<dt><label for="schedule-body" id="labe-body">内容</label></dt>
<dd><textarea name="body" id="schedule-body"><?php
print(htmlspecialchars($body, ENT_QUOTES));
?></textarea>
</dd>
</dl>
<?php
if (isset($_GET["lineno"])) {
?>
<input type="hidden" name="lineno" id="lineno" value=
"<?php print(htmlspecialchars($lineno, ENT_QUOTES)); ?>">
<input type="submit" name="regist" id="regist" value="更新する" />
<?php
} else {
?>
<input type="submit" name="regist" id="regist" value="登録する" />
<?php
}
?>
</form>
</body>
</html>
- 編集後の移動先だけ、カレンダーになるように変更したよ。さぁ、これでスケジューラーの機能はそろって、ひとまず、完成かな。
- ふぅ~、 ここまでくるのにずいぶんかかりましたね(><;)
- そうだね~。でも、だいぶPHPに慣れてきたんじゃないかな?
- そりゃもう。。。基本的な構文とかはもう見慣れてきましたよ!
- よかった☆これで、次にステップアップしていけるなぁ♪

- むむっ、なにやら期待させますね。。。
- うんうん。今までは、本当に基本的なことを説明するために教え切れなかった物も多いからね。これからは、また新しいアプリケーションを作成しながら、もっと様々なことを吸収していこう☆
- おおお~。よぅし、これからもがんばっていこー♪
- 1
- 2
その他の記事も見る
- 第1回 PHPに触れてみよう!
- 第2回 PHPの基礎の基礎
- 第3回 占いソフトを作ろう - rand()関数、配列、連想配列 -
- 第4回 占いソフトを作ろう2 - データ取得・エスケープ・コメント挿入 -
- 第5回 様々なループ構造とPOSTによるデータ送信
- 第6回 入力チェックとエラー表示(1)
- 第7回 入力チェックとエラー表示(2)
- 第8回 セッションの仕組みを知ろう
- 第9回 セッションとHTTPヘッダーの基礎
- 第10回 スケジューラーを作ろう(1) - ファイル操作の基礎知識 -
- 第11回 スケジューラーを作ろう(2) - ファイルへの書き込み -
- 第12回 スケジューラーを作ろう(3) - データの書式整形と一覧表示 -
- 第13回 スケジューラーを作ろう(4) - CSSの基礎知識 -
- 第14回 スケジューラーを作ろう(5) - データの特定方法 -
- 第15回 スケジューラーを作ろう(6) - 削除処理、ユーザー定義関数 -
- 第16回 変数のスコープとデータ型
- 第17回 スケジューラーを作ろう(7) - 処理の関数化、任意の日付の取得 -
- 第18回 スケジューラーを作ろう(8) - タイムスタンプ -
- 第19回 スケジューラーを作ろう(9) - スケジューラー完成 -
- 第20回 掲示板を作ろう(1) -ユーザー定義関数と書き込みフォーム
- 第21回 掲示板を作ろう(2) -init関数とerrorcheck関数
- 第22回 掲示板を作ろう(3) -2重投稿チェックをしてCSVファイルに書き込む
- 第23回 掲示板を作ろう(4) -投稿した掲示板の内容を表示しよう
- 第24回 掲示板を作ろう(5) -掲示板の内容を10件ずつ表示しよう
- 第25回 掲示板を作ろう(6) -掲示板の管理者になって内容を削除しよう
- 第26回 掲示板を作ろう(7) -掲示板の内容を検索しよう
- 第27回 掲示板を作ろう(8) -掲示板についてまとめよう
- >>「Saity先生のPHP基礎講座」一覧ページに戻る
- Saity先生
本名:海原才人 アシアル株式会社所属
PHPスクール講師。同時に、現役システムエンジニアとしてシステム開発も行っている。
携帯電話でWebサイトが見られるようになった事をきっかけに、Webの普及の早さに驚愕し、Webプログラミングに興味をもつ。 その後、PHPによるWebプログラミングと出会い、その習得のしやすさと多機能さに魅了され、数多くのシステム開発をPHPでこなしてきた。 現在は、PHPの魅力とシステム開発で蓄積したノウハウをPHPスクールで多くの人に伝える事に熱意を燃やしている。
「教育において、教わる側が解からない事に罪はなく、教える側が興味を持たせられない事が罪だ」というのが講師としての信念。 生徒にPHPの面白さ・素晴らしさを伝えるため、魅力的な講義を展開する事に全力を注ぐ。




ページのトップへ


一つの目安として、ECサイトの購入情報など絶対に消えてはいけないものはDBに、カートなどの一時的に使用する情報や、ユーザに任意のタイミングで消去されても構わないものはセッションにと使い分けるといいでしょう。