[PHP-users 19014]月間スケジュールに予定を入れる(質問)
倉林 巧
kanae @ kitacity.jp
2003年 11月 19日 (水) 18:28:22 JST
倉林と申します。日頃の皆さまの活動、
毎回参考にさせて頂いております。お礼申し上げます。
また、毎回のご指導ありがとうございます。
(以下、長文にて失礼いたします。)
今回、月間予定表を作成し、予定を書き込む
簡単なスケジューラーを作成しています。
月間の日にち、曜日などはPHPで出力し、
予定の内容などはMySQLを利用してDBに保存して
指定した月のカレンダー表示と、それに対応する日のデータを、
DBにから抽出して表示させたいと考えています。
予定のある日だけをカレンダー表示することはできるのですが、
#11月23日の予定で1件、26日に2件の予定を登録した場合、
#3件だけのカレンダーとして表示される。
http://www.city.kita.tokyo.jp/sample/001.gif
月のカレンダーを全て表示させた上で、
予定が入っている日だけ、カレンダーの予定欄に予定を表示し、
そのほかの、予定の無い日は、予定欄を空欄で表示させたいと
考えています。
http://www.city.kita.tokyo.jp/sample/003.gif
プログラムしてみた結果、
上記のケースで月に3件のデータがある場合、
毎日3つの行を作成するような状態になってしまいました。
http://www.city.kita.tokyo.jp/sample/002.gif
以下記述です。(一部割愛)
横文字数の関係で、一部見にくくなっております。
//===============================================
// カレンダー用の事前計算
//===============================================
global $PHP_SELF;
// 今日の日付の取得
$today_date = getdate();
$today_year = $today_date['year'];
$today_mon = $today_date['mon'];
$today_mday = $today_date['mday'];
//変数を握っている場合の処理(カレンダー変更処理)
if( empty($year2) ) $year = $today_year;
else $year = $year2;
if( empty($mon2) ) $mon = $today_mon;
else $mon = $mon2;
if(( $year == $today_year )&&( $mon == $today_mon ))
{ $today = $today_mday; } // 本日
else
{ $today = -1; } // あり得ない日
$wday_first = date( "w", mktime(0,0,0,$mon,1,$year,0) );
$mday_last = date( "t", mktime(0,0,0,$mon,1,$year,0) );
$week_max = ceil( ($mday_last + $wday_first)/7 );
// 週毎の表示
for ($i=0; $i<$mday_last; $i++){
// 曜日毎の表示
for ($j=0; $j<7; $j++){
$day = 7*$i + $j - $wday_first + 1;
$countday = 7*$i + $j - $wday_first + 1;
// その月でない日
if ( (($i==0)&&($j<$wday_first)) || ($countday > $mday_last) ){
//print "<td> </td>"; }
}else{
$code = check_holiday($year,$mon,$day);
// 曜日の表示
if ($j == 0) $youbi = "日";
elseif ($j == 1) $youbi = "月";
elseif ($j == 2) $youbi = "火";
elseif ($j == 3) $youbi = "水";
elseif ($j == 4) $youbi = "木";
elseif ($j == 5) $youbi = "金";
elseif ($j == 6) $youbi = "土";
else $youbi = "";
//===============================================
// カレンダーから該当するデータをDBより条件抽出
// primary key は auto_increment で id フィールドを設定
//===============================================
$sql = "select year, month, day, title
from cal_tbl where year = '$year' and month = '$mon'";
$rs = mysql_db_query($db,$sql);
if ($rs == False) {
print("<P>error</P>");
exit;
}
$num = mysql_num_fields($rs);
$rows = mysql_num_rows($rs);
if ($rows == False) {
print("<P>error</P>");
exit;
}
//===============================================
// 日にち、曜日毎の表示方法設定
//===============================================
if ($day == $today){ // 今日の表示
$day_color = "<TD>$countday</TD><TD>$youbi</TD>";
}elseif ($j == 6){ // 土曜日の表示
$day_color = "<TD>$countday</TD><TD>$youbi</TD>";
}elseif ($j == 0){ // 日曜日の表示
$day_color = "<TD>$countday</TD><TD>$youbi</TD>";
}else{ // 平日の表示
$day_color = "<TD>$countday</TD><TD>$youbi</TD>";
}
if ( $code != 0 ){ // 祝日の表示
$holiday = get_holiday($code);
$day_print = "<TD>$countday</TD><TD>$holiday</TD>";
}else{
$day_print = $day_color;
}
//===============================================
// MySQLループ処理
//===============================================
while( $row=mysql_fetch_array($rs) ){
if( $day == $row["day"] ){
if( !empty($row["url"]) ){
print("<TR>".$day_print."<TD>".$row["title"]."</TD></TR>");
}else{
print("<TR>".$day_print."<TD>".$row["title"]."</TD></TR>");
}
//===============================================
// このコメントを外すと該当月の全てのデータが
// 表示されるが、件数分行が増える。002.gif状態
//===============================================
//}else{
// print("<TR>".$day_print."<TD> </TD></TR>");
}
} //MySQLループ終了
} //その月でない日ループ終了
} //曜日毎のループ終了
} //週毎のループ終了
print("</TABLE></DIV>");
//================================記述終了
MySQLのループの処理部分でいろいろ行ってみましたが、
根本的に処理の考え方が間違っているのでしょうか?
何か、良い方法をご教授頂けると幸いです。
[使用環境]
Win2000Pro SP4
Apache 1.3.24
PHP Version 4.2.2
MySQL 3.23.53-max-nt
■■■■■■■■■■■■■■■■■■■■■
倉林 巧 Takumi KURABAYASHI
東京都北区企画部広報課
114-8508 東京都北区王子本町1-15-22
TEL 03-3908-1102 ( 2142 )
FAX 03-3905-3422
■■■■■■■■■■■■■■■■■■■■■
PHP-users メーリングリストの案内