sql >> Database >  >> RDS >> Mysql

Voer een query uit op basis van meerdere selectievakjes

De kern van je probleem lijkt te zijn dat je de kolom DetailName omgeeft tussen enkele aanhalingstekens:"'DetailName'='" wanneer alles wat het zou moeten zijn "DetailName='" . is

Ter beveiliging wil ik erop wijzen dat de functie mysql_escape_string() die u gebruikt om invoer te forceren om mysql-vriendelijk te zijn, is oud en zit vol beveiligingslekken. In plaats daarvan raad ik aan om de veel veiligere implementatie te gebruiken:mysql_real_escape_string() . De onderstaande codevoorbeelden maken gebruik van de nieuwere, veiligere functie.

Los van deze problemen zou ik echter aanraden een iets andere benadering te volgen die op de lange termijn gemakkelijker te lezen en veel gemakkelijker te beheren is.

Om te beginnen raad ik aan om in alle selectievakjes dezelfde naam te gebruiken en de DetailName als waarde te gebruiken in plaats van als sleutel:

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

Vervolgens kunnen we nu onze clausule genereren met behulp van de waarden van uw invoer in plaats van de sleutels. Zeer efficiënt:

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

Ten slotte raad ik u aan om in uw zoekopdracht de IN . te gebruiken operator in plaats van de OR operator voor efficiëntie en leesbaarheid:

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 is de hele PHP-kant van de dingen die de wijzigingen die ik voorstel combineren met uw logica:

<?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. Waar is het jdbc-stuurprogramma org.gjt.mm.mysql.Driver voor?

  2. Hoe te repareren "De configuratie-optie 'Agent XPs' bestaat niet" in SQL Server (T-SQL)

  3. listagg-gegevens naar bruikbaar formaat?

  4. verwijzen naar meerdere externe sleutels php mysql