簡體   English   中英

PHP:使用多個選擇下拉列表搜索mysql數據庫?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM