0

この質問に関して..

PHP 予約時間帯

'GROUP BY' id_timeslot を試してみましたが、予約されたタイムスロットが利用できないことを示しているだけなので、まだ機能しませんでした

私はその解決策を試しましたが、エラーが発生し、「coelence」の使用方法がよくわかりません

table timeslot  (id_timeslot integer);
table doctor (id_doctor integer);
table bookslot  (id_bookslot, id_doctor, id_timeslot integer);

insert into doctor (id_doctor)
values (1 = doc_A), (2 = doc_B), (3 = doc_C);

insert into TimeSlot (id_timeslot)
values (1 = 10:00:00), (2 = 10:15:00), (3 = 10:30:00), (4 = 10:45:00);

insert into bookslot (id_doctor,id_timeslot)
values (1,1), (1,5), (2,1), (2,4), (3,1);

mysql テーブルに参加する

$q = $mysqli->query("SELECT * FROM bookslot 
  RIGHT JOIN timeslot ON bookslot.id_timeslot = timeslot.id_timeslot
  LEFT JOIN doctor ON bookslot.id_doctor = doctor.id_doctor ");

結果をエコーし​​、今日の日付と一致するかどうかを確認するか、利用可能に設定します

while($r = $q->fetch_array(MYSQLI_ASSOC)) :

 echo '<tr>';
 echo '<td align="center">' . $r['times']  . '</td>';

 if($r['booked_date'] == date('Y-m-d') && $r['id_doctor'] == 1):
  echo '<td><a href="#available" class="booked">booked</a></td>';
 else :
  echo '<td><a href="#" class="available">available</a></td>';
 endif;

 if($r['booked_date'] == date('Y-m-d') && $r['id_doctor'] == 2):
  echo '<td><a href="#available" class="booked">booked</a></td>';
 else :
  echo '<td><a href="#" class="available">available</a></td>';
 endif;

 if($r['booked_date'] == date('Y-m-d') && $r['id_doctor'] == 3):
  echo '<td><a href="#available" class="booked">booked</a></td>';
 else :
  echo '<td><a href="#" class="available">available</a></td>';
 endif;

echo '</tr>';

endwhile;

ウェブページからの結果 代替テキスト

そして、私は結果を次のようにしたい:

id_timeslot  doc_A    doc_B    doc_C
----------------------------------------------
1            booked     booked     booked
2            available  available  available
3            available  available  available
4            available  booked     available
5            booked     available  available

他の解決策をお願いします!

4

3 に答える 3

1

うーん、各時間インデックスをチェックしてから、テーブルを印刷しているようです。これを試して

 while($r = $q->fetch_array(MYSQLI_ASSOC)) :
    echo '<tr>';
    echo '<td align="center">' . $r['times']  . '</td>';

    if($r['booked_date'] == date('Y-m-d') && $r['id_doctor'] == 1):
       echo '<td><a href="#available" class="booked">booked</a></td>';
    elseif($r['booked_date'] == date('Y-m-d') && $r['id_doctor'] == 2):
       echo '<td><a href="#available" class="booked">booked</a></td>';
    elseif($r['booked_date'] == date('Y-m-d') && $r['id_doctor'] == 3):
       echo '<td><a href="#available" class="booked">booked</a></td>';
    else :
       echo '<td><a href="#" class="available">available</a></td>';
    endif;

    echo '</tr>';
 endwhile;
于 2010-12-28T18:41:36.280 に答える
1

sql-table は x,y-data を持つテーブルではないことに注意してください。

したがって、php 出力に表示されるのは、データベースから取得したものとまったく同じです。データのリストには、行ごとに 1 つの事実 (時間、人) のみが格納され、スロット/人に対してそれが繰り返されます。

自分で圧縮し、SQL から行を取得する列を作成する必要があります。(厳密なSQLでも実行できますが、それで問題が簡単になるとは思わないので、そのままにしておきます。)

まず第一に、すべての人/スロットの組み合わせの値を提供し、SQL で可用性を計算する別の SQL をお勧めします。

SELECT *, isnull(bookslot.id_bookslot) as 'available' FROM timeslot 
LEFT JOIN doctor ON bookslot.id_doctor = doctor.id_doctor 
LEFT JOIN timeslot ON bookslot.id_timeslot = timeslot.id_timeslot
ORDER BY timeslot.times, doctor.name_doctor

空室状況を計算する必要はなくなりましたが、計算フィールド $r['available'] を読み取ります。

order by は重要です。それが必要なので、すべての値が左から右に表示されます。[(10:00, 医師 A), (10:00, 医師 B), (10:15, 医師 A)...]

2 つのループが必要です。1 つは行用で、もう 1 つは列を作成するためです。しかし、クエリが変更されているため、すべての値があることが既にわかっています。

$prev_slot = 0;
$firstrow = true;

while($r = $q->fetch_array(MYSQLI_ASSOC)) :

$slot =  $r['times'] ;
if( $slot != $prev_slot ):
    // new timeslot, so here and only here we create a new row      
    if( !$firstrow ):
        // if needed, close the old:        
        echo '</tr>';
        $firstrow = false;
    endif;
    echo '<tr>';
    echo '<td align="center">' . $r['times']  . '</td>';
endif;

// here we are just moving sideways
if($r['available'] ):
    echo '<td><a href="#" class="available">available</a></td>';        
else :
    echo '<td><a href="#available" class="booked">booked</a></td>';
endif;
endwhile;

echo '</tr>'; // close the final row. 
于 2010-12-28T18:58:40.907 に答える
0

クエリを変更してスロットごとに1行を返すか、結果セットからデータをフェッチした後に配列を再配置します。

于 2010-12-28T18:48:50.480 に答える