###いま困っていること
関数updtrsによって、予約枠管理テーブルで、予約された日の予約枠に予約済みである1をアップデートして設定したい。
エラーはない物の、テーブルreserveslotがアップデートされない。
###関連ソース
// 予約日時を出力する function product_reserve_time(){ // データベースに接続 $db = new mysqli("localhost", "mrt", "abcdefgh", "mrt"); $db -> set_charset("sjis"); // テーブルtodayのdate(最終更新日のタイムスタンプ(整数型))より以降のレコード数を抽出 $result = $db -> query("select* from today"); print $db -> error; // 抽出したリソースハンドらーから番号配列(0から始まる配列)で一行を受け取る $row = $result -> fetch_assoc(); // $today=(string)$row["date"]; $result = $db -> query("select count(*) from reserveslot where date>={$row['date']}"); $row = $result -> fetch_assoc(); // レコード数が0なら if($row["count"] == 0){ // テーブルtodayから今日の日付を示すタイムスタンプ(整数型の秒単位の数値)を取得 $result = $db -> query("select * from today"); // 取得したリソースハンドラーから連想配列(名前参照型配列)で一行取得 $row = $result -> fetch_assoc(); // データベースからの値は全てstring(文字列形)なのでint(整数型)に直して保存 // ここは関数の中なので$timeはローカル変数 $time = (int)$row["date"]; // テーブルreserve_infoに今日の日付を示すタイムスタンプを含むレコードを挿入query内で変数を使用するときは{}で囲むこと。値が文字列型なら'で囲むことも忘れずに。 $db -> query("insert into reserve_info (date) values({$row["date"]})"); print $db -> error; // $iを0に設定し++(+1)しながら6より小さい間{}の処理を行う。ここでは1週間分の日付のタイムスタンプを含むレコードを挿入している for($i = 0;$i < 6;$i++){ // 1日分の秒数を加えた$timeの値を含むレコードを挿入 $db -> query("insert into reserveslot (date) values('{$time}')"); // $timeに1日分の秒数を加える。60*60*24=86400秒 $time = $time + 86400; print $db -> error; } } // 今日を示すタイムスタンプを含むレコード数が0でなく、7よりもちいさいとき if($row["count"] != 0 && $row["count"] < 7){ // レコード数を整数型に変換して保存 $count = (int)$row["count"]; // 1週間分に足りないレコードの数を計算し保存 $count = 7 - $count; // テーブルreserve_infoに保存されている日付を表すタイムスタンプを含むレコードをタイムスタンプが保存されているdateカラム(列)を基準に降順にソート(並べ替えて)1レコードだけ抽出 $result = $db -> query("select * from reserveslot order by date desc order by date desc limit 1"); // 抽出したリソースハンドラーから連想配列(名前参照型配列)で1行取得 $row = $result -> fetch_assoc(); // 抽出したデータのdateの値をint(整数型)に変換して保存 $time = (int)$row["date"]; // $iを$countの値に設定し++(+1)しながら$countより小さい間{}の処理を行う for($i = 0;$i < $count;$i++){ // $timeに1日分の秒数を加える。60*60*24=86400秒 $time = $time + 86400; // 1日分の秒数を加えた$timeの値を含むレコードを挿入 $db -> query("insert into reserveslot (date) values('{$time}')"); print $db -> error; } } // テーブルtodayのdate以上のタイムスタンプを持つレコードをテーブルreserve_infoから昇順で7レコード抽出 $result = $db -> query("select * from reserveslot where date>=(select date from today) limit 7"); print $db -> error; // 抽出したリソースハンドラーから連想配列(名前参照型配列)で1行\ずつ取得し、$rowがnullでない間{}の処理を行う while($row = $result -> fetch_assoc()){ // dateに相当するラジオボタンを出力し、dateをタイムスタンプとする月と日をidate関数を用いて取り出し明示的に表示をおこなう printf("<input type=\"radio\" name=\"date\" value=\"%s\">%s月%s日", $row["date"], idate("m", $row["date"]), idate("d", $row["date"])); // rsの値をname属性に持つセレクトボックスを作り表示する printf("<select name=\"rs\"><option>----</option>"); // 予約枠1が0(未予約)なら選択肢として追加する以下7枠全てについて同様の処理を行う if($row["rs1"] == 0) print "<option value=\"1\">19:00</option>"; if($row["rs2"] == 0) print "<option value=\"2\">20:30</option>"; if($row["rst3"] == 0) print "<option value=\"3\">22:00</option>"; if($row["rt4"] == 0) print "<option value=\"4\">23:30</option>"; if($row["rs5"] == 0) print "<option value=\"5\">25:00</option>"; if($row["rs6"] == 0) print "<option value=\"6\">26:30</option>"; if($row["rs7"] == 0) print "<option value=\"7\">28:00</option>"; // セレクトボックスの終了タグを出力 print "</select><br><br>"; } // データベースとの接続を終了 $db -> close(); } // 約予約枠をテーブルreserveslotに登録する function updtrs(){ $query = "update table reserveslot set "; switch($_SESSION["time"]){ case 7: $query .= "rs7=1 "; break; case 6: $query .= "rs6=1 "; break; case 5: $query .= "rs5=1 "; break; case 4: $query .= "rs4=1"; break; case 3: $query .= "rs3=1"; break; case 2: $query .= "rs2=1 "; break; case 1: $query .= "rs1=1 "; break; } $query .= "where date='" . $_SESSION["date"] . "'"; $db = new mysqli("localhost", "mrt", "abcdefgh", "mrt"); $db -> query("{$query}"); $db -> close(); }
追記コード
product_reserve_timeを呼び出したすぐ後のページで
if ($_POST["page3"]){ printf("time stamp=%s<br>rs=%s",$_POST["date"],$_POST["rs"]);
ここで、rs値が----になって帰ってきます。
これがアップデートに失敗する原因のような気がしてなりません。
なにか参照方法が間違っているのでしょうか?
###考えられる原因と実装したい機能
テーブルnotes(予約の詳細情報が格納される)には予約枠欄に予約済みの予約枠1-7が繁栄されている。
しかし、一度予約した同一日同予約枠が再度表示されてしまう。
関数updtrs内に問題があるように思えるが、SQLとPHPのどちらに問題があるのか、絞り込めていない。
一度予約が入ると、
その予約枠に他の予約が重複すると困る事象が発生する。
これを回避するために、テーブルreserveslotを作成したが、
どうもうまく活用できていないことを解決すると、とりあえずプロジェクトのうち一つが完成する。
###お願い
全く目が見えないため、
URLだけの提示はご遠慮いただきたく、
修正箇所が把握しやすいよう、元のソースも併記していただけますようご理解とご協力お願いします。
回答3件
あなたの回答
tips
プレビュー