在php中过滤动态生成的搜索结果
项目背景 首先,我要说,我不是php方面的佼佼者,而且是所有人都认为的初学者,但我已经尝试为我的大学项目创建一个基于php的搜索 这是一个冰沙配方网站,在第一个实例中,用户将通过键入关键字进行搜索,这将生成搜索结果。这部分我记得很好。然而,当涉及到过滤结果时,我真的很挣扎。用户应该能够根据水果/蔬菜/冰沙类型以及关键字本身进行过滤。例如: 关键词=苹果过滤器=芒果(水果过滤器)、菠菜(蔬菜过滤器)解毒(类型过滤器) 然而,现在发生的是,我会得到每一个苹果,芒果,菠菜和排毒冰沙的实例。除此之外,如果一杯冰沙同时含有苹果和芒果,它会生成两次冰沙。我知道我需要在这里的某个地方包含数组_unique(),但我真的不知道在哪里 PHP 以下是我迄今为止的php:`在php中过滤动态生成的搜索结果,php,html,arrays,search,Php,Html,Arrays,Search,项目背景 首先,我要说,我不是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>";
?>`
$dbhost='*';
$dbuser='*';
$dbpass='*';
$dbname='*';
$k=$_GET['k'];
$terms=爆炸(“,$k”);
//从这里开始查询
$query=“从搜索中选择*”;
//从视图中查看用户是否单击了任何水果。
//如果是这样,那么将SEARCH_元数据表加入到查询中,这样您就可以找到所有可能的结果
如果(!空($_GET['fl-Fruit'])){
$query.='internaljoinsearch\u search上的元数据\u id=search.id';
}
//从这里开始WHERE子句
$query.='WHERE';
//首先查找用户输入的搜索词
foreach($条款为每个$){
$i++;
如果($i==1)
$query.=“像“%$each%”这样的关键字”;
其他的
$query.=”或“%$each%”之类的关键字;
}
//一旦找到搜索词
//TODO==运行对VEG和类型选项的检查
如果(isset($_GET['fl-FROUT'])){
//将所有GET变量设置为新变量只是为了使其更易于读取
$fruits=$_GET['fl-fruits'];
//FOREACH从刻面搜索中选择的水果
//遍历WHERE子句中的每一项。
foreach($水果作为$水果){
$query.=“XOR值=”$fruit';
}
}
如果(isset($_GET['fl-veg'])){
//将所有GET变量设置为新变量只是为了使其更易于读取
$蔬菜=$_获得['fl-veg'];
//FOREACH从刻面搜索中选择的水果
//遍历WHERE子句中的每一项。
foreach($蔬菜为$蔬菜){
$query.=“XOR值=”$veg';
}
}
如果(isset($_GET['fl-s-type'])){
//将所有GET变量设置为新变量只是为了使其更易于读取
$types=$_GET['fl-s-type'];
//FOREACH从刻面搜索中选择的水果
//遍历WHERE子句中的每一项。
foreach($type作为$type){
$query.=“XOR值=”$type';
}
}
变量转储($query);
回显“”。“您对$k的搜索结果”。”;
//连接到数据库
mysql_connect(“$dbhost”、“$dbuser”、“$dbpass”);
mysql_select_db(“$dbname”);
$query=mysql\u query($query);
$numrows=mysql\u num\u行($query);
如果($numrows>0){
while($row=mysql\u fetch\u assoc($query)){
$id=$row['id'];
$title=$row['title'];
$description=$row['description'];
$keywords=$row['keywords'];
$link=$row['link'];
回声“
$description“;
}
}
其他的
回显“k美元无结果”;
?>`
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>
我将在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中简单地使用字符串操作。另一种方法是使用“查询生成器”库,如
我觉得你的数据库设计需要重新思考