sql >> Databáze >  >> RDS >> Mysql

Spusťte dotaz na základě více zaškrtávacích políček

Zdá se, že jádrem vašeho problému je skutečnost, že obklopujete sloupec DetailName v jednoduchých uvozovkách:"'DetailName'='" když vše, co by mělo být, je "DetailName='"

Na bezpečnostní poznámku bych rád upozornil, že funkce mysql_escape_string() který používáte k vynucení přístupu k mysql, je starý a prošpikovaný bezpečnostními dírami. Místo toho bych doporučil použít mnohem bezpečnější implementaci:mysql_real_escape_string() . Níže uvedené příklady kódu využívají novější, bezpečnější funkci.

Bez ohledu na tyto problémy bych však doporučil zvolit trochu jiný přístup, který se bude lépe číst a z dlouhodobého hlediska bude mnohem snazší.

Pro začátek bych doporučoval používat stejný název u všech zaškrtávacích políček a jako hodnotu použít název Podrobnosti než jako klíč:

<td>
    <input name="criteria[]" type="checkbox" id="Buffet" value="Buffet" />
    <strong><label for="Buffet">Buffet</label></strong>
</td>
<td>
    <input name="criteria[]" type="checkbox" id="Breakfast" value="Breakfast" />
    <strong><label for="Breakfast">Breakfast</label></strong>
</td>
<td>
    <input name="criteria[]" type="checkbox" id="BYOB" value="BYOB" />
    <strong><label for="BYOB">BYOB</label></strong>
</td>

Dále, s použitím hodnot vašich vstupů spíše než klíčů, nyní můžeme vygenerovat naši klauzuli. Velmi efektivně:

// Runs mysql_real_escape_string() on every value encountered.
$clean_criteria = array_map('mysql_real_escape_string', $_REQUEST['criteria']);
// Convert the array into a string.
$criteria = implode("','", $clean_criteria);

Nakonec ve vašem dotazu doporučuji použít IN namísto OR operátor pro efektivitu a čitelnost:

SELECT
    tblLocations.CityID, tblRestaurants.RestName, tblLocations.Street, tblLocations.Phone, tblLocations.Price, tblLocations.Rating, tblDetails.DetailName
FROM
    (
        tblRestaurants
    INNER JOIN
        tblLocations ON tblRestaurants.RestID = tblLocations.RestID
    )            
INNER JOIN
    (
        tblLocDet
    INNER JOIN
        tblDetails ON tblLocDet.DetailID = tblDetails.DetailID
    ) ON tblLocations.LocationID = tblLocDet.LocID
WHERE tblLocations.CityID='16' AND tblDetails.DetailName IN ($criteria)
ORDER BY tblRestaurants.RestName ASC

Zde je celá stránka věcí PHP kombinující úpravy, které navrhuji, s vaší logikou:

<?php
require "congig.php";
if(!empty($_POST['criteria'])) { // empty() checks if the value is set before checking if it's empty.
    foreach($_POST['criteria'] as $key=>$value){ 
        // Runs mysql_real_escape_string() on every value encountered.
        $clean_criteria = array_map('mysql_real_escape_string', $_REQUEST['criteria']);
        // Convert the array into a string.
        $criteria = implode("','", $clean_criteria);
    }

    $rs = mysql_query("
        SELECT
            tblLocations.CityID, tblRestaurants.RestName, tblLocations.Street, tblLocations.Phone, tblLocations.Price, tblLocations.Rating, tblDetails.DetailName
        FROM
            (
                tblRestaurants
            INNER JOIN
                tblLocations ON tblRestaurants.RestID = tblLocations.RestID
            )            
        INNER JOIN
            (
                tblLocDet
            INNER JOIN
                tblDetails ON tblLocDet.DetailID = tblDetails.DetailID
            ) ON tblLocations.LocationID = tblLocDet.LocID
        WHERE tblLocations.CityID='16' AND tblDetails.DetailName IN ($criteria)
        ORDER BY tblRestaurants.RestName ASC
    ");
    if(!$rs) {
        echo "Cannot parse query";
    } else if(mysql_num_rows($rs) == 0) {
        echo "No records found";
    } else {
        echo "<table id=\"myTable\" table width=\"710\" class=\"beautifuldata\" align=\"Left\" cellspacing=\"0\">\n";
        echo "<thead>\n<tr>";
        echo "<th>PLACE</th>";
        echo "<th>ADDRESS</th>";
        echo "<th>PHONE</th>";
        echo "<th>PRICE</th>";
        echo "<th>RATING</th>";
        echo "</tr>\n</thead>\n";
        while($row = mysql_fetch_array($rs)) {
            echo"<tr>
            <td><strong><a href='$row[RestPage]'>$row[RestName]</a></strong></td>
            <td>$row[Address]</td>
            <td>$row[Phone]</td>
            <td>$row[Price]</td>
            <td>$row[Rating]</td>
            </tr>\n";
        }
        echo "</table><br />\n";
    }
}



  1. CURRENT_TIMESTAMP v milisekundách v h2

  2. Příklady ATAN() v SQL Server

  3. Json MySql získá dvě celá čísla a řetězec

  4. Selhání komunikačního spojení - byl poslední úspěšně přijatý paket ze serveru