Php 如何在SQL中的某个列上连接两行或多行具有相同值?

Php 如何在SQL中的某个列上连接两行或多行具有相同值?,php,html,sql,Php,Html,Sql,我想在我的网页中创建一个动态的选择列表菜单。选择列表菜单显示从11:00:00到02:00:00的时钟。如果保留了一个或多个时钟,则时钟字体将变为红色。首先,我将IdRsv=RV01的第一行插入表中,并在我的网页中检查结果。选择列表菜单显示12:00:00至14:00:00变为红色。因此,结果很好。 在之后插入另一行时出现问题。我想要的结果是选择列表菜单显示12:00:00-14:00:00和17:00:00-20:00:00的字体变为红色。我得到的结果只有12:00:00-14:00:00的字

我想在我的网页中创建一个动态的选择列表菜单。选择列表菜单显示从11:00:00到02:00:00的时钟。如果保留了一个或多个时钟,则时钟字体将变为红色。首先,我将IdRsv=RV01的第一行插入表中,并在我的网页中检查结果。选择列表菜单显示12:00:00至14:00:00变为红色。因此,结果很好。

在之后插入另一行时出现问题。我想要的结果是选择列表菜单显示12:00:00-14:00:0017:00:00-20:00:00的字体变为红色。我得到的结果只有12:00:00-14:00:00的字体变成红色。

我意识到选择列表菜单只读取第一行

表名:tblreservation
-----------------------------------------------------------------------
|IdRsv | IdRoom| RsvDate | StartRsv | EndRsv |
-----------------------------------------------------------------------
|RV01 | R003 | 2016-01-31 | 12:00:00 | 14:00:00 |
|RV02 | R003 | 2016-01-31 | 17:00:00 | 20:00:00 |
-----------------------------------------------------------------------

我尝试的查询仅是SELECT*FROM表,其中IdRoom='$IdRoom'和RsvDate='$RsvDate'
我正在使用for condition选择列表菜单中设置时钟选项
在这个for condition中,我使用if condition使时钟保留的字体变成红色。

php代码是:

$sql  = mysql_query("SELECT * FROM tblreservation WHERE IdRoom = '$idRoom' AND RsvDate = '$rsvDate'");
$data = mysql_fetch_array($sql);
echo"
     <select name='startClock' onchange='startClockFunction(this.value)' id='sc' class='form-control' required>
         <option value=''>--:--</option>";
         while ($data = mysql_fetch_array($sql)) {
             for ($clock = 11; $clock < 27; $clock++) {
                 if ($clock == 24) {
                      $showClock = "00";
                 } 
                 else if ($clock == 25) {
                      $showClock = "01";
                 }
                 else if ($clock == 26) {
                      $showClock = "02";
                 } else {
                      $showClock = $clock;
                 }

                 if ($data['StartRsv'] == "" && $data['EndRsv'] == "") {
                      echo "<option value='$clock:00:00'>$showClock:00</option>";
                 }
                 else if ($clock . ":00:00" >= $data['StartRsv'] && $clock . ":00:00" <= $data['EndRsv']) {
                     echo "<option style='background-color: red; color: white;' value='$clock:00:00' disabled>$showClock:00</option>";
                 }
                 // if someone reserve room at 22:00:00 until 02:00:00 (example)
                 else if ($data['StartRsv'] > $data['EndRsv']) {
                     $dataEndRsv = $data['EndRsv'] + 24;
                     if ($clock . ":00:00" >= $data['StartRsv'] && $jam . ":00:00" <= $dataEndRsv) {
                         echo "<option style='background-color: red; color: white;' value='$clock:00:00' disabled>$showClock:00</option>";
                     } else {
                         echo "<option value='$jam:00:00'>$jamTampil:00</option>";
                     }
                 }
                 else {
                      echo "<option value='$clock:00:00'>$showClock:00</option>";
                 }
              }
          }
echo"
      </select>
    ";
