php mysql スケジュールが存在したらリンクをつける方法 - PHPプロ!Q&A掲示板

2837

  • 0P

php mysql スケジュールが存在したらリンクをつける方法

質問日時 / 2010年8月11日 06:25    回答数 / 8件

Questioner:  kokonatu  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

現在Saity先生のPHP基礎講座にあったスケジューラー(PHP&テキストファイル)を
(php&MYSQL)にカスタマイズして勉強しています。

ほぼ同じ内容のものが作成できたのですが
(カレンダー、新規登録、更新は作成完了しています)
スケジュールが存在したらリンクをつけるという部分だけ
何回試しても実装できません。

アドバイス頂けたらと思います。


ここに掲載されているものをベースにしました
http://www.phppro.jp/school/phpschool/vol19/1

以下はポイント部分を抜粋しました。
  1. <?php
  2.   $filename = "samplefile.txt"
  3.   $schedule_list = file($filename);
  4.  
  5.   // スケジュールが存在するかどうかチェックする
  6.   $exist_schedule = false;  
  7.   foreach ($schedule_list as $lineno => $line) {
  8.   list($schedule_date$title$body) = explode("|"$line);
  9.   if ($schedule_date == $year . $month . sprintf("%02d"$day)) { 
  10.   $exist_schedule = true
  11.   break
  12.   }
  13.   }
  14.   // スケジュールが存在したらリンクをつける 
  15.   if ($exist_schedule) {
  16.   print("<td><a href=\"schedule_list.php?year=" .$year .
  17.   "&month="$month . "&day=$day\">$day</a></td>\n");
  18.   }elseif($week[$day] == 0){
  19.   echo "<td><FONT COLOR='RED'>$day</FONT></td>\n";//日曜日の場合の出力
  20.   }elseif($week[$day] == 6){
  21.   echo "<td><FONT COLOR='#0000ff'>$day</FONT></td>\n";//土曜日の場合の出力  
  22.   }else{
  23.   echo "<td>$day</td>\n";//普通の日の出力
  24.   }}
  25. ?>

