Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Führen Sie eine Abfrage basierend auf mehreren Kontrollkästchen aus

Der Kern Ihres Problems scheint die Tatsache zu sein, dass Sie die Spalte DetailName umgeben in einfachen Anführungszeichen:"'DetailName'='" wenn es nur "DetailName='" sein sollte

Sicherheitshalber möchte ich darauf hinweisen, dass die Funktion mysql_escape_string() Sie verwenden, um Eingaben zu erzwingen, damit sie mysql-freundlich sind, ist alt und voller Sicherheitslücken. Stattdessen würde ich empfehlen, die viel sicherere Implementierung zu verwenden:mysql_real_escape_string() . Die folgenden Codebeispiele verwenden die neuere, sicherere Funktion.

Abgesehen von diesen Problemen würde ich jedoch empfehlen, einen etwas anderen Ansatz zu wählen, der auf lange Sicht einfacher zu lesen und viel einfacher zu verwalten ist.

Für den Anfang würde ich empfehlen, für alle Kontrollkästchen denselben Namen zu verwenden und den DetailName als Wert und nicht als Schlüssel zu verwenden:

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

Als nächstes können wir jetzt unsere Klausel generieren, indem wir die Werte Ihrer Eingaben anstelle der Schlüssel verwenden. Sehr effizient:

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

Schließlich würde ich in Ihrer Abfrage die Verwendung von IN empfehlen -Operator anstelle des OR Operator für Effizienz und Lesbarkeit:

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

Hier ist die ganze PHP-Seite der Dinge, die die von mir vorgeschlagenen Änderungen mit Ihrer Logik kombiniert:

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