$sql=mysql\u查询(“从tblreservation中选择*,其中IdRoom='$IdRoom'和RsvDate='$RsvDate'”);
$data=mysql\u fetch\u数组($sql);
回声“
--:--";
而($data=mysql\u fetch\u数组($sql)){
对于($clock=11;$clock<27;$clock++){
如果($clock==24){
$showClock=“00”;
} 
否则如果($clock==25){
$showClock=“01”;
}
否则如果($clock==26){
$showClock=“02”;
}否则{
$showClock=$clock;
}
如果($data['StartRsv']==“”&&$data['EndRsv']==“”){
回显“$showClock:00”;
}
如果($clock.:00:00“>=$data['StartRsv']&&$clock.:00:00“$data['EndRsv']),则为else{
$dataEndRsv=$data['EndRsv']+24;

如果($clock.:00:00“>=$data['StartRsv']&&&$jam.:00:00”这似乎是php代码中的一个错误。
mysql\u fetch\u array
只返回结果的一行,您必须使用
循环遍历它们,就像这样:

while ($data = mysql_fetch_array($sql)) {
    ...
}

扩展@Dunno的答案。您需要使用
while
循环获取所有行。然后您需要一个数组
$occulated\u hours
来跟踪已占用的小时数:
$sql  = mysql_query("
    SELECT hour(StartRsv) s, hour(EndRsv) e
    FROM tblreservation 
    WHERE IdRoom = '$idRoom' AND RsvDate = '$rsvDate'");

$occupied_hours = array();
while ($row = mysql_fetch_array($sql)) {
    for ($i = $row['s']; $i <= $row['e']; $i++) {
        $occupied_hours[$i] = true;
    }
}

echo"<select name='startClock' onchange='startClockFunction(this.value)' id='sc' class='form-control' required>
    <option value=''>--:--</option>";

for ($clock = 11; $clock < 27; $clock++) {
    $clock = $clock % 24;
    if ($clock < 10) {
        $showClock = "0" . $clock;
    }

    if (isset($occupied_hours[$clock])) {
        echo "<option style='background-color: red; color: white;' value='$clock:00:00' disabled>$showClock:00</option>";
    } else {
        echo "<option value='$clock:00:00'>$showClock:00</option>";
    }
}
echo" </select> ";
$sql=mysql\u查询(“
选择小时(起始时间)s,小时(结束时间)e
从TBL保存
其中IdRoom='$IdRoom'和RsvDate='$RsvDate');
$occulated_hours=array();
while($row=mysql\u fetch\u数组($sql)){

对于($i=$row['s'];$i首先,for循环中的第一个if语句是无用的,因为您的循环以
$clock=11
开始,并且您正在检查
$clock
是否小于10

对于您的实际问题,由于您希望获得多行,因此必须使用while循环迭代
mysql\u fetch\u array($sql)
的结果

$sql  = mysql_query("SELECT * FROM tblreservation WHERE IdRoom = '$idRoom' AND RsvDate = '$rsvDate'");

echo"<select name='startClock' onchange='startClockFunction(this.value)' id='sc' class='form-control' required>
     <option value=''>--:--</option>";
while( $row = mysql_fetch_array($sql) ){
    for ($clock = 11; $clock < 27; $clock++) {
         if ($clock == 24) {
              $showClock = "00";
         } 
         else if ($clock == 25) {
              $showClock = "01";
         }
         else if ($clock == 26) {
              $showClock = "02";
         } else {
              $showClock = $clock;
         }

         if ( $row['StartRsv'] == "" && $row['EndRsv'] == "" ) {
              echo "<option value='$clock:00:00'>$showClock:00</option>";
         }
         else if ($clock . ":00:00" >= $row['StartRsv'] && $clock . ":00:00" <= $row['EndRsv']) {
              echo "<option style='background-color: red; color: white;' value='$clock:00:00' disabled>$showClock:00</option>";
         }
         else if ("00:00:00" >= $row['StartRsv'] && "01:00:00" <= $row['EndRsv']) {
              echo "<option style='background-color: red; color: white;' value='$clock:00:00' disabled>$showClock:00</option>";
         } 
         else if ("00:00:00" >= $row['StartRsv'] && "02:00:00" <= $row['EndRsv']) {
              echo "<option style='background-color: red; color: white;' value='$clock:00:00' disabled>$showClock:00</option>";
         } else {
              echo "<option value='$clock:00:00'>$showClock:00</option>";
         }
    }
}
echo"
      </select>
    ";  
$sql=mysql\u查询(“从tblreservation中选择*,其中IdRoom='$IdRoom'和RsvDate='$RsvDate'”);
回声“
--:--";
while($row=mysql\u fetch\u数组($sql)){
对于($clock=11;$clock<27;$clock++){
如果($clock==24){
$showClock=“00”;
} 
否则如果($clock==25){
$showClock=“01”;
}
否则如果($clock==26){
$showClock=“02”;
}否则{
$showClock=$clock;
}
如果($row['StartRsv']==“”&&$row['EndRsv']==“”){
回显“$showClock:00”;
}
否则,如果($clock.“:00:00”>=$row['StartRsv']和&$clock.:00:00”=$row['StartRsv']和&“01:00:00”=$row['StartRsv']和&“02:00:00”$row['StartRsv'],
'end'=>$row['EndRsv']
];
}
}
对于($clock=11;$clock<27;$clock++){
$c=$clock.“:00:00”;
$time_slots[]=[
“密钥”=>c美元,
“显示时间”=>$clock%24.“:00:00”,
'is_reserved'=>IstHistTimeReserved($reserved_插槽,$c)
];
}
foreach($时隙为$时隙){
$style=$slot['is_reserved']?“style='background-color:red;color:white;'”:“”;
$disabled=$slot['is_reserved']?“disabled”:“;
回显“$showClock:00”;
}
回声“
";  
//检查是否保留了时间段
函数IsHistTimeReserved($reserved\u插槽,$clock){

return($clock.“:00:00”>=$reserved_插槽['start']&&$clock.:00:00”为什么您的查询中有
IdRoom=''和RsvDate=''
?您是否遗漏了什么?听起来您的问题似乎是在PHP和HTML+CSS级别。所以请发布您的代码。@Dunno,实际上我的查询是IdRoom='$IdRoom'和RsvDate='$RsvDate'抱歉,我不知道PHP(但我遵循sql标记),我只是在谷歌上搜索了这个答案。如果你知道一个更好的解决方案,那么就发布它:)@Dunno,感谢您的回答和帮助..正如制造商所说,时钟循环是循环两次..感谢您的更正和答案..我已经尝试将while置于for之外,但结果是时钟循环是循环两次..所以问题是我应该将while条件放在哪里..再次感谢:)您如何保存
Sta
$time_slots = [];

$sql  = mysql_query("SELECT * FROM tblreservation WHERE IdRoom = '$idRoom' AND RsvDate = '$rsvDate'");

echo"<select name='startClock' onchange='startClockFunction(this.value)' id='sc' class='form-control' required>
     <option value=''>--:--</option>";

$reserved_slots = [];
while( $row = mysql_fetch_array($sql) ){
    if( !empty($row['StartRsv']) && !empty($row['StartRsv']) ){
        $reserved_slots[] = [
            'start' => $row['StartRsv'],
            'end' => $row['EndRsv']
        ];
    }
}

for ($clock = 11; $clock < 27; $clock++) {
    $c = $clock . ":00:00";
    $time_slots[] = [
        'key' => $c,
        'display_time' => $clock%24 . ":00:00",
        'is_reserved' => isThisTimeReserved($reserved_slots, $c)
    ];
}

foreach($time_slots as $slot){
    $style = $slot['is_reserved'] ? "style='background-color: red; color: white;'" : "";
    $disabled = $slot['is_reserved'] ? "disabled" : "";
    echo "<option $style value='$clock:00:00' $disabled>$showClock:00</option>";
}
echo"
      </select>
    ";  

//To check if a time slot is reserved or not
function isThisTimeReserved($reserved_slots, $clock){
    return ($clock . ":00:00" >= $reserved_slots['start'] && $clock . ":00:00" <= $reserved_slots['end']);
}