Как отобразить имена отелей, которые имеют максимальный счет из базы данных, вычисляя сумму в PHP?

Я новичок в программировании PHP. Я хочу отображать имена отелей из базы данных в порядке возрастания в соответствии с соответствующими значениями предпочтений, выбранных пользователем из флажков. В моем коде отображаются имена отелей в соответствии с предпочтениями, введенными пользователем. Логика заключается в отображении названия отеля, если существует «1» под именем предпочтения в базе данных против этого отеля. Например, если пользователь выбирает два флажка из 7, «пул» и «тренажерный зал», поэтому мой код отображает отели с «1» в настройках тренажерного зала и бассейна в базе данных. Моя база данных выглядит так:

Hotel_id| Hotel_name| Pool| pool_count | Gym | gym_count| spa | spa_count| 0 1 Abc hotel 1 1.4 1 1.5 1 1.9 2 xyz hotel 1 1.2 0 0 0 0 3 xmk hotel 1 1.0 1 0.5 0 0 4 New hotel 1 1.99 0 0 0 0 5 old hotel 1 0.98 0 0 0 0 6 street hotel 1 0.78 0 0 0 0 . . . . . . 

Я использую SQLite3 для создания базы данных. Если пользователь выбирает флажки для пула, тренажерного зала и спа-салона, то все те отели, у которых есть «1» под столбом бассейна, тренажерного зала и спа, должны быть восстановлены (мой код делает это), тогда он должен рассчитать сумму соответствующие подсчеты. Например, он должен добавить pool_count с gym_count и spa_count, а затем отобразить имена отелей в порядке возрастания в соответствии с их суммарными суммами. Я попытался реализовать его, сначала создав массив, содержащий все имена столбцов подсчетов, а затем запрос, который вычисляет сумму, но я не понимаю, как передать конкретное имя столбца предпочтений, которые были выбраны Пользователь.

php_checkbox.php

 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> <title>PHP: Get Values of Multiple Checked Checkboxes</title> <link rel="stylesheet" href="css/php_checkbox.css"/> </head> <body> <div class="container"> <div class="main"> <form action="checkbox_value.php" method="post"> <h2>PHP: Get Values of Multiple Checked Checkboxes</h2> <select id="mySelect" name="list"> <option selected>Select a place</option> <option value="1">Lahore</option> <option value="2">Dubai</option> <option value="3">New York</option> <option value="4">Canberra</option> <option value="5">London</option> </select> <p class="heading">Select Your Preferences:</p> <input type="checkbox" name="check_list[]" value="pool" id="checkbox_1"> <label for="checkbox_1">Pool</label> <input type="checkbox" name="check_list[]" value="gym" id="checkbox_2"> <label for="checkbox_2">Gym</label> <input type="checkbox" name="check_list[]" value="spa" id="checkbox_3"> <label for="checkbox_3">Spa</label> <input type="checkbox" name="check_list[]" value="is_beach" id="checkbox_4"> <label for="checkbox_1">Beach</label> <input type="checkbox" name="check_list[]" value="is_wifi" id="checkbox_5"> <label for="checkbox_2">Wifi</label> <input type="checkbox" name="check_list[]" value="is_familyoriented" id="checkbox_6"> <label for="checkbox_3">Family oriented</label> <input type="checkbox" name="check_list[]" value="is_economical" id="checkbox_7"> <label for="checkbox_3">Value for money</label> <div> <input type="submit" name="submit" Value="Submit"/> </div> <?php include 'checkbox_value.php';?> </form> </div> </div> </body> </html> 

