2012-11-17 33 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 ...?>)%' –