sql >> Databasteknik >  >> RDS >> Mysql

Kör en fråga baserad på flera kryssrutor

Kärnan i ditt problem verkar vara det faktum att du omger kolumnen DetailName inom enkla citattecken:"'DetailName'='" när allt det borde vara är "DetailName='"

Av säkerhetsskäl vill jag påpeka att funktionen mysql_escape_string() du använder för att tvinga indata att vara mysql-vänlig är gammal och full av säkerhetshål. Istället skulle jag rekommendera att du använder den mycket säkrare implementeringen:mysql_real_escape_string() . Kodexemplen nedan använder sig av den nyare, säkrare funktionen.

Bortsett från dessa problem skulle jag dock rekommendera ett lite annorlunda tillvägagångssätt som blir lättare att läsa och mycket lättare att hantera i det långa loppet.

Till att börja med rekommenderar jag att du använder samma namn på alla kryssrutor och använder DetailName som värde snarare än som nyckel:

<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ärefter, med hjälp av värdena för dina ingångar snarare än nycklarna, kan vi nu generera vår klausul. Mycket 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);

Slutligen, i din fråga rekommenderar jag att du använder IN operatorn istället för OR operatör för effektivitet och läsbarhet:

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

Här är hela PHP-sidan av saker och ting som kombinerar de ändringar jag föreslå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. Lär dig hur du hanterar undantag i PL/SQL

  2. Mysql-händelsen fungerar inte

  3. Django - OperationalError:(1054, okänd kolumn 'xx' i 'fältlistan')

  4. PHP-variabel och MySQL LIKE-fråga fungerar inte