2013-06-05 92 views
-1

我有一張名爲pages的表格,它在我的網站上存儲了網頁的ID,網址,標題和內容。下面是表的例子:MYSQLi Select - PHP回顯行內的每個查詢字詞出現

ID |   address  | title |      content    | 
------------------------------------------------------------------------------------ 
1 | www.example.com/page1 | Page 1 | The quick dog jumps over the lazy dog.  | 
2 | www.example.com/page2 | Page 2 | The best thing about morning is breakfast. | 
3 | www.example.com/page3 | Page 3 | Hotdogs are great ballpark food.   | 

我想SELECT查詢檢索詞的所有出現,並在PHP呼應他們。例如,如果我想的單詞「」我SELECT聲明是這樣顯示的搜索結果:

SELECT * FROM pages WHERE (`content` LIKE '%dog%') 

和我完全PHP聲明與搜索項= $query看起來是這樣的:

if ($result = $mysqli->query("SELECT * FROM pages WHERE (`content` LIKE '%".$query."%')")) { 
    // if one or more rows are returned do following 
    while($results = $result->fetch_array(MYSQLI_ASSOC)){ 
// $results = mysql_fetch_array($raw_results) puts data from database into array, while it's valid it does the loop 
    $content = $results['content']; 
    $contentItems = $results['contentSearch']; 

    // Count number of times term in content 
    $count = substr_count($contentItems, $originalQuery); 



    $content = substr($content,strpos($content,$firstTerm)-25,160); 
    $content = (strlen($content) > 55 ? '...'.$content.'...' : substr($results['description'],0,160).'...'); 

    foreach($querySplit as $term){ 
    $content = str_ireplace($term, '<strong>'.$term.'</strong>', $content); 
    } 
    // highlight search terms 

    $chars = array("\'", "&amp;"); 
    $charReplace = array("'", "&"); 
    $content = str_replace($chars,$charReplace,$content); 

    // set $image if not empty 
    $image = (!empty($results['image']) ? 'http://www.example.com/'.$results['image'] : ''); 


    /* ------------------ 
    ------ echo statement 
    --------------------*/ 
    echo ' 
    <li class="media">'; 
// if image is not empty 
if(!empty($image)): 
echo '<a class="pull-left span2 hidden-phone" href="http://www.example.com/'.$results['address'].'"> <img class="media-object thumbnail" src="'.$image.'" alt="'.$results['description'].'"/> </a>'; 
endif; 
echo ' 
<div class="media-body"> 
     <h4 class="media-heading"><a href="http://www.example.com/'.$results['address'].'">'.htmlspecialchars_decode($results['title']).'</a></h4> 
     <p class="result-address"><small><a href="http://www.example.com/'.$results['address'].'">http://www.example.com/'.$results['address'].'</a></small></p> 
     '; 
     /*if(!empty($image)): 
     echo '<a class="visible-phone" href="'.$results['address'].'"> <img class="thumbnail phone-search-thumb" src="'.$image.'" alt="'.$results['description'].'"/> </a>'; 
     endif;*/ 
     echo ' 
     <p class="result-content">'.$content.'</p> 
    </div> 
</li> 
    '; 
    /* ------------------ 
    ---end echo statement 
    --------------------*/ 


} $result->close(); 
} 

PHPSELECT語句返回兩個結果:

  1. 快速躍過...
  2. 是偉大的...

期望的結果(請幫助)

