Php 使用LIKE搜索SQL查询
我已经使用两边都有%通配符的查询having子句实现了搜索 我有一个列有国家的名字。如果我用P或PAK搜索,它会显示结果,但如果我用“我住在巴基斯坦”搜索,它不会比较 我理解的是它与子字符串匹配 是否可以使其反之亦然,如我传递字符串“我住在巴基斯坦”,它与字段中的字符匹配,并获得巴基斯坦的结果Php 使用LIKE搜索SQL查询,php,mysql,sql,codeigniter,Php,Mysql,Sql,Codeigniter,我已经使用两边都有%通配符的查询having子句实现了搜索 我有一个列有国家的名字。如果我用P或PAK搜索,它会显示结果,但如果我用“我住在巴基斯坦”搜索,它不会比较 我理解的是它与子字符串匹配 是否可以使其反之亦然,如我传递字符串“我住在巴基斯坦”,它与字段中的字符匹配,并获得巴基斯坦的结果 如能立即提供帮助,将不胜感激 您可以用逗号替换空格,然后使用。假设您的字符串为“代码> $STR ,请考虑此查询: SELECT * FROM countries c WHERE c.name LI
如能立即提供帮助,将不胜感激 您可以用逗号替换空格,然后使用。假设您的字符串为“代码> $STR ,请考虑此查询:
SELECT *
FROM countries c
WHERE c.name LIKE '%$str%' OR
FIND_IN_SET(c.name, REPLACE($str, ' ', ',')) > 0
试试这个
public function searchCountry($value)
{
$value = $value;
$query = $this->db->query("SELECT * FROM table_name WHERE country LIKE '%$value%' ");
$result = $query->result_array();
return $result;
}
这可能有效(免责声明:未测试):
但是您可能应该使用@Mureinik solution。您可以使用codeigniter框架中的like()函数
$this->db->like();
此函数使您能够生成LIKE子句,用于执行搜索
注意:传递给此函数的所有值都将自动转义
简单键/值方法:
$this->db->like('title','match')
如果使用多个函数调用,它们将被链接在一起并在它们之间:
$this->db->like('title', 'match');
$this->db->like('body', 'match');
// WHERE title LIKE '%match%' AND body LIKE '%match%
如果要控制通配符(%)的放置位置,可以使用可选的第三个参数。您的选项有“before”、“after”和“both”(默认设置)
如果不想使用通配符(%),可以将选项“无”传递给可选的第三个参数
$this->db->like('title', 'match', 'none');
// Produces: WHERE title LIKE 'match'
我认为你需要的是搜索和比较提供的文本中的每个单词,我认为这将是有益的
$temp = array();
$str = array();
$str = explode(' ', $string);
foreach ( $str as $word) {
if (strlen($word) > 2) {
$this->db->or_like('country_name', $word, 'both');
} else {
continue;
}
}
$countries = $this->db->get('countries');
我认为在美元国家,你会得到所有需要的结果
为此,可以使用正则表达式技巧:
where country regexp replace($str, ' ', '|')
这构造了表达式:
where country regexp 'I|live|in|Pakistan'
由于正则表达式的规则,其计算结果为true。示例数据、所需结果,您尝试过的查询将澄清您正在尝试执行的操作。我正在使用SELECT*FROM表,其中的国家(如“%Pak%”)为我提供正确的结果,并显示包含国家巴基斯坦的所有行,但我希望在将其与“我爱巴基斯坦”进行比较时进行搜索,因为这句话还包含巴基斯坦谢谢您再指向一个国家功能:)问题:有没有办法标记/避免在集合中使用1和2个字母的单词?@Tpojka不太清楚你的意思。你们能详细说明一下吗?若你们检查一下我提供的PHP解决方案,你们会发现避免使用短词。例如,我的代码中的
$value=“a country servia”
将被避免,因为它可以在许多不想要的结果中找到。当然,对于country表不太需要,因为它的内容是~200个结果,但需要通用的mysql方式解决方案。
$temp = array();
$str = array();
$str = explode(' ', $string);
foreach ( $str as $word) {
if (strlen($word) > 2) {
$this->db->or_like('country_name', $word, 'both');
} else {
continue;
}
}
$countries = $this->db->get('countries');
where country regexp replace($str, ' ', '|')
where country regexp 'I|live|in|Pakistan'