【问题标题】:Search function returns the same result multiple times搜索功能多次返回相同的结果
【发布时间】:2015-06-20 00:35:37
【问题描述】:

我正在尝试在 PHP 中创建搜索功能,但是遇到了一个小问题。当我输入单个搜索词时,我得到了预期的结果(单个记录,列出了单个搜索结果),但是当我输入 2 个或更多有效搜索词时,我得到了多次列出的相同记录。有人能指出我哪里出错了吗?

public function product_search($search_terms)
{
    $search_terms = htmlspecialchars($search_terms);
    $search_terms = stripslashes($search_terms);
    $search_terms_array = explode(" ", $search_terms);
    $terms_count = count($search_terms_array);
    $zerocount = 0;
    for($i = 0; $i < $terms_count; $i++)
    {
        $search_terms_array = trim($search_terms_array[$i]);
        ${"query".$i} = $this->mysqli_link->query("SELECT * FROM sjs_product_list WHERE prod_tags LIKE '%" . $search_terms_array[$i] . "%'");
        if(${"query".$i}->num_rows < 1)
        {
            $zerocount++;
        }
        else
        {
            while($row = ${"query".$i}->fetch_array())
            {
                $rows[] = $row;
            }
            foreach($rows as $row)
            {
                echo "<h3><a href=\"index.php?section=products&amp;subsection=" . $row['prod_category'] . "&amp;prodid=" . $row['prod_id'] . "\">" . $row['prod_name'] . "</h3></a><img src=\"includes/images/product_images/" . $row['prod_category'] . "/" . $row['prod_pic_filename'] . "\" alt=\"\"/><p>Price: " . $row['prod_price'] . "</p><p>" . $row['prod_code'] . "</p>";
            }
        }
    }
    if($zerocount == $terms_count)
    {
        echo "<h3>Your search terms returned 0 results. Please try using different search terms.";
    }
}

【问题讨论】:

  • 当您执行$search_terms_array = trim($search_terms_array[$i]);时,您正在用字符串替换数组
  • 了解数组。您应该使用$query[$i] 而不是${"query".$i}。数组是几乎所有编程语言中的基本概念。
  • 其实没有必要为每个查询结果使用不同的变量。您每次都可以重复使用相同的 $query 变量。

标签: php arrays search for-loop mysqli


【解决方案1】:

改变

$search_terms_array = trim($search_terms_array[$i]);

$search_terms_array[$i] = trim($search_terms_array[$i]);

您只是用第一个元素替换了整个数组。然后当你在这之后使用$search_terms_array[$i] 时,你只是得到了这个字符串的ith 字符。

另一个问题:您没有在每次循环中都清除$rows 数组。放:

$rows = array();

之前

while ($row = ${"query".$i}->fetch_array())

您将在循环内打印整个 $rows 数组,因此每次您也打印上一次迭代中的行,即使它们已经打印了。

【讨论】:

  • 你好。谢谢你,做了改变,但仍然遇到同样的问题。数据库中只有一条记录用于测试目的,但是如果我输入 2 个搜索词,它会返回 3 次记录,如果我输入 3 个搜索词,它会返回 6 次记录。如果我输入与记录相关的所有 5 个搜索词,它会返回记录 15 次?
  • 我还在掌握 OOP 和数组,所以请耐心等待 :)
  • 我看不出这段代码有什么办法可以做到这一点。您是否可能多次致电product_search
  • array(2) { [0]=> string(4) "test" [1]=> string(4) "blah" }
  • 好的,谢谢!我现在可以使用代码来阻止它为每个搜索词返回相同的记录。
【解决方案2】:

在您的代码中替换以下两行:-

<?php 
$search_key = trim($search_terms_array[$i]);
${"query".$i} = $this->mysqli_link->query("SELECT * FROM sjs_product_list WHERE prod_tags LIKE '%" . $search_key  . "%'");
?>

【讨论】: