• 締切済み

カレンダーに値を表示する

度々お世話になっています。いつも質問ばかりですみません。 カレンダーにその日付にあった値を表示したいと思っています。 テーブル:acclog フィールド:hidukeには2007-01-01などの日付、$urlには数字が入ってます。下記コードの場合、カレンダーが31個(1月分)できて、1個目全ての日に2007-01-01の数、2個目に2007-01-02の数がでます。素人ながら、for($day=1; checkdate($month,$day,$year);$day++){ あたりが原因かと思い、消す・ずらすなどやってみましたが、ダメでした。お手数ですがよろしくご教授下さい。 $y="2007"; $sql = "select * from acclog where hiduke like '$y-01%'"; $result = mysql_query($sql); ( $result, MYSQL_ASSOC ) ) while($rec = mysql_fetch_array( $result, MYSQL_ASSOC )) { foreach ($rec as $k=>$v) { $rec[$k] = mb_convert_encoding($v,'SJIS','EUC-JP'); } $month=substr($rec[hiduke],5,2); $year=substr($rec[hiduke],0,4); $day=substr($rec[hiduke],8,2); $first_day = mktime( 0,0,0,$month,1,$year);//1日(月初)のタイムスタンプから「曜日」を取得 $first_weekday = date("w",$first_day); echo "<table width='450' border='1'>"; ~一部省略 月などの曜日 echo "<tr>"; $weekday = 0; //1日の曜日まで空欄必要 while ($weekday!=$first_weekday) { echo "<td>&nbsp;</td>"; $weekday++; } for($day=1; checkdate($month,$day,$year); $day++){ if($weekday>6){ $weekday=0; echo "</tr>\n<tr>"; } echo "<td align=center>${day}<br>"; echo "$rec[$url]<br>"; echo "</td>"; $weekday++; //曜日をすすめる } } while($weekday<7){ //最後の空欄作成 echo "<td>&nbsp;</td>"; $weekday++; } echo "</table>";

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

「select *」はプログラム的にはあまりよろしくないですね できるだけ個別要素をセレクトしてください。 またwhileのループの中で処理をだらだらやっているため 何度も1日の情報を得たり、フローの再考が必要です。 やはりwhileでは抜き出し処理だけにとどめることが肝要かと。 #1さんもご指摘なさっていますが "$rec[$url]<br>"; という箇所は "{$rec['url']}<br>"; とするのがよろしいかと思います。

takotan2
質問者

お礼

yambejpさん ご指摘ありがとうございます。朝からもう一度考え直してみましたら、何とかできました。 echo "<table width='168' border='1'>"; ~テーブル省略~ echo "</tr>"; //1日(月初)のタイムスタンプから「曜日」を取得 $first_day = mktime( 0,0,0,1,1,$y); $first_weekday = date("w",$first_day); echo "<tr>"; $weekday = 0; //1日の曜日まで空欄必要 while ($weekday!=$first_weekday) { echo "<td width='24'>&nbsp;</td>"; $weekday++; } $sql = "select $url,hiduke from acclog where hiduke like '$y-01%'"; $result = mysql_query($sql); while($rec = mysql_fetch_array( $result, MYSQL_ASSOC )) { foreach ($rec as $k=>$v) { $rec[$k] = mb_convert_encoding($v,'SJIS','EUC-JP'); } $day=substr($rec[hiduke],8,2); //土曜日まで書いたなら日曜に戻して、行をかえる if($weekday>6){ $weekday=0; echo "</tr>\n<tr>"; } //文字の色を決める switch($weekday){ case 0 ://日曜 $color="red"; break; case 6 ://土曜 $color="blue"; break; default : //月~金 $color="black"; } //1マス表示 echo "<td width='24' align=center><font color=${color} size='2'>${day}<br>"; echo "$rec[$url]"; echo "</font></td>"; //曜日をすすめる $weekday++; } //最後の空欄作成 while($weekday<7){ echo "<td width='24'>&nbsp;</td>"; $weekday++; } echo "</table>";

  • hkd9001
  • ベストアンサー率48% (99/204)
回答No.1

おはようございます。 ええと、下から 10 行目 echo "$rec[$url]<br>"; は、データベースから持ってきた値が連想配列に入っていて それを表示しようとしている命令ですね。ならば echo "$rec[url]<br>"; ( url のアタマの $ は不要 ) と なるべきではないのかなぁ、と思います。

takotan2
質問者

お礼

hkd9001さん #2さんにも書きましたが、朝からもう一度考えなおしたらなんとかなりました。。。 お手数をお掛けして申し訳ございませんでした。。。

takotan2
質問者

補足

hkd9001さん おはようございます。早速のお答えありがとうございます。 説明が足りず申し訳ございませんでした。 このカレンダーは複数あるHPのアクセス数を日毎入力し、表示させるのが目的です。 テーブル:acclog のフィールドは hiduke , サイト名a , サイト名b , サイト名c 2007-01-01 , 150 , 200 , 300 2007-01-02 , 120 , 220 , 290 となっており、前ページから xxx.php?url=サイト名a&y=2007 で 飛んで(?) $y=2007 $url=サイト名a で受けています。 つまり echo "$rec[サイト名a]<br>"; となっているはず(?)なのですが、まずいのでしょうか??? お手数ですがよろしくお願いします。

関連するQ&A