Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Jalankan kueri berdasarkan beberapa kotak centang

Inti masalah Anda tampaknya adalah fakta bahwa Anda mengelilingi kolom DetailName dalam tanda kutip tunggal:"'DetailName'='" padahal yang seharusnya adalah "DetailName='"

Sebagai catatan keamanan, saya ingin menunjukkan bahwa fungsi mysql_escape_string() yang Anda gunakan untuk memaksa input agar ramah-mysql sudah tua dan penuh dengan lubang keamanan. Sebagai gantinya, saya akan merekomendasikan menggunakan implementasi yang jauh lebih aman:mysql_real_escape_string() . Contoh kode di bawah ini menggunakan fungsi yang lebih baru dan lebih aman.

Namun, terpisah dari masalah tersebut, saya sarankan untuk mengambil pendekatan yang sedikit berbeda yang akan lebih mudah dibaca dan lebih mudah dikelola dalam jangka panjang.

Sebagai permulaan, saya akan merekomendasikan menggunakan nama yang sama pada semua kotak centang, dan menggunakan DetailName sebagai nilai daripada sebagai kunci:

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

Selanjutnya, dengan menggunakan nilai input Anda daripada kunci, sekarang kita dapat menghasilkan klausa kita. Sangat efisien:

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

Terakhir, dalam kueri Anda, saya sarankan menggunakan IN operator daripada OR operator untuk efisiensi dan keterbacaan:

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

Inilah keseluruhan sisi PHP yang menggabungkan modifikasi yang saya sarankan dengan logika Anda:

<?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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Struktur database MySql untuk :Cari berdasarkan kolom tunggal dan nilai yang berbeda

  2. Perbedaan antara IS NOT NULL dan NOT (field =NULL) dalam 2 kueri ini

  3. meningkatkan kinerja pada kueri SELECT dengan kumpulan data titik 3D yang besar

  4. MySQL Pilih Grup Catatan Berdasarkan stempel waktu terbaru

  5. Bagaimana cara menambahkan kondisi dalam model anak sub-sub dalam sekuel yang akan memengaruhi Model induk saya di findAndCountAll?