Бронирование временных интервалов PHP

по поводу этого вопроса..

Временной интервал бронирования 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;

результат с веб-страницы alt text

и я хочу, чтобы результат выглядел так:

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

Любое другое решение, пожалуйста!


person tonoslfx    schedule 28.12.2010    source источник


Ответы (3)


Важно понимать, что sql-таблица — это не таблица с данными x, y.

Итак, то, что вы видите в php-выводе, это именно то, что вы получаете из базы данных, список с данными, который хранит только один факт (время, человек) в строке и повторяет это для любого слота/человека.

Вам нужно сжать его самостоятельно и сделать столбцы, где вы получаете строки из 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['доступно'].

Порядок важен: он нужен вам, чтобы он отображал все значения так, как вы хотите, чтобы они шли слева направо. Итак, вы хотите [(10:00, доктор А), (10:00, доктор Б), (10:15, доктор А)...]

Вам понадобятся две петли, одна для строк, а другая для создания столбцов. Но поскольку запрос изменился, вы уже знаете, что у вас есть все значения.

$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. 
person Inca    schedule 28.12.2010

Хм, похоже, вы проверяете каждый индекс времени, а затем печатаете свою таблицу. попробуй это

 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;
person Phill Pafford    schedule 28.12.2010

Либо измените запрос, чтобы он возвращал одну строку на слот, либо перестройте массив после выборки данных из набора результатов.

person Srisa    schedule 28.12.2010