[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>&nbsp;</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>&nbsp;</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 メーリングリストの案内