Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP时隙预订_Php_Sql_Timeslots - Fatal编程技术网

PHP时隙预订

PHP时隙预订,php,sql,timeslots,Php,Sql,Timeslots,关于这个问题 我尝试了“分组依据”id\u时间段,但仍然不起作用,因为它只显示预订的时间段,不可用 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'

关于这个问题

我尝试了“分组依据”id\u时间段,但仍然不起作用,因为它只显示预订的时间段,不可用

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;
我尝试了那个解决方案,但给了我一个错误,我不太明白如何使用“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;

还有别的解决办法吗

嗯,看起来你检查了每个时间索引,然后打印了你的表格。试试这个

 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;
while($r=$q->fetch_数组(MYSQLI_ASSOC)):
回声';
回显“”$r[‘倍’。';
如果($r['booked_date']==date('Y-m-d')&&$r['id_doctor']==1):
回声';
其他($r['booked\u date']==date('Y-m-d')和&$r['id\u doctor']==2):
回声';
其他($r['booked\u date']==date('Y-m-d')和&$r['id\u doctor']==3):
回声';
其他:
回声';
endif;
回声';
结束时;

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

必须认识到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['available']

order by很重要:您需要它,因此它将按照您希望的从左到右列出所有值。所以你想要[(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. 
$prev_slot=0;
$firstrow=true;
而($r=$q->fetch_数组(MYSQLI_ASSOC)):
$slot=$r['times'];
如果($slot!=$prev_slot):
//新的时隙,所以我们在这里创建一个新行
如果(!$firstrow):
//如果需要,关闭旧的:
回声';
$firstrow=false;
endif;
回声';
回显“”$r[‘倍’。';
endif;
//在这里,我们只是横向移动
如果($r['available']):
回声';
其他:
回声';
endif;
结束时;
回显“”;//关闭最后一行。