【问题标题】:Full text search with mysql php使用 mysql php 进行全文搜索
【发布时间】:2020-09-23 09:39:06
【问题描述】:

我正在尝试制作搜索键功能。但我没有得到以下查询的任何结果。

public function SearchKey($key,$userid)
{
     $key = mysqli_real_escape_string($this->db, $key);
     $userid = mysqli_real_escape_string($this->db, $userid); 
      
      $query = mysqli_query($this->db,"SELECT * FROM posts WHERE 
       MATCH(theKey) AGAINST('$key' IN NATURAL LANGUAGE MODE) 
       AND uid = '$userid' ORDER BY sgq_id LIMIT 5") or die(mysqli_error($this->db));
      
       while($row=mysqli_fetch_array($query)) { 
          $data[]=$row;
       }
       if(!empty($data)) { 
         return $data;
       }   
     
}

然后获取,

$search = $Data->SearchKey($key, $userid);
if($search){
   foreach($search as $data){
       echo $data['theKey'];
   }
}

例如,如果我搜索 OK005,则无法获得任何结果。我试过全文搜索功能https://dev.mysql.com/doc/refman/8.0/en/fulltext-search.html

任何人都可以在这里帮助我,我缺少什么?

【问题讨论】:

  • 您是把'$key''$userId' 直接放在查询中,还是它们被替换为占位符?
  • @skrrp $key 是搜索值,$userId 是登录用户ID。
  • 好的。在进行数据库调用之前打印出 SQL 字符串。当您自己对数据库运行该查询时,请发布生成的 SQL 以及 MySQL 的输出。
  • 当我从 MySQL 运行 SQL 查询时,我得到了正确的结果。 :\
  • 如果这是真正的代码,而不是为问题重新键入,那么您拼错了一个变量! $search = $Data->SearchKey($key, $userid); if($serach){ -- 注意serach

标签: php mysql


【解决方案1】:

您使用单引号来传递变量。这些不会在您的查询中展开。您最好使用准备好的语句,并使用参数/值绑定来传递变量。这也将解决您的代码似乎容易受到攻击的 SQL 注入问题。

你可以试试这样的:

// Replace comment with appropriate connection data.
$pdo = new PDO(/* your DSN etc. */);

// Your query.
$sql =
'SELECT * FROM posts WHERE ' .
'MATCH(theKey) AGAINST(? IN NATURAL LANGUAGE MODE) ' .
'AND uid = ? ORDER BY sgq_id LIMIT 5';

// Create prepared statement from query.
$statement = $pdo->prepare($sql);

// Bind the values and enforce data type.
$statement->bindValue(1, $key, PDO::PARAM_STR);
$statement->bindValue(2, $userid, PDO::PARAM_INT);

// Run query.
$statement->execute();

// Get query results.
$rows = $statement->fetchAll();

// Your magic ...

【讨论】:

  • @Azzo,如果您认为我的回答有价值,请考虑将其标记为已接受 :)。
  • 嗨@ro-achterberg 感谢您的回答,但我在这里无法显示任何区别。您使用刚刚添加 pdo 的相同代码回答
  • @Azzo,据我了解,您的查询在您的 PHP 中不起作用,但它在 SQL shell 中起作用。所以问题似乎是你的PHP,你还没有发布。你试过我的例子吗?如果您有并且它不起作用,请发布您的代码,以便我们更好地为您提供帮助。
  • OP的查询完全有效
  • @LelioFaieta,我的观点完全正确。 Azzo 告诉我们 SQL 可以工作,但他的代码不能。然而他没有向我们展示任何代码。我的回答至少提供了一个起点。
猜你喜欢
  • 1970-01-01
  • 2012-04-16
  • 2019-11-16
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
相关资源
最近更新 更多