重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

はじめて投稿させていただきます。
php初心者です。
本やネットで検索し、ifやforeachやarraysearchやforやといろいろ試していますが、12時間以上かかり、まだ苦戦しています。
これかと思うものをいろいろ書いてみましたが、ほんとに単純な一文でできるように思うのですが、基礎知識が未熟でうまくいきません。


やりたいことは、予約テーブルの時間帯ごとの予約済人数を出し、予約枠(50)から引いて残席数を時間帯ごとに出力。
残席数がない場合は、ラジオボタンを選択できなくする。

$yo_time=$timezon[$i] の時の$goukeiの値をfor文の中で出力したいのですが、どうしても中に組み込めません。
レベルが低くて大変申し訳ないですが、ご教授お願いいたします。




<データベース>
予約テーブル:予約日 予約時間帯 予約人数


20/11/13 17:00 25
20/11/15 17:00 10
20/11/15 19:00 20
20/11/15 20:00 50


-省略-

$waku=50;

$sql='SELECT yo_time,sum(ninzu) as goukei FROM yo_table WHERE yo_date=? group by yo_time order by yo_time';
$stmt=$dbh->prepare($sql);
$data[]=$date;
$stmt->execute($data);

$dbh=null;

$timezone=array('17:00','18:00','19:00','20:00','21:00');
for($i=0;$i<count($timezone);$i++)
{
while(true)
{
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
$yo_time=$rec['yo_time'];
$goukei=$rec['goukei'];
if($rec==false)
{
break;
}

$goukei=[$goukei=>$yo_time];
$goukei=array_search($timezone[$i],$goukei);

}

print '<input type="radio" name="time" value="'.$timezone[$i].'" />'.$timezone[$i].'残席数:'.$waku-$goukei[$i].'<br />';
}

<希望出力形式>
〇17:00 残席数 40
〇18:00 残席数 50
〇19:00 残席数 30
 20:00 残席数 満席
〇21:00 残席数 50

質問者からの補足コメント

  • MYSQLです。

    予約がないタイムゾーン内の枠も表示したいです。

    $waku=50;
    と書きましたが、

    予約枠テーブル:予約日 予約枠
    20/11/13 40
    20/11/15 50

    と別テーブルがあり、そこから、$wakuへ引っ張っています。

    日付は、同フォーム内の上部で日付を選ぶとその日付に合わせて、希望出力形式になるのが目標なのですが、現在同じformの中ではうまく値を渡せず、前ページで日付を選択し、formで渡してきて$dateに入れて絞り込み条件にしています。

      補足日時:2020/11/14 22:21

A 回答 (4件)

printの位置が間違ってました。


下記が訂正です。

$rec=$stmt->fetch(PDO::FETCH_ASSOC);
$timezone=array('17:00','18:00','19:00','20:00','21:00');

foreach($timezone AS $time){
foreach($rec AS $record){
if($time != $record['yo_time']){
$nokori = $waku;
} else {
$nokori = $waku - $record['goukei'];
}
}
print '<input type="radio" name="time" value="'.$time.'" />'.$time.'残席数:'.$nokori.'<br />'."\n";
}
    • good
    • 0
この回答へのお礼

無事で来ました。ありがとうございました!!!

お礼日時:2020/11/24 22:38

ちょっと美しくない上に、デバッグしてませんが…


雰囲気としてはこんな感じでしょうかね。

$rec=$stmt->fetch(PDO::FETCH_ASSOC);
$timezone=array('17:00','18:00','19:00','20:00','21:00');

foreach($timezone AS $time){
foreach($rec AS $record){
if($time != $record['yo_time']){
{
$nokori = $waku;
} else {
$nokori = $waku - $record['goukei'];
}
print '<input type="radio" name="time" value="'.$time'" />'.$time.'残席数:'.$nokori.'<br />';
}
}
    • good
    • 0
この回答へのお礼

ありがとうございます!!本当に助かります。

書いてみたのですが、
17:00 50
17:00 50
18:00 50
18:00 50




というように2行ずつで、全部50になってしまいました。
if($time != $record['yo_time']){
の最後の{を消したのですが、それがいけないでしょうか?

お礼日時:2020/11/16 06:44

ゴメンナサイ、追伸です。



例示されてるテーブル内容の予約人数をコピペミスしてるので、私の出力例の人数が違ってました。
正しくは↓です。

予約日 予約時間帯 予約合計 残席数
2020-11-13 17:00:00 25 25
2020-11-15 17:00:00 10 40
2020-11-15 19:00:00 20 30
2020-11-15 20:00:00 50 0

ちなみに、クエリはMySQLを想定しての例示です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
日付で絞っているので、11/15を選択すると、

2020-11-15 17:00:00 40
2020-11-15 19:00:00 30
2020-11-15 20:00:00 0

とまではできるのですが、

issetを使うのかと書いてみるのですが、
&timezoneにない場合50を表示したく、

2020-11-15 17:00:00 40
2020-11-15 18:00:00 50
2020-11-15 19:00:00 30
2020-11-15 20:00:00 0
2020-11-15 21:00:00 50

という表示ができません。

お礼日時:2020/11/15 07:17

DBのクエリ側でもう少し加工してから処理したほうが簡単じゃないでしょうか。



SELECT 予約日
,予約時間帯
,sum(予約人数) AS '予約合計'
, 50 - sum(予約人数) AS '残席数'
FROM 予約テーブル
GROUP BY 予約日,予約時間帯

予約日 予約時間帯 予約合計 残り
2020-11-13 17:00:00 25 25
2020-11-15 17:00:00 10 40
2020-11-15 19:00:00 30 20
2020-11-15 20:00:00 40 10

これをforで回した方が簡単かと。
    • good
    • 0
この回答へのお礼

早速お返事ありがとうございます!!
本当に困っているので、とても助かります。

とてもすっきりしますね。
満席な時間帯は元から非表示にしちゃうと簡単なのですね!

でも、予約がない時間帯は50とだしたいのですが、それをfor文で出力できるのでしょうか?

お礼日時:2020/11/14 21:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!