【问题标题】:PHP search displaying duplicate results that are nothing like queryPHP 搜索显示与查询完全不同的重复结果
【发布时间】:2019-01-19 10:18:43
【问题描述】:

所以我只是想创建一个基本的搜索栏来增加我的 php 和 mysql 知识,但我很困惑。

我已经按照教程自己玩过代码,但我不知道搜索查询的工作方式会显示结果,但显示的结果与搜索查询完全不同,它会显示许多重复的结果。

我有 2 个不同的人,有 2 个不同的产品链接到他们,这就是它所显示的内容。

这是我正在搜索的查询。

这是我的代码,我希望有更多知识的人能够提供帮助,希望这不仅仅是我犯的一个简单的错误:O

<?php
$query = $_GET['q'];
// gets value sent over search form

$min_length = 3;
// you can set minimum length of the query if you want

if(strlen($query) >= $min_length){ // if query length is more or equal minimum length then

    $query = htmlspecialchars($query);
    // changes characters used in html to their equivalents, for example: < to &gt;

    $query = mysql_real_escape_string($query);
    // makes sure nobody uses SQL injection

    $raw_results = DB::query("SELECT  * FROM forsale, users WHERE forsale.productname LIKE '%" . $query .  "%' OR users.username LIKE '%" . $query ."%'");

    if (count($raw_results) > 0) {
      foreach($raw_results as $results) {

        echo $results['productname'];
        echo $results['username'];
        echo $results['price'];

      }
    }else{ // if there is no matching rows do following
        echo "No results";
      }
}else{ // if query length is less than minimum
  echo "Minimum length is ".$min_length;
}

?>

非常感谢您。

【问题讨论】:

  • forsaleuser 表是如何链接的,您需要在 SELECT 中使用一些公共字段来告诉它如何组合行。
  • @NigelRen 它们通过 user_id 关系链接。
  • @JonnyGinaDommett 如果他们通过 user_id 关系链接,您应该使用“LEFT JOIN”子句来加入他们。
  • 可能有两个原因:错误的查询或查询函数同时返回 assoc 和一个数组。让我们先用 MySQL 直接检查您的查询。如果查询没有问题,请检查您的查询函数php.net/manual/en/mysqli-result.fetch-all.php(阅读全文)。

标签: php html mysql duplicates searchbar


【解决方案1】:

作为检查它是否有效的快速修复,您需要使用 user_id 将两个表链接在一起...

$raw_results = DB::query("SELECT  * 
                           FROM forsale, users 
                           WHERE forsale.user_id = users.user_id
                               and (forsale.productname LIKE '%" . $query .  "%' 
                                 OR users.username LIKE '%" . $query ."%'"));

我建议改用较新的 JOIN 格式 (https://dev.mysql.com/doc/refman/8.0/en/join.html) 以及研究使用准备好的语句和绑定变量。

【讨论】:

  • 谢谢奈杰尔,这很有效。为什么那行得通而我的行不通?唯一仍然不起作用的是搜索查询显示 Jonnydoby 而不仅仅是 Josh 的结果。你知道为什么会这样吗?
  • 正如我所提到的,您必须说如何将两个表链接在一起,因此您所说的待售商品通过 user_id 链接到销售它的用户。第二部分 - 取决于您传入的内容,因为 $query 将取决于它找到的结果。
  • 在你的例子中,你有 'josh' 和 'Josh' 因为大小写不匹配它不会找到它,阅读stackoverflow.com/questions/2876789/…
  • 它可以匹配产品名称中的内容吗?
  • 所以我应该添加一个大写/小写的东西,所以它总是匹配的。非常感谢这对我帮助很大。 :)
【解决方案2】:

试试这个:

$raw_results = DB::query("SELECT f.* FROM forsale f LEFT JOIN users u ON f.user_id = u.id WHERE f.productname LIKE '%" . $query . "%' OR u.username LIKE '%" . $query ."%'");

您实际上需要LEFT JOIN 他们才能使查询正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-28
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多