[英]PHP: Search mysql database using multiple select dropdown lists?
我正在嘗試使用頁面上的多個下拉列表搜索MYSQL數據庫。
但是,此搜索功能有一個小的扭曲。
基本上,我需要確保所有條件(所有多個select dropdonw值)都與項目匹配,如果它們確實匹配,則顯示結果!
此刻,即使下拉值之一與項目匹配,我的代碼也會顯示結果,這不是我要嘗試執行的操作。
這是我的代碼:
$searchList = "";
$clause = " WHERE ";//Initial clause
$sql="SELECT *
FROM `product_details`
INNER JOIN `ATTRIBUTES` ON product_details.id=ATTRIBUTES.id";//Query stub
if(isset($_POST['keyword']) && !empty($_POST['keyword'])){
foreach($_POST['keyword'] as $c){
if(!empty($c)){
$currentproduct = $_POST['product'];
$cat = $_POST['cat'];
##NOPE##$sql .= $clause."`".$c."` LIKE '%{$c}%'";
$sql .= $clause . " (ATTRIBUTES.attr LIKE BINARY '$c') AND ATTRIBUTES.sub_cat_name='$currentproduct'";
$clause = " OR ";//Change to OR after 1st WHERE
}
}
$sql .= " GROUP BY product_details.id";
//print "SQL Query: $sql<br />"; //<-- Debug SQl syntax.
// Run query outside of foreach loop so it only runs one time.
$query = mysqli_query($db_conx, $sql);
我什至嘗試刪除isset
並做了if(!empty($_POST['keyword'])){
但是即使下拉列表值之一與項目憑據匹配,我仍然會得到結果。
我不確定我在做什么錯,因為我認為使用if(!empty($_POST['keyword'])){
應該可以解決此問題,但沒有解決。
有人可以建議這個問題嗎?
任何幫助,將不勝感激。
編輯:我將代碼更改為以下,它不顯示任何內容:
$clause = " WHERE ";//Initial clause
$sql="SELECT *
FROM `product_details`
INNER JOIN `ATTRIBUTES` ON product_details.id=ATTRIBUTES.id";//Query stub
$currentproduct = $_POST['product'];
$cat = $_POST['cat'];
if(!empty($_POST['keyword'])){
foreach($_POST['keyword'] as $c){
if(!empty($c)){
##NOPE##$sql .= $clause."`".$c."` LIKE '%{$c}%'";
$sql .= $clause . " (ATTRIBUTES.attr LIKE BINARY '$c') AND ATTRIBUTES.sub_cat_name='$currentproduct'";
$clause = " AND ";//Change to OR after 1st WHERE
}
}
$sql .= " GROUP BY product_details.id";
//print "SQL Query: $sql<br />"; //<-- Debug SQl syntax.
// Run query outside of foreach loop so it only runs one time.
$query = mysqli_query($db_conx, $sql);
//var_dump($query); //<-- Debug query results.
// Check that the query ran fine.
if (!$query) {
print "ERROR: " . mysqli_error($db_conx);
}
$clause = " OR ";//Change to OR after 1st WHERE
上面的OR運算符將使您的where條件選擇一條記錄,即使1個關鍵字與attr字段匹配。 將其更改為“ AND”,以期望所有關鍵字都適用。
此外,... AND ATTRIBUTES.sub_cat_name ='$ currentproduct'“標准似乎適用於所有關鍵字,因此應僅在循環的每次迭代中添加一次此標准。行也應在循環的前面移動。
編輯:以反映將操作者更改為AND而沒有返回任何行。
...ATTRIBUTES.attr LIKE BINARY '$c'...
如果$ c中沒有通配符,則上述條件將要求單詞與attr字段匹配,就好像使用了=運算符一樣,這不太可能發生。 搜索中必須包含通配符:'%$ c%'
再加上一些防止sql注入的保護也將是不錯的。
EDIT2:如果每個屬性都存儲在自己的記錄中,那么會使事情變得有些復雜,因為地方條件是根據單個記錄而不是它們的集合來評估的。
我會給您一個示例選擇命令,但是您必須將其合並到您的php代碼中。
select product_details.* FROM product_details INNER JOIN
(select product_details.id, count(ATTRIBUTES.id) as total
FROM `product_details`
INNER JOIN `ATTRIBUTES` ON product_details.id=ATTRIBUTES.id
WHERE ATTRIBUTES.attr in (...)
GROUP BY product_details.id
HAVING total=...) as t
on t.id=product_details.id
子查詢會計算產品匹配的屬性數量,並消除計數不等於通過表單提交的參數數量的屬性。 外部查詢獲取計數匹配的那些產品的產品詳細信息。
對於in()子句中的...,您需要提供一個逗號分隔的,包含關鍵字的列表,例如:“'computer','apple'”。 在php和sztring串聯中使用implode()函數可獲得結果。
對於Have子句中的...,請替換$ _POST ['keyword']數組中的關鍵字數量(不過,您應該在代碼中檢查它是數組還是單個值)。
盡管如此,您仍應考慮sql注入對代碼的影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.