CodeIgniter 查询在多列中搜索输入字符串的每个单词[重复]

问题描述 投票:0回答:2

我有一个搜索表单,工作人员用它来搜索用户帐户。我希望搜索表单获取用户的输入并在数据库中搜索与其匹配的用户。 这是我的数据库结构...

用户表 ->(id、fname、lname、ip_address...等)

这是我在模型中用于搜索用户的内容...

$this->db->or_like('fname', $query);
$this->db->or_like('lname', $query);
$this->db->or_like('email', $query);

$this->db->or_where('ip_address', $query);

$query = $this->db->get('users');

这对于大多数搜索都很有效。 例如......

搜索:比尔

返回具有帐单名字或姓氏的所有用户.....

但是,即使存在匹配的用户,搜索名字和姓氏也不会返回用户。 例子....

搜索:比尔·盖茨

该搜索不会返回 fname 为 Bill 和 lname 为 Gates 的用户。 我该怎么做才能让这项工作成功?

php codeigniter activerecord sql-like query-builder
2个回答
6
投票

您必须将搜索词分解为多个单独的词。 CI 会将查询写为:

WHERE fname LIKE '%Bill Gates%' OR lname LIKE '%Bill Gates%' etc...

这永远不会匹配,因为“比尔盖茨”永远不会出现在数据库的单个字段中。但是,如果您将其拆分为多个单词(

Bill
Gates
)并将每个单词单独添加到
or
集中,您将获得匹配项。

如果您使用 MyISAM 表,另一种选择是在 3 个字段中使用全文索引,这将找到“bill Gates”,即使 bill 是一个字段而 Gates 在另一个字段中。

显然,对 InnoDB 的全文支持现在实际上终于进入了开发流程,但目前它仍然仅在生产代码中为 myisam。


0
投票

由于您在数据库中拆分了名字和姓氏,并在两个 or_like() 调用中使用相同的变量,因此您只能搜索一个单词。

您必须在“”(空格)处拆分字符串,并为每个部分调用 or_like() 或使用具有 3 个独立输入字段的表单(恕我直言,这是更好的主意)。

© www.soinside.com 2019 - 2024. All rights reserved.