2011-11-15 33 views
0

1つの単語を完全に検索することができます。私は2つ以上の言葉を同様に働かせたいと思っています。PHPコードがうまく動作しません。検索機能

は、これまでのところ、私は複数の単語を検索した場合の結果は、このことで、はるかにこれを得た:複数の単語の検索がある場合になるよう

SELECT id, title, tag, type 
FROM table WHERE **AND** p.id LIKE '%flower%' OR title LIKE '%flower%' OR tag LIKE '%flower%' OR type LIKE '%flower%' 
AND p.id LIKE '%floral%' OR title LIKE '%floral%' OR tag LIKE '%floral%' OR type LIKE '%floral%' 
ORDER BY title 

にはどうすれば適切にを利用し、ん私は私のコードで余分なANDを取得しません。

もっと効率的な方法がありますか?

if (count($error) < 1) { 
    $searchSQL = "SELECT id, title, tag, type  
       FROM table 
       WHERE "; 

$searcheach = explode(" ", $searchTerms); 

foreach($searcheach as $searchword) { 

//if more than one word do this else do that 
if(strpos(trim($searchTerms), ' ') !== false) { 
    $searchSQL .= "AND p.id LIKE '%{$searchword}%' 
       OR title LIKE '%{$searchword}%' 
       OR tag LIKE '%{$searchword}%' 
       OR type LIKE '%{$searchword}%' "; 
    } 
    else { 
     $searchSQL .= "p.id LIKE '%{$searchword}%' 
       OR title LIKE '%{$searchword}%' 
       OR tag LIKE '%{$searchword}%' 
       OR type LIKE '%{$searchword}%' "; 
     } 

} 
$searchSQL .= "ORDER BY title"; 
+0

あなたの質問は非常に不明です...あなたは何をしようとしているのか詳しく説明できますか? if文の最初の部分にある 'AND'の目的は何ですか? –

+0

あなたは[Lucene](http://lucene.apache.org/java/docs/index.html)を試しましたか?あなたの人生はずっと楽になります。 – NullUserException

答えて

4
$words = explode(' ', $searchTerms); 

$clauses = array() 
foreach($words as $word) { 
    $safeword = mysql_real_escape_string($word); 
    $clauses[] = "(p.id LIKE '%{$safeword}%' OR title LIKE '%{$safeword} OR etc...)"; 
} 
$clause = implode(' AND ', $clauses); 

$sql = "SELECT ... WHERE $clause ORDER BY title"; 
+0

BOOLEAN FULL TEXTの検索とは別に、これは私が個人的に行っているオプションです... – landons

+0

大変感謝しています! – checkenginelight

0

私はむしろ、私はそれがあるべきと信じて、あなたは括弧を逃したように見える、

$searchSQL = "SELECT id, title, tag, type  
      FROM table 
      WHERE (1=1)"; 

は今、あなたは常に

また、各条件の前にANDを付加することができますだろう

$searchSQL .= "AND (p.id LIKE '%{$searchword}%' 
      OR title LIKE '%{$searchword}%' 
      OR tag LIKE '%{$searchword}%' 
      OR type LIKE '%{$searchword}%') " 
0

私は通常1 = 1のフィルタを使用していますので、複数の単語

SELECT id, title, tag, type 
    FROM table 
    WHERE 1=1 
    AND p.id LIKE '%flower%' 
    OR title LIKE '%flower%' 
    OR tag LIKE '%flower%' 
    OR type LIKE '%flower%' 
    AND p.id LIKE '%floral%' 
    OR title LIKE '%floral%' 
    OR tag LIKE '%floral%' 
    OR type LIKE '%floral%' 
    ORDER BY title 

そして、それを行うためのコードは次のようになります:S、SQLは次のようになります

if (count($error) < 1) { 
    $searchSQL = "SELECT id, title, tag, type  
       FROM table 
       WHERE 1=1"; 

$searcheach = explode(" ", $searchTerms); 

foreach($searcheach as $searchword) { 

//if more than one word do this else do that 
if(strpos(trim($searchTerms), ' ') !== false) { 
    $searchSQL .= " AND p.id LIKE '%{$searchword}%' 
       OR title LIKE '%{$searchword}%' 
       OR tag LIKE '%{$searchword}%' 
       OR type LIKE '%{$searchword}%' "; 
    } 
    else { 
     $searchSQL .= "p.id LIKE '%{$searchword}%' 
       OR title LIKE '%{$searchword}%' 
       OR tag LIKE '%{$searchword}%' 
       OR type LIKE '%{$searchword}%' "; 
     } 

} 
$searchSQL .= "ORDER BY title"; 
0

私は配列としてすべての私の用語を構築し、その後破を使用する傾向がある:

foreach($searcheach as $searchword) { 
    $sqlSearchTerms[] = "p.id LIKE '%{$searchword}%' 
    OR title LIKE '%{$searchword}%' 
    OR tag LIKE '%{$searchword}%' 
    OR type LIKE '%{$searchword}%' "; 
} 

$searchSQL .= implode(' AND ', $sqlSearchTerms); 
関連する問題