[PHP-users 19018]Re: 月間スケジュールに予定を入れる(質問)
Tadayuki Motoyama
motoyama @ clinks.jp
2003年 11月 19日 (水) 22:19:08 JST
こんばんは。本山です。
>$sql = "select year, month, day, title
>from cal_tbl where year = '$year' and month = '$mon'";
>
>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>");
>}
SQLで当月3件のデータを取得したとすると、
このwhileループは3回実行されます。
そのためelse も3回実行され、
同じデータが3件表示されるのではないでしょうか?
---- >8 ------------------------------- 8< ------------
ついでに、
>$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++){
$mday_last ではなく、$week_max ではないですか?
---- >8 ------------------------------- 8< ------------
同じような処理をするなら、、こんな感じでも出来ると思います。
動作確認してません。
$mday_last = date( "t", mktime(0,0,0,$mon,1,$year,0) ); // 最終日
for ($day=1; $day<=$mday_last; $day++) {
// 年月日指定でデータ取得
$sql = "select year, month, day, title
from cal_tbl where year=$year and month=$mon and day=$day";
$rs = mysql_db_query($db,$sql);
// テーブル出力
print("<TR><TD>$day</TD><TD>曜日</TD><TD>");
while( $row=mysql_fetch_array($rs) ){
print($row["title"]."<BR>");
}
print("</TD></TR>");
mysql_free_result($rs);
}
---- >8 ------------------------------- 8< ------------
がんばってください。
- 以上 -
------------------------
[PHP-users 19014] 月間スケジュールに予定を入れる(質問) from 倉林 巧 <kanae @ kitacity.jp>
Wed, 19 Nov 2003 18:28:22 +0900
>
> 倉林と申します。日頃の皆さまの活動、
> 毎回参考にさせて頂いております。お礼申し上げます。
> また、毎回のご指導ありがとうございます。
>
> (以下、長文にて失礼いたします。)
>
> 今回、月間予定表を作成し、予定を書き込む
> 簡単なスケジューラーを作成しています。
>
> 月間の日にち、曜日などは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 mailing list
> PHP-users @ php.gr.jp
> http://ns1.php.gr.jp/mailman/listinfo/php-users
------------------------------------------
Tadayuki Motoyama : motoyama @ clinks.jp
PHP-users メーリングリストの案内