- ベストアンサー
phpカレンダー 縦型から格子型へ
- phpを使用して縦型のカレンダー表示から格子型のカレンダー表示に変更したい
- 既存のスクリプトを利用し、カレンダーを表すテーブルに変更を加えたい
- 変更する内容は、日付ごとに部屋の予約状況を表示すること
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>縦型の時の動作は、キチンと動いていてfunctionは以下の通りとなっています。 そういうfunctionであれば、最初のものをちょっと改造して <?php $yy = 2008; // ここは適宜書き替えてください $mm = 6; // 同 上 $roomid = ''; // 多分POSTされたroomid(もしくは一番外側でLoopしているのかな・・) $first = mktime(0, 0, 0, $mm, 1, $yy); $maxdd = date('j', strtotime('+1 month', $first) - 1); $dd = 1; $stcol = date('w', $first)+ 1; print "<table>\n"; do { print "<tr>"; for ($col = 1; $col <= 7; $col++) { if ($dd > $maxdd) { break; } print "<td>"; if ($col >= $stcol) { print yoyakuchk($yy . $mm . $dd, $roomid); // この部分だけ書き替え $dd++; } print "</td>"; } print "</tr>\n"; $stcol = 0; } while ($dd <= $maxdd); print "</table>\n"; ?> では?最初の回答で$ddの部分に「テーブルに表示する内容」ってコメントしていたと思います。 現状、おそらく一番外のLoopが「group by roomid」だとは思うのですが、SQL文もないしこれ以上は推測できませんでした(汗 あと・・どこで年月や部屋番号をセットすればいいかは全体が見えている質問者さんでないと無理ですよ。全部のソースを提示していただくわけにもいきませんし。私が提示そたソースは年月などは決め打ちにしてますが、適宜書き替えて調整していただかないといけません。 (雑感) そもそもroomid,roomnameのroom_tableと、roomid,hiduke,yoyakuのyoyaku_tableに分けるべきだと思います。そうすればroom_tableが一番外のLoop(部屋名表示)、内側のカレンダー表示にyoyaku_tableのLoop(roomid指定)が入ればわかりやすいと思います。
その他の回答 (4)
- shimix
- ベストアンサー率54% (865/1590)
>と全て3/1のデータの読み込みとなってしましました。 >for ($i = 1; $i <= $maxdd; $i++) {の場所でしょうか? いえ、おそらくは print yoyakuchk($yy . $mm . $dd, $roomid); で正しくデータを取得できていないのだろうと思います。渡すものが $yy . $mm . $dd と $roomid で問題ないかどうか、再確認してください。私は「多分こうだろう」と思って書きましたが、functionの中で何も変換していないようなので、日付型にして渡さないといけないかもしれません。 >それとDB名が分かりにくいと思ってしまい、省略していたのですが、 かえってわかりにくくなってます。「これでどういうSQL文で取得できているんだろう」と余計なことを考えざるを得なくなります(汗)。roomid、roomnameなどは単に定数にして書いた方がわかりやすいです(実際には何らかの値がPOSTされるか、そこまでに与えられるというのはわかりますので)。「再現可能なミニマムコード」を心掛けるといいと思いますよ。
お礼
お返事ありがとうございます。 確かにその通りですね。今後心掛けていく所存でございます。 おかげ様で、解明致しました。 // 予約データ存在チェック function yoyakuchk($hiduke,$roomid) { global $conn; $sql = "SELECT * FROM room " . " WHERE roomid = " . $roomid . " AND hiduke = '" . $hiduke . "'"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); $row = mysql_fetch_array($res, MYSQL_ASSOC); if (mysql_num_rows($res) > 0) { $tmp = cnv_dispstr($row["yoyaku"]) ; } else { $tmp = "--"; } return $tmp; } functionでのhidukeの格納に合わせて、 print $dd . "<br />" . yoyakuchk($yyyy . "/" . $mm . "/" . $dd, $roomid); とし、無事に表示できました。 とても勉強になりました! 貴重なお時間本当にありがとうございました!
- shimix
- ベストアンサー率54% (865/1590)
>データベース 「table room」の方は、 >|roomid |roomname |hiduke |yoyaku| >|1 |name | 2007-09-01|○(△など)| >となっております。 $i = date('j', $row['hiduke']); $stat[$i] = $row['yoyaku']; ではダメでしょうか? テーブル定義がわかりませんから仮に$stat[]という配列にしましたが、そのあたりは適宜読み替えてください。 元質問で表示に使っている yoyakuchk($ymd,$roomid) というfunctionなどは、私にはどういう内容か推測も出来ません。そもそもmysql_queryに渡す$sqlの中身もソースには書かれていないのです。おそらく部屋番号がPOSTされて、その部屋番号と部屋名などをヘッダに表示・その下に予約状況を表示だとは推測出来たのですが(なので、部屋番号、部屋名の表示のあとの部分しか提示していません)それ以上はエスパーではないので無理です。 「縦型の表示はキチンと動作している」のはもちろんですが、縦書きのスクリプトで「どこで何をしているかが理解できている」という前提で書いています。なので提示された縦書きのスクリプトでちょっとおかしいかな?と思う部分($sqlへのセットが書かれていないなど)には言及していません。そのあたりは元ソースのままでいいハズだという前提です。
お礼
貴重なお時間のをさいていただき本当にありがとうございます。 朝からずっと試行錯誤していたのですが、だんだんと自分で分からない箇所がわかってきました。縦型の時の動作は、キチンと動いていてfunctionは以下の通りとなっています。 // 予約データ存在チェック function yoyakuchk($hiduke,$roomid) { global $conn; $sql = "SELECT * FROM room " . " WHERE roomid = " . $roomid . " AND hiduke = '" . $hiduke . "'"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); $row = mysql_fetch_array($res, MYSQL_ASSOC); if (mysql_num_rows($res) > 0) { $tmp = cnv_dispstr($row["yoyaku"]) ; } else { $tmp = "--"; } return $tmp; } DBに記述がある場合は、"yoyaku(○、△など)"を、 空の場合は"--"を表示するようになっています。 縦型での動作は何となく理解できている程度で、ANo.2の様に $dd++ の代わりに日付データを配列に入れたいのですが、 <?php for ($i = 1; $i <= $maxdd; $i++) { $stat[$i] = ''; } $res = mysql_query($sql, $conn) or die("データ抽出エラー"); while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { $ts = mktime(0, 0, 0, $mm, $i, $yyyy); $ymd = date("Y/m/d", $ts); $roomid = $row["roomid"]; ○○○○○○○○○○○○//格納がどうしてもわかりません } $dd = 1; $stcol = date('w', $first)+ 1; print "<table>\n"; do { print "<tr>"; for ($col = 1; $col <= 7; $col++) { if ($stat[$dd] > $maxdd) { break; } //変更の仕方がわかりません print "<td>"; if ($col >= $stcol) { print $stat[$dd]; //変更の仕方がわかりません $stat[$dd]++; //変更の仕方がわかりません } print "</td>"; } print "</tr>\n"; $stcol = 0; } while ($stat[$dd] <= $maxdd); //変更の仕方がわかりません print "</table>\n"; ?> yoyakuchk($ymd,$roomid)をどう使っていいかもわかりません。 説明が不十分でなんどもお手間をとらせて申し訳ありませんが、よろしくお願い致します。
- shimix
- ベストアンサー率54% (865/1590)
データベースから読み込みながら表示しようとすると日付に空きがあったときに大変です。最初に「年月指定」でMySQLからデータを読んで、データを配列に(添え字を「日」にして)格納しておけばいいのでは? データベースの設計がどうなっているかわかりませんが for ($i = 1; $1 <= $maxdd; $i+) { $stat[$i] = ''; } while ($row = mysql_fetch_array(・・・) { $i = date('j', $row['date']); $stat[$i] = $row['stat']; } としておいて、 print $dd; の代わりに print stat[$dd]; とすればいいでしょう。
お礼
お返事ありがとうございます。 何度もお手数おかけして申し訳ありません。 データベース 「table room」の方は、 |roomid |roomname |hiduke |yoyaku| |1 |name | 2007-09-01|○(△など)| となっております。 MySQLからデータを読んで、データを配列に格納しておけばいいのではないかということは、理解できたのですが 以下パーツの組み合わせ?方がやはり分かりません。 <?php for ($i = 1; $1 <= $maxdd; $i+) { $stat[$i] = ''; } $res = mysql_query($sql, $conn) or die("データ抽出エラー"); while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { $i = date('j', $row['date']); $stat[$i] = $row['stat']; $roomid = $row["roomid"]; $yoyaku = $row["yoyaku"]; } $first = mktime(0, 0, 0, $mm, 1, $yyyy); $maxdd = date('j', strtotime('+1 month', $first) - 1); $dd = 1; $stcol = date('w', $first)+ 1; print "<table>\n"; do { print "<tr>"; for ($col = 1; $col <= 7; $col++) { if (stat[$dd] > $maxdd) { break; } print "<td>"; if ($col >= $stcol) { print stat[$dd]; stat[$dd]++; } print "</td>"; } print "</tr>\n"; $stcol = 0; } while (stat[$dd] <= $maxdd); print "</table>\n"; ?> この記述では表示されないのは分かっているのですが・・ for ($col = 1; $col <= 7; $col++) { の部分と for ($i = 1; $1 <= $maxdd; $i+) { $stat[$i] = ''; を差し替えるなどしてみても、勉強不足で理解できていないため手詰まりになります。 またもお手数お掛けいたしまして申し訳ありませんが、ご指南頂けませんでしょうか? どうかよろしくお願いいたします。
- shimix
- ベストアンサー率54% (865/1590)
カレンダーってけっこう練習問題的に自分で作ってみたりしませんかね。ずいぶん昔に書いたのがあったので(苦笑) <?php $yy = 2008; // ここは適宜書き替えてください $mm = 6; // 同 上 $first = mktime(0, 0, 0, $mm, 1, $yy); $maxdd = date('j', strtotime('+1 month', $first) - 1); $dd = 1; $stcol = date('w', $first)+ 1; print "<table>\n"; do { print "<tr>"; for ($col = 1; $col <= 7; $col++) { if ($dd > $maxdd) { break; } print "<td>"; if ($col >= $stcol) { print $dd; // テーブルに表示する内容 $dd++; } print "</td>"; } print "</tr>\n"; $stcol = 0; } while ($dd <= $maxdd); print "</table>\n"; ?>
お礼
ありがとうございます。 返事が遅れてしまいまことに申し訳ありません。 説明が不十分であったのですが、 | |1|2|3|4|5|6| |○|×|△|○|○|×|×| の「○」「△」「×」などは、MySQLから読み込んでいます。 色々試してみたのですが、 <? while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { ・・・ ?> がどこにあてはめていいかがやっぱりわかりませんでした。 今一度参考となるソースをご指南頂けませんでしょうか? よろしくお願いいたします。
お礼
さっそくのお返事ありがとうございます。 よく理解しておらずどの部分を抽出してご説明すればいいかもわかっておりませんでした。申し訳有りません。 現在、 <?php $first = mktime(0, 0, 0, $mm, 1, $yyyy); $maxdd = date('j', strtotime('+1 month', $first) - 1); for ($i = 1; $i <= $maxdd; $i++) { } $res = mysql_query($sql, $conn) or die("データ抽出エラー"); while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { $ts = mktime(0, 0, 0, $mm, $i, $yyyy); $ymd = date("Y/m/d", $ts); $roomid = $row["roomid"]; } $dd = 1; $stcol = date('w', $first)+ 1; print "<table>\n"; do { print "<tr>"; for ($col = 1; $col <= 7; $col++) { if ($dd > $maxdd) { break; } print "<td>"; if ($col >= $stcol) { print $dd . "<br />" . yoyakuchk($ymd, $roomid);//差し替えました $dd++; } print "</td>"; } print "</tr>\n"; $stcol = 0; } while ($dd <= $maxdd); print "</table>\n"; ?> としましたところ、カレンダー形式で上手く表示されているんですが | | | | | | |1| |○|○|○|○|○|○|○| |2|3|4|5|6|7|8| |○|○|○|○|○|○|○| と全て3/1のデータの読み込みとなってしましました。 for ($i = 1; $i <= $maxdd; $i++) {の場所でしょうか? 何度も申し訳ありませんがお願い致します。 ※DBのyoyakuには、「3/1=○」「3/2=△」しか入っていません。 それとDB名が分かりにくいと思ってしまい、省略していたのですが、 roomid,roomname(部屋名)のroomid_table、 roomid,hiduke,yoyaku,roomname(予約者名)のroom_table と作成しております。(部屋は1つしかありませんが)