आपकी समस्या का मूल यह तथ्य प्रतीत होता है कि आप DetailName
. कॉलम के आस-पास हैं सिंगल कोट्स में:"'DetailName'='"
जब यह सब होना चाहिए "DetailName='"
सुरक्षा के एक नोट पर, मैं यह बताना चाहूंगा कि फ़ंक्शन mysql_escape_string()
आप इनपुट को mysql- अनुकूल होने के लिए बाध्य करने के लिए उपयोग कर रहे हैं और सुरक्षा छेद के साथ पुराना है। इसके बजाय, मैं अधिक सुरक्षित कार्यान्वयन का उपयोग करने की सलाह दूंगा:mysql_real_escape_string()
. नीचे दिए गए कोड उदाहरण नए, सुरक्षित फ़ंक्शन का उपयोग करते हैं।
हालांकि, उन मुद्दों से अलग, मैं थोड़ा अलग दृष्टिकोण अपनाने की सलाह दूंगा जिसे पढ़ना आसान होगा और लंबे समय में प्रबंधित करना बहुत आसान होगा।
शुरुआत के लिए, मैं सभी चेकबॉक्सों पर एक ही नाम का उपयोग करने की सलाह दूंगा, और DetailName को कुंजी के बजाय मान के रूप में उपयोग करने की सलाह दूंगा:
<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>
इसके बाद, कुंजी के बजाय आपके इनपुट के मूल्यों का उपयोग करके, अब हम अपना क्लॉज उत्पन्न कर सकते हैं। बहुत कुशलता से:
// 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);
अंत में, आपकी क्वेरी में, मैं IN
. का उपयोग करने की अनुशंसा करता हूं OR
. के बजाय ऑपरेटर दक्षता और पठनीयता के लिए ऑपरेटर:
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
आपके तर्क के साथ मेरे द्वारा सुझाए गए संशोधनों को मिलाने वाली चीजों का संपूर्ण PHP पक्ष है:
<?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";
}
}