簡體   English   中英

在php中過濾動態生成的搜索結果

[英]Filtering dynamically generated search results in php

項目背景

首先,我會說我不是php方面的佼佼者,並且不是所有帳戶的初學者,但是我嘗試為我的大學項目創建基於php的搜索。

這是一個冰沙食譜網站,首先,用戶將通過鍵入關鍵字進行搜索,這將生成搜索結果。 這部分我很好。 但是,在篩選結果時,我真的很努力。 用戶應能夠按水果/蔬菜/冰沙類型以及關鍵字本身進行過濾。 例如:

關鍵字=蘋果過濾器=芒果(水果過濾器),菠菜(蔬菜過濾器)排毒(類型過濾器)

但是,當前發生的事情是,我將獲得蘋果,芒果,菠菜和排毒冰沙的所有實例。 除此之外,例如,如果冰沙同時包含蘋果和芒果,它將產生兩次冰沙。 我知道我需要在這里的某個地方包含array_unique(),但我真的不知道在哪里。

的PHP

到目前為止,這是我的PHP:`

                    $dbhost = '*';
                    $dbuser = '*';
                    $dbpass = '*';
                    $dbname = '*';

                    $k = $_GET['k'];
                    $terms = explode(" ", $k);

                    //START THE QUERY HERE
                    $query = "SELECT * FROM search";

                    //FROM THE VIEW FIND OUT IF THE USER HAS CLICKED ON ANY FRUITS. 
                        //IF SO THEN JOIN THE SEARCH_METADATA TABLE TO THE QUERY SO YOU CAN FIND ALL THE POSSIBLE FRUITS
                    if (!empty($_GET['fl-Fruit'])) {
                        $query .= ' INNER JOIN search_metadata ON search_id = search.id';
                    }

                    //START THE WHERE CLAUSE HERE
                    $query .= ' WHERE ';

                    //FIRST LOOK FOR THE SEARCH TERM THE USER ENTERED
                    foreach ($terms as $each){
                        $i++;
                        if ($i == 1)

                            $query .= " keywords LIKE '%$each%' ";
                        else 
                            $query .= " OR keywords LIKE '%$each%' ";

                    }

                    //ONCE THE SEARCH TERM HAS BEEN FOUND
                    //TODO ==== RUN CHECKS FOR VEG AND TYPE OPTIONS
                    if (isset($_GET['fl-Fruit'])) {

                        //SET ALL THE GET VARIABLES TO NEW VARIABLES JUST FOR MAKING IT EASIER TO READ
                        $fruits = $_GET['fl-Fruit'];


                        //FOREACH FRUITS SELECTED FROM THE FACET SEARCH
                            //RUN THROUGH EACH ONE IN THE WHERE CLAUSE.
                        foreach ($fruits as $fruit) {
                            $query .= " XOR value = '$fruit' ";
                        }

                    }
                    if (isset($_GET['fl-veg'])) {

                        //SET ALL THE GET VARIABLES TO NEW VARIABLES JUST FOR MAKING IT EASIER TO READ
                        $vegetables = $_GET['fl-veg'];


                        //FOREACH FRUITS SELECTED FROM THE FACET SEARCH
                            //RUN THROUGH EACH ONE IN THE WHERE CLAUSE.
                        foreach ($vegetables as $veg) {
                            $query .= " XOR value = '$veg' ";
                        }
                    }
                    if (isset($_GET['fl-s-type'])) {

                        //SET ALL THE GET VARIABLES TO NEW VARIABLES JUST FOR MAKING IT EASIER TO READ
                        $types = $_GET['fl-s-type'];


                        //FOREACH FRUITS SELECTED FROM THE FACET SEARCH
                            //RUN THROUGH EACH ONE IN THE WHERE CLAUSE.
                        foreach ($types as $type) {
                            $query .= " XOR value = '$type' ";
                        }
                    }

                    var_dump($query);


                    echo '<h1>' ."Your search results for $k". '</h1>';
                    //CONNECT TO DATABASE

                    mysql_connect("$dbhost", "$dbuser", "$dbpass");
                    mysql_select_db("$dbname");

                    $query = mysql_query($query);
                    $numrows = mysql_num_rows($query);

                    if ($numrows > 0) {

                        while ($row = mysql_fetch_assoc($query)) {
                            $id = $row ['id'];
                            $title = $row ['title'];
                            $description = $row ['description'];
                            $keywords = $row ['keywords'];
                            $link = $row ['link'];

                            echo "<div class='result'><img src='images/$id.jpg'><div class='result-text'><h2><a href='$link'>$title</a></h2>
                            <p>$description</p></div></div>";
                        }
                    }

                    else 
                        echo "No results for <b>$k</b>";

                    ?>`