我會喜歡什麼 ,是爲了我的發言echo一個結果每次出現$query任期,即使在sa我行,如下所示:

  1. 快速躍過...(從Row 1
  2. ...在偷懶。 (從Row 1
  3. 是偉大的...(從Row 3

問題

如何編輯我PHP和/或我的SELECT語句,這樣,我可以echo一個結果爲出現$query期限?

+1

通過'PHP'解析來自數據庫的'content',看看有多少** **狗中存在的那句話。 –

+0

@YogeshSuthar - 你能解釋一下你的意思嗎?我不確定我明白。 – adamdehaven

+0

請注意,在用戶輸入查詢數據庫時,您應該使用準備好的語句。另外,你正在混合OOP和程序風格的mysqli。這只是在你的例子中,或從字面上你的代碼? – newfurniturey

回答

1

這裏是你的答WER。

<?php 

$query="dog"; 

if ($result = $mysqli->query("SELECT * FROM pages WHERE (`content` LIKE '%".$query."%')")) 
{ 
    $inc = 0; 
    $mysql_result = array(); 
    // if one or more rows are returned do following 
    while($a_result = $result->fetch_array(MYSQLI_ASSOC)) 
    { 
     $mysql_result[$inc]=$a_result; 
     $inc++; 
    } 

    $chars_to_show_before = 10; // ...1234567890dog 
    $chars_to_show_after = 10; // dog1234567890... 

    foreach($mysql_result as $results) 
    { 

     $content = str_replace($query,"my_un1qu3_r3pl4c3m3nt_".$query,$results['content']); 

     $occurences = explode("my_un1qu3_r3pl4c3m3nt_",$content); 

     $position_in_original_content = 0; 

     foreach($occurences as $an_occurence) 
     { 

      if (strpos($an_occurence,$query) !== false) 
      { 
       $content=$an_occurence; 

       echo '<li class="media"> 
     <a class="pull-left" href="'.$results['address'].'"> 
     <img class="media-object thumbnail" src="'.$results['image'].'" style="height:100px !important"> 
     </a> 
     <div class="media-body"> 
      <h4 class="media-heading"><a href="'.$results['address'].'">'.$results['title'].'</a></h4> 
      <p>...'.str_replace($query,'<strong>'.$query.'</strong>', substr($results['content'],max(0,($position_in_original_content-$chars_to_show_before)),strlen(strlen($query))+$chars_to_show_after+$chars_to_show_before)).'...</p> 
     </div> 
     </li>'; 
      } 

      $position_in_original_content = $position_in_original_content + strlen($an_occurence); 

     } 
    } 
} 
else 
{ 
    echo "Sorry, no results found!"; 
} 
?> 

工作演示在這裏:http://3v4l.org/BTeCU

+0

如果我誤解了原諒,請原諒我這個,但我怎麼會初始化我的結果,使用我現有的'mysqli'查詢,以便結果是'$ mysql_result [0] ['address'] =「www.example.com/page1」;'? – adamdehaven

+0

@AdamD看到更新的答案(沒有測試過,但應該沒問題):) – Sharky

+0

它部分與我的代碼一起工作,但是如果用戶有複合詞,如「dog park」,則不會返回結果。我正在玩它... – adamdehaven

0

正如Yogesh Suthar所說:使用PHP。

這裏快速和骯髒的例子

$count = substr_count($content, 'dog'); 

$offset = 0; 

for($i = 0 ; $i < $count ; $i++) { 

    echo $content; // put you code here with strpos($content,$query,$offset) 

    $offset = strpos($content, 'dog', $offset) + strlen('dog'); 
} 

編輯:

我添加$offset

編輯:

while($results = $result->fetch_array(MYSQLI_ASSOC)){ 

    $content = $results['content']; 

    $full_content = $content; 

    $contentItems = $results['contentSearch']; 

    // Count number of times term in content 
    $count = substr_count($contentItems, $full_content); 

    $offset = 0; 

    for($i = 0 ; $i < $count ; $i++) { 

     $content = substr($full_content, strpos($full_content, $firstTerm, $offset)-25,160); 


     // rest of your code 

     /* ------------------ 
     ---end echo statement 
     --------------------*/ 

     $offset = strpos($full_content, 'dog', $offset) + strlen('dog'); 
    } 
} 

$result->close(); 
+0

這只是顯示相同的結果,一遍又一遍地重複數字='$ count'。我需要移動到每個詞的下一個出現。 – adamdehaven

+0

您可以在[strpos](http://php.net/manual/en/function.strpos.php)中使用第3個參數來搜索字符串中的下一個'dog'。 – furas

+0

現在查看示例 - 我添加了'$ offset'。在代碼中使用'strpo()'中的'$ offset'作爲第3個參數。 – furas