Создайте разделители для каждой группы значений

#php #html #mysql #arrays

Вопрос:

Мне нужно сгруппировать все строки с соответствующим кодом комнаты. Когда я также группирую курорт, он действует так, как будто отключает группировку кода номера и выдает мне результаты только первой строки с кодом номера.

Как я могу сгруппировать столбец «Курорт» и по-прежнему группировать соответствующие столбцы кода номера? Если я разгруппирую свой код курорта, запрос будет работать правильно, но тогда я не смогу создавать отдельные разделы для разных курортов.

Пользователь ищет диапазон дат, следовательно, имеет несколько строк с одним и тем же кодом комнаты, который извлекает мои баллы. Вот почему я получаю сумму этих очков. Мой текущий способ группировки каждого курорта для целей вывода HTML нарушает это. Мне не обязательно группировать курорты, мне просто нужно, чтобы каждый номер на каждом курорте был создан в своем собственном наборе DIV. У меня есть основной пример ниже.

Идеальный вывод HTML

 <div id="results">
<div id="resort resortcode">
   <div id="roomresults">
       <div id="room1"></div>
       <div id="room2"></div>
   </div>
</div>
<div id="resort2 resortcode2">
   <div id="roomresults2">
       <div id="room3"></div>
       <div id="room4"></div>
   </div>
</div>
</div>      
 

Этот PHP-код сгруппирует каждый набор результатов по курортам, но повысит мою цену.

 <?php
include("dbh.php");
mysqli_select_db($con, "checkavail") or die ("no database");
$checkin = $_POST['checkin'];
$checkout = $_POST['checkout'];
$occupants = $_POST['occupants'];
$sqlCommand=
"SELECT
MIN(staydate) AS checkin,
MAX(staydate) AS lastnight,
MIN(available) AS available,
ra.resort AS resortcode,
ri.resort,
ri.room,
ri.roomcode,
ri.view,
SUM(ra.points*'20') AS price,
ri.sqfoot,
ri.description,
ri.bedding,
ri.amenities,
ri.sleeps,
ri.sleep_details,
ri.layout_img AS layoutimg,
ri.room_img AS roomimg,
ri.roomimg_thumb
FROM resort_availability AS ra
    LEFT JOIN room_info AS ri ON (ra.room = ri.roomcode)
WHERE staydate >= '$checkin' AND staydate = '$checkout'
AND sleeps >= '$occupants'
GROUP BY ri.roomcode
ORDER BY ri.resort, points
";
$result=mysqli_query($con, $sqlCommand) or die(mysqli_error($con));
$data = array();


while($row = $result->fetch_assoc())
{
    $itemName = $row["resort"];
    $resortCode = $row["resortcode"];
    if ( !array_key_exists($itemName, $data)) {
        $data[$itemName] = array ();
    }
    $data[$itemName][] = $row;
}

foreach ($data as $itemName => $rows) {
  echo '<div class="resort ' ,$resortCode , '">';
  echo '<div class="resort_header"><h1>', $itemName, '</h1></div>';

  foreach ($rows as $row){ 
    if ($row['available'] > 0) {
    $roomresult = '<div class="room_result roomavailable">';
    $available = '<button class="available">BOOK NOW</button>';
    $filtavail = 'available';
}
else {
    $roomresult = '<div class="room_result roomsoldout" style="">';
    $available = '<button class="soldout">SOLD OUT</button>';
    $filtavail = 'soldout';
}


    echo $roomresu<
    echo '<div class="room_thumb"></div>
    <div class="room_info"><h4>'
    ,$row['room'], '-' ,$row['view'] ,
     '</h4></div>
    <div class="price"><center><h3>','' ,$row['price'],'</h3>' , $available ,'</center></div></div>';
}
echo '</div>';
}

?>
 

введите описание изображения здесь

Этот PHP-код дает мне точные результаты, но не позволяет мне создавать div с результатами, основанными на каждом курорте, т. Е. Я не знаю, как создать заголовок с названием курорта, разделяющий каждый набор номеров по курортам, как в первом примере.

 <?php
include("dbh.php");
mysqli_select_db($con, "checkavail") or die ("no database");
$checkin = $_POST['checkin'];
$checkout = $_POST['checkout'];
$occupants = $_POST['occupants'];
$sqlCommand=
"SELECT
MIN(staydate) AS checkin,
MAX(staydate) AS lastnight,
MIN(available) AS available,
ra.resort AS resortcode,
ri.resort AS resort,
ri.room,
ri.roomcode AS roomcode,
ri.view,
SUM(ra.points) AS points,
ri.sqfoot,
ri.description,
ri.bedding,
ri.amenities,
ri.sleeps,
ri.sleep_details,
ri.layout_img AS layoutimg,
ri.room_img AS roomimg,
ri.roomimg_thumb
FROM resort_availability AS ra
    LEFT JOIN room_info AS ri ON (ra.room = ri.roomcode)
