0

我有一个包含过滤器公司零件号的大型数据库。一些产品具有相似的年份和型号。我有一个 php 脚本,它正在搜索每个部分的文本关键字部分。

因此,对于 1997-1999 Honda Crf 250 090987 19.95,关键字是:1997 1998 1999 honda crf 250 090987

我从教程中获得了代码,它被编写用于搜索关键字部分以查找由空格分隔的所有内容。问题是很多房源都有本田或类似的年份价差。

我需要弄清楚如何更改 php 以缩小结果范围,因此如果有人键入“1997 honda”,则不会出现所有的 honda 和 97 年代,而只会出现 1997 年的 honda。

我是 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();

?>

4

3 回答 3

0

AND在查询中使用而不是OR强制所有关键字必须匹配,否则一个关键字匹配将始终返回结果。除此之外,您必须在代码中进行一些相关性工作,这可能会减慢应用程序的速度。

于 2012-09-27T23:15:57.693 回答
0

有趣的问题。

我想到了两种方法:

(1) 如果你可以控制数据库结构,你可以选择 WHERE (make = 'Honda' AND Year IN (1997,1998,1999)) 和你已经拥有的“喜欢”的东西(没有品牌/年份)。但是您需要将模型年份分开并分成单独的字段。

(2) 否则,如果我们可以假设输入始终是“year(s) make [other keywords],我们可以按照 izuriel 在我输入时建议的操作,只需“AND 'keywords = '1997' AND keywords = 'honda ' AND(我们现有的“like”子句列表)”。

这样,您将仅获得具有任何或所有其他关键字的 1997 Hondas。

于 2012-09-27T23:21:49.930 回答
0

如果数据库很大,我建议您在单词的末尾使用一个符号百分比 and you and 而不是 or 并且您在查询中限制

于 2012-09-27T23:25:35.433 回答