よろしくお願いいたします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01shimixどう上手くいかないのか(どういう現象になっているの
┃┗A01-1kokonatu返信してくださりありがとうございます。 質問方法
┃ ┗A01-1-1shimixテキストファイル版が動いていて、MySQLへ書き替えっ
┃  ┗A01-1-1-1kokonatushimix様のアドバイスを参考にさせて頂いたところ 無
┣A02magicflute2Parse errorを解消したコードを提示下さい。 『ス
┃┗A02-1kokonatu返信ありがとうございます 質問が適切でなく申し訳あ
┗A03pannna# 一応やっているとは思いますが、もし出力して内容を
 ┗A03-1kokonatu無事に実装することが出来ました、 アドバイス下さり

回答一覧

並び替え:

A01
answerershimix [8月11日 07:23]

どう上手くいかないのか(どういう現象になっているのか)が書かれていないのですが「期待した動作をしない」ときには「変数に期待した値が入っていない」ことが多いので

  1. list($schedule_date, $title, $body) = explode("|", $line);
のあとに
  1. print $schedule_date . '---' . $year . $month . sprintf("%02d", $day) . "<br />" . PHP_EOL;
と入れてその下のif文が真になる条件が存在するかどうか確認されてはどうでしょうか。

#$yearや$monthへの値の代入が見当たらないので(転記時に省略されたのだと思いますが)、
#何がどうなっているかを推測することが難しいです。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerkokonatu [8月11日 22:07]

返信してくださりありがとうございます。

質問方法が適切でなく申し訳ありません、
以下がカスタマイズ前の
PHP&テキストファイル仕様の完成ソースです。

  1. <?php 
  2.  
  3. // カレンダーの年月をタイムスタンプを使って指定 
  4. if (isset($_GET["date"]) && $_GET["date"] != "") { 
  5.  $date_timestamp = $_GET["date"]
  6. } else { 
  7.  $date_timestamp = time()
  8. } 
  9. $month = date("m"$date_timestamp)
  10. $year = date("Y"$date_timestamp)
  11.  
  12. $first_date = mktime(000$month1$year);  
  13. $last_date = mktime(000$month + 10$year);  
  14.  
  15. // 最初の日と最後の日の「日にち」の部分だけ数字で取り出す。 
  16. $first_day = date("j"$first_date)
  17. $last_day = date("j"$last_date)
  18.  
  19. // 全ての日の曜日を得る。 
  20. for($day = $first_day$day <= $last_day$day++) { 
  21.  $day_timestamp = mktime(000$month$day$year)
  22.  $week[$day] = date("w"$day_timestamp)
  23. } 
  24.  
  25. ?> 
  26.  
  27. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  28. "http://www.w3.org/TR/xhtml1
  29. <<CODE"http://www.w3.org/TR/xhtml1/DTD/xht
  30. <<CODEwww.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  31. <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> 
  32. <head> 
  33. <title>カレンダー</title> 
  34. <style type="text/css"> 
  35.  a:link {color: #3366FF; background-color: transparent;  
  36.  text-decoration: none; font-weight: bold;} 
  37.  a:visited {color: #2B318F; background-color: transparent;  
  38.  text-decoration: none; font-weight: bold;} 
  39.  a:hover {color: #00BFFF; background-color: transparent; 
  40.  text-decoration: underline;} 
  41.  body {color: #333333; background-color: #FFFFFF;} 
  42.  table {border: 1px solid #CCCCCC; border-collapse: collapse; 
  43.  margin-bottom: 1em;} 
  44.  td {border: 1px solid #CCCCCC; width: 2.5em; height: 2.5em; 
  45.  text-align: right; vertical-align: bottom; padding: 2px;} 
  46.  th {border: 1px solid #CCCCCC; color: #333333; 
  47.  background-color: #F0F0F0; padding: 5px;} 
  48. </style> 
  49. </head> 
  50. <body> 
  51. <table border="1"> 
  52.  <tr> 
  53.   <th colspan="2"><a href="schedule_calendar.php?date
  54. <?php print(strtotime("-1 month"$first_date))?>">前月</a></th> 
  55.   <th colspan="3"><?php print(date("Y"$date_timestamp) . "" . date("n"$date_timestamp) . "")?></th> 
  56.   <th colspan="2"><a href="schedule_calendar.php?date
  57. <?php print(strtotime("+1 month"$first_date))?>">次月</a></th> 
  58.  </tr> 
  59.  <tr> 
  60.   <th>日</th> 
  61.   <th>月</th> 
  62.   <th>火</th> 
  63.   <th>水</th> 
  64.   <th>木</th> 
  65.   <th>金</th> 
  66.   <th>土</th> 
  67.  </tr> 
  68.  <tr> 
  69.   <?php 
  70.   // カレンダーの最初の空白部分 
  71.   for ($i = 0$i < $week[$first_day]$i++) { 
  72.    print("<td></td>\n")
  73.   } 
  74.  
  75.   for ($day = $first_day$day <= $last_day$day++) { 
  76.    if ($week[$day] == 0) { 
  77.     print("</tr>\n<tr>\n")
  78.    } 
  79.  
  80.   $filename = "samplefile.txt";  
  81.   $schedule_list = file($filename)
  82.   
  83.   // スケジュールが存在するかどうかチェックする 
  84.   $exist_schedule = false;   
  85.   foreach ($schedule_list as $lineno => $line) { 
  86.   list($schedule_date$title$body) = explode("|"$line)
  87.   if ($schedule_date == $year . $month . sprintf("%02d"$day)) {  
  88.   $exist_schedule = true;  
  89.   break;  
  90.   } 
  91.   } 
  92.   // スケジュールが存在したらリンクをつける  
  93.   if ($exist_schedule) { 
  94.   print("<td><a href=\"schedule_list.php?year=" .$year . 
  95.   "&month="$month . "&day=$day\">$day</a></td>\n")
  96.   }elseif($week[$day] == 0){ 
  97.   echo "<td><FONT COLOR='RED'>$day</FONT></td>\n";//日曜日の場合の出力 
  98.   }elseif($week[$day] == 6){ 
  99.   echo "<td><FONT COLOR='#0000ff'>$day</FONT></td>\n";//土曜日の場合の出力   
  100.   }else{ 
  101.   echo "<td>$day</td>\n";//普通の日の出力 
  102.   }} 
  103.  
  104.   // カレンダーの最後の空白部分 
  105.   for ($i = $week[$last_day] + 1$i < 7$i++) { 
  106.    print ("<td></td>\n")
  107.   } 
  108.   ?> 
  109.  </tr> 
  110. </table> 
  111. <a href="schedule_edit.php">スケジュールの新規作成</a> 
  112. </body> 
  113. </html>

samplefile.txtの中には
下記のように『|』で区切ったデータが入っています


20100801|タイトル|ボディ
20100815|テスト|テスト2
20100829|テスト3|テスト3


上のコードではPHP&テキストファイル仕様で
スケジュールが存在したらリンクをつけるという処理が
実装されています


これと同じことを
PHP&MYSQL仕様で出来ないかと思い試行錯誤しています


MYSQLデータベースのテーブルには

1 2010-10-05 タイトル 内容
2 2010-11-24 学校訪問 10時に訪問予定
3 2011-02-12 山    山に登る

このようなデータが入っています

そして下記のコード部分をsamplefile.txtから
チェックしてやるのではなく

新たに作ったmysqlデータベースのテーブルから
チェックしてデータがあった場合は
リンクをつけるに変えたいと思っています。

  1. $filename = "samplefile.txt";  
  2.   $schedule_list = file($filename); 
  3.  
  4.  // スケジュールが存在するかどうかチェックする 
  5.   $exist_schedule = false;   
  6.   foreach ($schedule_list as $lineno => $line) { 
  7.   list($schedule_date, $title, $body) = explode("|", $line); 
  8.   if ($schedule_date == $year . $month . sprintf("%02d", $day)) {  
  9.   $exist_schedule = true;  
  10.   break;  
  11.   } 
  12.   } 
  13.   // スケジュールが存在したらリンクをつける  
  14.   if ($exist_schedule) { 
  15.   print("<td><a href=\"schedule_list.php?year=" .$year . 
  16.   "&month=". $month . "&day=$day\">$day</a></td>\n"); 
  17.   }elseif($week[$day] == 0){ 
  18.   echo "<td><FONT COLOR='RED'>$day</FONT></td>\n";//日曜日の場合の出力 
  19.   }elseif($week[$day] == 6){ 
  20.   echo "<td><FONT COLOR='#0000ff'>$day</FONT></td>\n";//土曜日の場合の出力   
  21.   }else{ 
  22.   echo "<td>$day</td>\n";//普通の日の出力 
  23.   }}


mysqlでこれと同じ処理にならないかと思い
下記のコードを書きました。


  1. //これより↑の部分でmysqlの接続などは終了させておいて
  2. $mysql->query("SELECT * FROM schedule WHERE holding between '$year-$month-$first_date' and '$year-$month-$last_day'");
  3. //検索した結果を配列に入れる
  4.  
  5. while($row = $mysql->fetch()){
  6.   $no = $row["no"];
  7.   $kaisaibi = $row["kaisaibi"];
  8.         $kaisaibi=str_replace("-","",$kaisaibi);
  9.         if ($kaisaibi == $year . $month . sprintf("%02d", $day)){
  10.         $exist_schedule = true; 
  11.          break; 
  12. }}
  13.   // スケジュールが存在したらリンクをつける  
  14.   if ($exist_schedule) { 
  15.   print("<td><a href=\"schedule_list.php?year=" .$year . 
  16.   "&month=". $month . "&day=$day\">$day</a></td>\n"); 
  17.   }elseif($week[$day] == 0){ 
  18.   echo "<td><FONT COLOR='RED'>$day</FONT></td>\n";//日曜日の場合の出力 
  19.   }elseif($week[$day] == 6){ 
  20.   echo "<td><FONT COLOR='#0000ff'>$day</FONT></td>\n";//土曜日の場合の出力   
  21.   }else{ 
  22.   echo "<td>$day</td>\n";//普通の日の出力 
  23.   }}

このように記述してそっくりコードを入れ替えたら
同じ処理にならないかと思い試したのですが
同じように動作してくれません

初心者のためまったく見当違いの質問をしていたら
申し訳ありません。

また長文失礼しましたm(_ _)m

この意見に回答する

ツリーへ TOPへ

A01-1-1 満足
replyershimix [8月11日 23:15]

テキストファイル版が動いていて、MySQLへ書き替えってことですか?何故最初の質問で、それを書かなかったんでしょう。理解出来ません。

MySQLに行く前に、ちょっと気になったのですが
  1. $date_timestamp = $_GET["date"];
これ、ちゃんと動きますか?strtotimeとかで変換しないとマズイ気がするんですが・・。それともフォーム側でsubmit時にJavaScriptか何かでtimestamp値をセットしているんでしょうか?


本題のMySQLのテーブルから取得する件ですが

  1. $kaisaibi = $row["kaisaibi"];
  2. $kaisaibi=str_replace("-","",$kaisaibi);
のあとに
  1. print $row["kaishibi"] . '--->' . $kaishibi . '<br />' . PHPEOL;
とでも入れてどういう表示になるか確認してください(デバッグの基本だと思うのですが・・)。

未検証ですがsql文を
  1. $mysql->query("SELECT *, UNIX_TIMESTAMP(kaishibi) as tstamp FROM schedule WHERE holding between '$year-$month-$first_date' and '$year-$month-$last_day'");
としておいて、
  1. $kaishibi = date('Ymd', $row["tstamp"]);
とかじゃないですかねぇ・・。もちろんSQLで(UNIX_TIMESTAMPでなく)DATE_FORMATを使って直接Ymd形式の文字列で取得してもいいかもしれません。お好みでどうぞ。もしかしたらSQL文は現在のままで
  1. $kaishibi = date('Ymd', strtotime($row["kaishibi"]));
でもいけるかもしれません、いろいろ試してみてください。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerkokonatu [8月12日 12:48]

shimix様のアドバイスを参考にさせて頂いたところ
無事実装することができました。

勉強が先に進めることが出来ます。

こういった質問の掲示板に書くのは
始めてで質問の方法や適切な質問の仕方についても
不備があり申し訳ありませんでした。

そういったことも含めて
今度しっかりと学んでいこうと思います。

本当にありがとうございました。

この意見に回答する

ツリーへ TOPへ

A02
answerermagicflute2 [8月11日 14:40]

Parse errorを解消したコードを提示下さい。

『スケジュールが存在したらリンクをつける』は、
foreachの中ですか?外ですか?

この意見に回答する

ツリーへ TOPへ

A02-1
replyerkokonatu [8月11日 22:09]

返信ありがとうございます
質問が適切でなく申し訳ありませんでした。

新たに書かせていただきました
よろしくお願いいたします。

この意見に回答する

ツリーへ TOPへ

A03 満足
answererpannna [8月12日 04:09] (最終編集:8月12日 04:10)

# 一応やっているとは思いますが、もし出力して内容を確認しているのであれば
# 的外れな内容ですので無視して下さい

スケジュールが存在するかどうかの判定をしている評価対象の変数に、
判定で真となる値が入っているかどうかをechoなりprintなりで出力してみて下さい。

単純に変数に値が入っていないか、判定で偽になる書式の文字列が入っているだけじゃないかと思います。

この意見に回答する

ツリーへ TOPへ

A03-1
replyerkokonatu [8月12日 12:50]

無事に実装することが出来ました、
アドバイス下さりありがとうございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)