2012-11-17 69 views
2

我正在构建漫画网站并执行了搜索。搜索最初使用的图像标题...这工作得很好:PHP:关键字搜索:在字符串中查找子字符串

if (strtolower($input)==strtolower(substr($row['title'],0,strlen($input)))) { 

但现在我觉得很多人不会记得标题。所以我在数据库中添加了一个名为“keywords”的列,varchar [55] ...并且我的测试条目是字符串“five,second,rule,food,rules”。我想我可以用$row['keywords']代替$row['title'],搜索仍然可以。

它起作用,如果我从字符串的开头开始搜索,就像我输入“five,seco ...”但不是如果我从字符串的中间开始,如“second”或“rule”,等等。

关于如何使这项工作的任何想法?

谢谢!

+1

为什么不使用MySQL'LIKE'查询? – MrCode

+0

@MrCode,不错的主意,但它不会帮助搜索多个关键字与错误命令...我想 –

回答

4

的简单的解决办法是使用stripos代替:

if(stripos($input, $row['title']) !== false) { 
    // row matches 
} 

然而,这是不是一个真正的好办法。将过滤器卸载到数据库会好得多,因此,不匹配的行根本无需前往您的前端。如果将关键字保留为以逗号分隔的字段,那么LIKEREGEXP将是一个很好的工具选择;如果您规范化了数据库模式,以便将漫画与关键字的一对多关系用单独的comic_keywords表建模,那么匹配将更加容易。

例如,假设comicidcomic_keywordscomic_idkeyword,您可以选择与

SELECT DISTINCT(comic_id) FROM comic_keywords WHERE keyword = 'blah' 
+0

这听起来像一个好主意。我会给它一个!谢谢! – Growler

0

匹配的漫画看起来像你需要Sphinx或(不太可能,但更容易建立)MySQLs full-text search

+3

是的,Sphinx/Lucene/etc永远是更容易设置的解决方案。 [/讽刺] – Christian

7

在漫画的专栏中做它只会带来流泪,因为它打破了规范化。你应该做的是制作一个关键字表,每个条目有一个词,然后是一个数据透视表,将关键字与漫画相匹配。然后你可以做一个加入来找到所有匹配的漫画。

这是更多的工作来设置,但从长远来看更灵活。

编辑:

关键字表:

id  keyword 
1  x-men 
2  action 
3  mystery 
4  batman 
etc. 

comic_keyword表

comic_id keyword_id 
45   3 
678   1 
678   2 
77   3 
77   4 
etc. 

第二个表(透视表)漫画的ID相匹配的关键字的ID它们与...相关联。这就是多数情况下应该建立多对多关系的模式。

+0

好的,我可能需要一个例子,如果你有一个 – Growler

+0

看到新的编辑 –

+0

哦好吧,我陷了。我将不得不花一些时间来实现这一点。 – Growler

1

您可以在飞行中拆分柱:

if (in_array(strtolower($input), explode(', ', $row['title']))) { 
    /* found it */ 
} 
+0

或甚至建立在此上,使用@mrcode的searchign的想法'where关键字像%(<?php explode ...?>)%' –