我有一个包含过滤器公司部件号的大型数据库。有些产品的年份和型号相似。我有一个PHP脚本,正在搜索每个部分的文本关键字部分。
因此对于1997-1999 Honda Crf 250 090987 19.95,关键字是: 1997 1998 1999 honda crf 250 090987
我从教程中获取了代码,并编写了搜索关键字部分以查找由空格分隔的所有内容。问题是很多房源都有本田或类似的年度差价。
我需要弄清楚如何改变php以缩小结果,所以如果有人输入“1997 honda”,所有的hondas和'97s都不会出现,只有1997年的hondas。
我是php的新手,我看了四周,无法弄明白。任何帮助都将得到彻底的赞赏。
这是php:
$keywords = $_GET['keywords'];
$terms = explode(" ", $keywords);
$query = "SELECT * FROM search WHERE ";
foreach ($terms as $each){
$i++;
if ($i == 1)
$query .= "keywords LIKE '%$each%' ";
else
$query .= "OR keywords LIKE '%$each%' ";
}
// connect
mysql_connect("localhost", "root", "root");
mysql_select_db("catalog");
$query = mysql_query($query);
$numrows = mysql_num_rows($query);
if ($numrows > 0){
while ($row = mysql_fetch_assoc($query)){
$id = $row['id'];
$year = $row['year'];
$manufacturer = $row['manufacturer'];
$product = $row['product'];
$partnumber = $row['partnumber'];
$price = $row['price'];
echo "<div id=\"results\">
<div class=\"words\">$year</div><div class=\"words\">$manufacturer</div><div class=\"words\">$product</div><div class=\"words\">$partnumber</div>$price<br /></div>";
}
}
else
echo "<div class=\"no_results\"><center>No results found for \"<b>$keywords</b>\"</center></div>";
// disconnect
mysql_close();
&GT;
答案 0 :(得分:0)
在查询中使用AND
而非OR
强制所有关键字必须匹配,否则一个关键字匹配将始终返回结果。除此之外,您将不得不在代码中进行一些相关性工作,这可能会降低应用程序的速度。
答案 1 :(得分:0)
有趣的问题。
我想到了两种方法:
(1)如果你可以控制数据库结构,你可以选择WHERE(make ='Honda'和年份IN(1997,1998,1999))和你已经拥有的“喜欢”的东西(没有make /年)。但是你需要将模型年分开并分成不同的领域。
(2)否则,如果我们可以假设输入始终为“年份制作[其他关键字]”,我们可以在我输入时使用izuriel建议的内容,只需“AND'keywords ='1997'和关键字='honda'AND(我们现有的“喜欢”条款列表)“。
通过这种方式,您只能拥有拥有任何或所有其他关键字的1997 Hondas。
答案 2 :(得分:0)
我建议您在单词的末尾使用一个符号百分比,而不是或者您在查询中限制数据库是否很大