sql >> Database teknologi >  >> RDS >> Mysql

Kør en forespørgsel baseret på flere afkrydsningsfelter

Kernen i dit problem ser ud til at være det faktum, at du omgiver kolonnen DetailName i enkelte anførselstegn:"'DetailName'='" når alt det burde være "DetailName='"

For en sikkerheds skyld vil jeg gerne påpege, at funktionen mysql_escape_string() du bruger til at tvinge input til at være mysql-venligt, er gammelt og fyldt med sikkerhedshuller. I stedet vil jeg anbefale at bruge den meget sikrere implementering:mysql_real_escape_string() . Kodeeksemplerne nedenfor gør brug af den nyere, sikrere funktion.

Adskilt fra disse problemer vil jeg dog anbefale at tage en lidt anden tilgang, som vil være lettere at læse og meget nemmere at administrere i det lange løb.

Til at begynde med vil jeg anbefale at bruge det samme navn på alle afkrydsningsfelter og bruge DetailName som værdien i stedet for som nøglen:

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

Dernæst, ved at bruge værdierne af dine input i stedet for nøglerne, kan vi nu generere vores klausul. Meget effektivt:

// 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);

Til sidst, i din forespørgsel, vil jeg anbefale at bruge IN operatoren i stedet for OR operatør for effektivitet og læsbarhed:

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

Her er hele PHP-siden af ​​tingene, der kombinerer de ændringer, jeg foreslår, med din logik:

<?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. SYSDATETIME() Eksempler i SQL Server (T-SQL)

  2. Undtagelse fanget:java.sql.SQLEundtagelse:Kolonneantal stemmer ikke overens med værdiantallet i række 1

  3. 4 funktioner til at returnere måneden fra en dato i MariaDB

  4. Sådan rettes manglende felter i en krydstabuleringsforespørgsel i Access