Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Chạy một truy vấn dựa trên nhiều hộp kiểm

Cốt lõi của vấn đề của bạn dường như là thực tế bạn đang xoay quanh cột DetailName trong dấu ngoặc kép:"'DetailName'='" khi tất cả những gì nó nên là "DetailName='"

Một lưu ý về bảo mật, tôi muốn chỉ ra rằng hàm mysql_escape_string() bạn đang sử dụng để buộc đầu vào thân thiện với mysql đã cũ và có nhiều lỗ hổng bảo mật. Thay vào đó, tôi khuyên bạn nên sử dụng cách triển khai an toàn hơn nhiều:mysql_real_escape_string() . Các ví dụ mã bên dưới sử dụng chức năng mới hơn, an toàn hơn.

Tuy nhiên, tách biệt khỏi những vấn đề đó, tôi khuyên bạn nên thực hiện một cách tiếp cận hơi khác sẽ dễ đọc hơn và dễ quản lý hơn nhiều về lâu dài.

Đối với người mới bắt đầu, tôi khuyên bạn nên sử dụng cùng một tên trên tất cả các hộp kiểm và sử dụng DetailName làm giá trị thay vì làm khóa:

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

Tiếp theo, bằng cách sử dụng các giá trị đầu vào của bạn thay vì các khóa, bây giờ chúng ta có thể tạo mệnh đề của mình. Rất hiệu quả:

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

Cuối cùng, trong truy vấn của bạn, tôi khuyên bạn nên sử dụng IN thay vì OR toán tử để hiệu quả và dễ đọc:

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

Đây là toàn bộ khía cạnh PHP của mọi thứ kết hợp các sửa đổi mà tôi đề xuất với logic của bạn:

<?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. mysqldump vấn đề với lỗi khôi phục:'Vui lòng NGẮT không gian bảng trước khi NHẬP'

  2. Git bash trên windows 7. Lệnh mysqldump không hoạt động

  3. ASP, MySQL và UTF-8

  4. EclipseLink không tìm nạp được giá trị Boolean vô hướng

  5. Nhúng nhận xét trong câu lệnh MySQL