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