HTML表格

<form class='form-wrapper' action='./search.php' method='get'>   
                    <input id='search' type='text' name='k' value='<?php echo $_GET['k']; ?>' />
                    <input type='submit' id="submit" value='search'>

                <div class="menu">
                    <strong><p class="menu-toggle"> Filter your search </p></strong>
                </div>
                <section class="filters">
                    <h2>Filter smoothies by Fruit:</h2>

                        <p>
                            <input type="checkbox" name="fl-Fruit[]" value="apple" id="apple"> 
                            <label for="apple">Apple</label>
                        </p>
                        ...
                        <p>
                            <input type="checkbox" name="fl-Fruit[]" value="strawberries" id="strawberries"> 
                            <label for="strawberries">Strawberries</label>
                        </p>                     



                    <h2>Filter smoothies by veg:</h2>
                        <p>
                            <input type="checkbox" name="fl-veg[]" value="beetroot" id="beetroot">
                            <label for="beetroot">Beetroot</label>
                        </p>
                        ...
                        <p>
                            <input type="checkbox" name="fl-veg[]" value="spinach" id="spinach"> 
                            <label for="spinach">Spinach</label><br>
                        </p>                  


                   <h2>Filter by smoothie type:</h2>

                        <p>
                            <input type="checkbox" name="fl-s-type[]" value="detox" id="detox">
                            <label for="detox">Supet Detox</label>
                        </p>
                        ...
                        <p>
                            <input type="checkbox" name="fl-s-type[]" value="muscle" id="muscle">
                            <label for="muscle">Muscle Building</label>     
                        </p>  
                        </form>    

桌子

我目前有兩個表“搜索”和“ search_metadata”。 “搜索”表包含用於關鍵字搜索的關鍵字,而“ search_metadata”表包含過濾器的屬性,並具有以下列“ search_id”(外鍵),“類型”(水果,蔬菜,類型),“值” ”(蘋果,胡蘿卜,排毒)。

只是重申我的要求:

  1. 如何合並Array_unique()以停止出現重復的結果
  2. 我如何做到這一點,以便如果用戶搜索“蘋果”然后選擇“芒果”和“百香果”過濾器,則只會顯示其中含有這3種成分的冰沙(不顯示其中含有那些成分之一的冰沙)

我希望有足夠的信息/沒有太多的信息,如果我可以改善這個問題,請告訴我,因為這是我第一次在此處發布信息。

謝謝

我將處理SQL查詢本身中的搜索​​邏輯,而不是獲取所有“搜索”行並在PHP中進行過濾。 如果用戶搜索“蘋果”,並選擇“芒果”和“百香果”過濾器,則查詢示例為:

SELECT
    *
FROM
    Search AS s JOIN Search_Metadata AS sm USING( search_id )
WHERE
    search_id = "apple" AND
    sm.value IN
    (
        "mango", "passionFruit"
    );

注意,是MySQL樣式語法。

有兩種方法可以構建這樣的查詢。 一種是簡單地在php中使用字符串操作。 另一種是使用“查詢生成器”庫,例如FluentPDO

我覺得您的數據庫設計需要重新考慮。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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