checkbox_value.php :

 <?php class MyDB extends SQLite3 { function __construct() { $this->open('mytrip.db'); } } $db = new MyDB(); if(!$db){ echo $db->lastErrorMsg(); } else { } $hotelOptions = array('pool', 'gym', 'spa', 'is_wifi', 'is_beach', 'is_familyoriented', 'is_economical'); $countOptions = array('pool_count', 'gym_count', 'spa_count', 'wifi_count', 'beach_count','family_count','econo_count'); if (isset($_POST['submit'])) { if (!empty($_POST['check_list']) && is_array($_POST['check_list'])) { // Counting number of checked checkboxes. $checked_count = count($_POST['check_list']); echo "You have selected following ".$checked_count." option(s): <br/>"; // Loop to store and display values of individual checked checkbox. $where = ''; foreach($_POST['check_list'] as $selected) { echo "<p>".$selected ."</p>"; if (array_search($selected, $hotelOptions) !== false) { $where .= " AND {$selected} = 1"; } } $where = substr($where, 5, strlen($where)); // $sql = "SELECT hotel_name FROM Dubai WHERE ".$where.";"; $query= "SELECT SUM( ) FROM Dubai WHERE ".$where.";"; $sql = "SELECT hotel_name FROM Dubai WHERE ".$where.";"; echo "<p>".$where ."</p>"; $ret = $db->query($sql); while($row = $ret->fetchArray(SQLITE3_ASSOC) ){ echo "<p> <br /></p>\n"; echo "\n". $row['hotel_name'] . "\n"; } $db->close(); } else { echo "<b>Please Select Atleast One Option.</b>"; } 

Вторая задача, которую я хочу достичь, – отобразить данные в соответствии с назначением, выбранным пользователем в выпадающем списке в коде «php_checkbox.php». Я дал уникальный идентификатор каждой опции в списке, но не понимаю, как я могу динамически отправить имя города в запросе, чтобы открыть таблицу этого адресата. Мой текущий запрос выглядит так:

 SELECT hotel_name FROM London WHERE 

Как открыть таблицу для города, которая была выбрана пользователем из раскрывающегося списка?

Помощь в этом отношении заслуживает высокой оценки.

Вы должны сделать упорядочение по выбранным полям почти так же, как и $where это делается. Я бы сопоставил имена опций с их соответствующими значениями столбцов: 'pool' => 'pool_count' . Выбор из таблицы, выбранной пользователем, еще проще, просто создайте массив, содержащий входные значения, как индексы, имя таблицы в качестве значений и выберите concatenate selected index в query.

Я использовал упрощенную версию вашего кода (только один город, меньше столбцов), но логика будет работать с вашими данными, а просто отрегулировать их. Осталось еще одно: вы должны обрабатывать случай, когда $_POST['list'] не содержит правильного значения.

Вот код:

 $hotelOptions = array('swimming_pool', 'roof_top', 'sea_side'); $countOptions = array( 'swimming_pool' => 'swimming_pool_count', 'roof_top' => 'roof_top_count', 'sea_side' => 'sea_side_count', ); $cities = array(1 => 'Dubai'); if (isset($_POST['submit'])) { if (!empty($_POST['check_list']) && is_array($_POST['check_list'])) { // Counting number of checked checkboxes. $checked_count = count($_POST['check_list']); echo "You have selected following ".$checked_count." option(s): <br/>"; // Loop to store and display values of individual checked checkbox. $where = ''; $order = ''; foreach($_POST['check_list'] as $selected) { echo "<p>".$selected ."</p>"; if (array_search($selected, $hotelOptions) !== false) { $where .= " AND {$selected} = 1"; $order .= " {$countOptions[$selected]} DESC,"; } } $where = substr($where, 5, strlen($where)); $order = substr($order, 0, strlen($order) - 1); if (isset($cities[$_POST['list']])) { $sql = "SELECT hotel_name FROM ".$cities[$_POST['list']]." WHERE ".$where." ORDER BY ".$order.";"; $ret = $db->query($sql); while($row = $ret->fetchArray(SQLITE3_ASSOC) ){ echo "<p> <br /></p>\n"; echo "\n". $row['hotel_name'] . "\n"; } $db->close(); echo "<br/><b>Note :</b> <span>Similarily, You Can Also Perform CRUD Operations using These Selected Values.</span>"; } } else { echo "<b>Please Select Atleast One Option.</b>"; } } 

он должен добавить pool_count с gym_count и spa_count, а затем отобразить имена отелей в порядке возрастания в соответствии с их суммарными суммами

Для этого вы можете сделать это несколькими способами,

Получите представленные флажки, теперь, когда у вас есть их, просто пропустите их и сделайте строку, если она отмечена:

 $query_string = ''; foreach($selected_checkboxes as $name=>$value) { if($value==1) $query_string .= "`$name` + "; } $query_string = rtrim($query_string, " + "); 

Запрос:

 SELECT *, ($query_string) AS AMENITIES_COUNT FROM xyz ORDER BY AMENITIES_COUNT DESC 

PHP:

Просто usort удобства в функции usort и usort их на основе этого.

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

Создание динамического запроса довольно просто, вам просто нужно понять, что изменится, а что – нет.

Поэтому, когда пользователь выбирает город и нажимает кнопку отправки, ваша переменная запроса станет такой:

 $selected_city = $_POST['city']; $query = "SELECT hotel_name FROM `$selected_city` WHERE ..."; 

Возможно, вам придется использовать этот город и в ваших фильтрах. (отредактируйте ответ, если я что-то пропустил)

=== РЕДАКТИРОВАТЬ ===

Некоторая оптимизация в вашем коде:

  $hotel_count_options = array ( ['pool'] => 'pool_count', ['gym'] => 'gym_count', ['spa'] => 'spa_count', ['is_wifi'] => 'wifi_count', ['is_beach'] => 'beach_count', ['is_familyoriented'] => 'family_count', ['is_economical'] => 'econo_count' ); $where = ''; $query_select_string = ''; foreach($_POST['check_list'] as $selected) { echo "<p>".$selected ."</p>"; if (array_search($selected, array_keys($hotel_count_options)) !== false) { $where .= " AND {$selected} = 1"; $query_select_string .= "{$hotel_count_options['$selected']} + "; } } $query_select_string = rtrim($query_string, " + "); 

Теперь просто измените строку выбранного запроса,

$ sql = "SELECT hotel_name, $ query_select_string as ame_count FROM Dubai WHERE". $ where. "ORDER BY ame_count desc;";