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

重要的是要意识到 sql 表不是具有 x,y 数据的表。

因此,您在 php-output 中看到的正是您从数据库中获得的内容,这是一个包含每行仅存储一个事实(时间、人员)的数据的列表,并对任何插槽/人员重复该操作。

您需要自己压缩它,并在从 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']。

顺序很重要:您需要它,因此它将列出您希望它们从左到右排列的所有值。所以你想要 [(10:00, 医生 A), (10:00, 医生 B), (10:15, 医生 A)...]

您将需要两个循环,一个用于行,另一个用于创建列。但是由于查询已更改,您已经知道您拥有所有值。

$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 回答
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 回答
0

更改查询以每个槽返回一行,或在从结果集中获取数据后重新排列数组。

于 2010-12-28T18:48:50.480 回答