WHERE staydate >= '$checkin' AND staydate < '$checkout'
AND sleeps >= '$occupants'
GROUP BY ri.resort, roomcode
ORDER BY ri.resort, points
";
$result=mysqli_query($con, $sqlCommand) or die(mysqli_error($con));



while($row = $result->fetch_assoc()) {

$pricecalc = ($row['points'])*20;
$price = number_format($pricecalc, 2);




//RESULTS BOX
if($row['available'] < "1"){
    echo '<div id="'.$row['roomcode'].'-'.$row['resortcode'].'"','class="soldout roomresults room'.$row['resortcode'].'">';
}
if($row['available'] > "0"){
echo '<div id="'.$row['roomcode'].'-'.$row['resortcode'].'"','class="available roomresults room'.$row['resortcode'].'">';
}

//IMAGE BOX
    echo '<div class="thumbnail"><img height="90" src="',$row['roomimg_thumb'],'">';

    echo '</div>';


//ROOM DETAILS
    echo '<div class="roomdetails">';
    echo '<h4>'.$row['room'].' - '.$row['view'].'</h4>';
    echo '<p>Sleeps: '.$row['sleep_details'].'</p>';
    echo '<p class="clickfordetails">Click Image For Room Details</p>';
    echo '</div>';

//PRICING BOX AND SUBMIT BUTTON
    echo '<div class="price">';
        echo '<h3>

введите описание изображения здесь


Комментарии:

1. Если бы это был я, я бы начал с sql

2. И почему пользователь хочет ограничить себя номерами с датами пребывания, равными дате его отъезда? Смущенный.

3. цена определяется каждой ночью. День отъезда из этого списка исключается, так как с них не взимается плата за день отъезда. Поэтому в моем запросе выполняется поиск даты заезда за день до даты оформления заказа, поэтому цены указаны точно. У меня есть другая настройка кода, с которой я играл. С ним все точно, он просто не позволяет мне группировать курорты в выводе HTML. Этот код дает мне возможность группировать курорты на выходе, но портит результаты моих запросов по какой-то причине, которую я еще не понял.

4. И обратите внимание, что WHERE... sleeps =... этот запрос отображается как ВНУТРЕННЕЕ СОЕДИНЕНИЕ.

5. Вам придется поподробнее. Я могу проанализировать этот запрос как массив json, и он дает мне 100% правильные результаты. Итак, я не совсем понимаю, о чем вы говорите. Мне просто нужно выяснить, как создать заголовок для каждого курорта и получить результаты номеров этого курорта, перечисленные в этом разделе.

Ответ №1:

Да group by даст вам 1-ю запись той же группы.

В моем понимании , вы хотите показать все данные, но разместить все записи с одним и тем же кодом комнаты вместе.

В таком случае, пожалуйста, измените

 GROUP BY ri.roomcode
ORDER BY ri.resort, points
 

Для

 ORDER BY ri.roomcode, ri.resort, points
 

Комментарии:

1. Похоже, это не имеет значения. Мне придется поспать над этим и доложить завтра с обновленным вопросом. Я ценю вашу попытку.

2. Я обновил вопрос вторым набором кода и несколькими скриншотами, чтобы помочь объяснить.

,$price,'</h3>';
if ($row['available'] < "1"){
echo '<button type="button" class="soldoutbtn">SOLD OUT</button>';
}
if ($row['available'] > "0"){
echo '<button type="button" class="booknowbtn">BOOK NOW</button>';
}

echo '</div,$row>';
echo '</div></div>';

};

?>
введите описание изображения здесь

Комментарии:

1. Если бы это был я, я бы начал с sql

2. И почему пользователь хочет ограничить себя номерами с датами пребывания, равными дате его отъезда? Смущенный.

3. цена определяется каждой ночью. День отъезда из этого списка исключается, так как с них не взимается плата за день отъезда. Поэтому в моем запросе выполняется поиск даты заезда за день до даты оформления заказа, поэтому цены указаны точно. У меня есть другая настройка кода, с которой я играл. С ним все точно, он просто не позволяет мне группировать курорты в выводе HTML. Этот код дает мне возможность группировать курорты на выходе, но портит результаты моих запросов по какой-то причине, которую я еще не понял.

4. И обратите внимание, что WHERE... sleeps =... этот запрос отображается как ВНУТРЕННЕЕ СОЕДИНЕНИЕ.

5. Вам придется поподробнее. Я могу проанализировать этот запрос как массив json, и он дает мне 100% правильные результаты. Итак, я не совсем понимаю, о чем вы говорите. Мне просто нужно выяснить, как создать заголовок для каждого курорта и получить результаты номеров этого курорта, перечисленные в этом разделе.

Ответ №1:

Да group by даст вам 1-ю запись той же группы.

В моем понимании , вы хотите показать все данные, но разместить все записи с одним и тем же кодом комнаты вместе.

В таком случае, пожалуйста, измените


Для


Комментарии:

1. Похоже, это не имеет значения. Мне придется поспать над этим и доложить завтра с обновленным вопросом. Я ценю вашу попытку.

2. Я обновил вопрос вторым набором кода и несколькими скриншотами, чтобы помочь объяснить.