¿Cómo mostrar los nombres de los hoteles que tienen el recuento máximo de la base de datos al calcular la sum en PHP?

Soy nuevo en la encoding PHP. Quiero mostrar los nombres de los hoteles desde la base de datos en orden ascendente de acuerdo con los recuentos respectivos de las preferencias seleccionadas por el usuario en las casillas de verificación. Mi código muestra los nombres de los hoteles de acuerdo con las preferencias ingresadas por el usuario. La lógica es mostrar el nombre del hotel si existe un “1” debajo del nombre de preferencia en la base de datos de ese hotel. Por ejemplo, si el usuario selecciona dos casillas de verificación de 7, “pool” y “gym”, mi código muestra los hoteles que tienen “1” tanto en las preferencias de gym como de pool en la base de datos. Mi base de datos se ve como:

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 . . . . . . 

Estoy usando SQLite3 para hacer la base de datos. Si el usuario selecciona las casillas de verificación de piscina, gimnasio y spa, todos los hoteles que tengan un “1” debajo de la columna de la piscina, gimnasio y spa deben recuperarse (mi código lo hace), entonces debe calcular la sum de los respectivas cuentas. Por ejemplo, debe agregar pool_count con gym_count y spa_count y luego mostrar los nombres de los hoteles en orden ascendente de acuerdo con sus respectivos valores de sum total. He intentado implementarlo haciendo primero una matriz que contiene todos los nombres de columna de los recuentos y luego una consulta que calcula la sum, pero no entiendo cómo puedo pasar el nombre de columna específico de las preferencias seleccionadas por el usuario.

php_checkbox.php

    PHP: Get Values of Multiple Checked Checkboxes    

PHP: Get Values of Multiple Checked Checkboxes

Select a place Lahore Dubai New York Canberra London

Select Your Preferences:

checkbox_value.php :

 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): 
"; // Loop to store and display values of individual checked checkbox. $where = ''; foreach($_POST['check_list'] as $selected) { echo "

".$selected ."

"; 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 "

".$where ."

"; $ret = $db->query($sql); while($row = $ret->fetchArray(SQLITE3_ASSOC) ){ echo "


\n"; echo "\n". $row['hotel_name'] . "\n"; } $db->close(); } else { echo "Please Select Atleast One Option."; }

La segunda tarea que quiero lograr es mostrar los datos según el destino seleccionado por el usuario en la lista desplegable en el código “php_checkbox.php”. Le he dado identificaciones únicas a cada opción en la lista pero no entiendo cómo puedo enviar dinámicamente el nombre de la ciudad en la consulta para abrir la tabla de ese destino. Mi consulta actual se ve como:

 SELECT hotel_name FROM London WHERE 

¿Cómo puedo abrir la tabla para la ciudad seleccionada por el usuario en la lista desplegable?

La ayuda en este sentido será muy apreciada.

Debe hacer el pedido por campos seleccionados casi lo mismo que $where se realiza. 'pool' => 'pool_count' nombres de opciones a sus respectivos recuentos de columnas: 'pool' => 'pool_count' . La elección de la tabla seleccionada por el usuario es aún más sencilla, solo haga una matriz que contenga valores de entrada como índices, nombre de la tabla como valores y elija concatenar el índice elegido en la consulta.

He utilizado la versión simplificada de su código (solo una ciudad, menos columnas) pero la lógica funcionaría con sus datos, así como ajustarlo. Queda una cosa, debe manejar el caso donde $_POST['list'] no contenga el valor adecuado.

Aquí está el código:

 $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): 
"; // Loop to store and display values of individual checked checkbox. $where = ''; $order = ''; foreach($_POST['check_list'] as $selected) { echo "

".$selected ."

"; 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 "


\n"; echo "\n". $row['hotel_name'] . "\n"; } $db->close(); echo "
Note : Similarily, You Can Also Perform CRUD Operations using These Selected Values."; } } else { echo "Please Select Atleast One Option."; } }

debe agregar pool_count con gym_count y spa_count y luego mostrar los nombres de los hoteles en orden ascendente de acuerdo con sus respectivos valores de sum total

Para esto puedes hacerlo de múltiples maneras,

Obtenga las casillas de verificación enviadas, ahora cuando las tenga, simplemente haga un ciclo a través de ellas y haga la cadena si está marcada:

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

Consulta:

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

PHP:

Simplemente sume los servicios en la función de usort y usort en base a eso.

enviar dinámicamente el nombre de la ciudad en la consulta para abrir la tabla de ese destino

Hacer que la consulta sea dinámica es bastante fácil, solo necesita comprender qué cambiará y qué no.

Entonces, cuando el usuario selecciona una ciudad y presiona el botón enviar, la variable de consulta se convertirá en esto:

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

Es posible que también debas usar esa ciudad en tus consultas de filtro. (editará la respuesta en caso de que me haya perdido algo)

=== EDIT ===

Alguna optimización en su código:

  $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 "

".$selected ."

"; 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, " + ");

Ahora solo cambia la cadena de consulta seleccionada,

$ sql = “SELECCIONAR hotel_name, $ query_select_string as ame_count FROM Dubai WHERE”. $ where. “ORDER BY ame_count desc;”;