2014-12-04 176 views
0

我使用Sphinx Search來搜索我的網站上的項目。我是使用foreach找出索引,搜索來自哪裏? Foreach循環將迭代所有匹配搜索項的項目,並找出索引。foreach循環中嵌套while循環的結果集結構

數據庫中的所有項都有user_id,它引用用戶表中的用戶。因此,我想輸出的是顯示少量項目(搜索)並將其放在該用戶下。如果搜索「Book」,則輸出像這樣

Alex  //Book1,Book2,Book3 all of them has user_id of 2 which refers to Alex 

Book1 
Book2 
Book3 

Jordan  //Book11,Book12,Book18 all of them has user_id of 5 which refers to Joradn 

Book11 
Book12 
Book18 

and so on. 

以下是一個

foreach ($res["matches"] as $doc => $docinfo) { 
    switch($docinfo['attrs']['table_id']) { 
     case 1:       //if search come from index 1 

     $res_db = mysqli_query($connect3,'select id_2, image, user_id, title, detail from lunch_menu where id_2 = (('.$doc.'-300000))'); 
      if ($res_db === false) { 
        echo "Error in mysql query #" . mysqli_errno($connect) . ' - ' . mysqli_error($connect); 
      } else { 
      $row = mysqli_fetch_assoc($res_db); 
          $connect4=mysqli_connect('localhost', 'root', '','user'); 
        $sql2="SELECT * FROM `user`.`user_det` WHERE id='".$row['user_id']."' GROUP BY id ORDER 
        BY id DESC"; 
        $query2=mysqli_query($connect4,$sql2); 
        while($row2 = mysqli_fetch_assoc($query2)){ //line X 
        $userx=$row2['id']; 
        $image=$row2['img']; 
        $busi_title=$row2['busi_title']; 

        $page_owner.="<img src='../../account/$userx/$image' width='140' 
        height='140'><b>$busi_title</b><hr>"; 

        $res_db2 = mysqli_query($connect3,'select id_2, image, user_id, title, detail from 
        lunch_menu where id_2 in ((' . $doc . '-300000)) order by field(id_2,('.$doc.'-300000))'); 
        $alu=""; 
        while($row3 = mysqli_fetch_assoc($res_db2)){ 
          $alu.= 

          '<img src="../../'.$row3['user_id'].'/lunch/'.$row3['image'].'" width="100" height="100">' 
          . '<a href="../../'.$row3['user_id'].'/menu_item2.php">' . $row3['title'] . '<a>' 

          . '<br/> '.$row3['detail'].'<br><br><br><br>' ; 
         } 
        $all.="<div id='' style='border:2px solid black;'>".$page_owner.".".$alu."</div>"; 
        } 
    } 

但上面的代碼是給我造成這樣

Alex 
Book1 

Alex 
Book2 

Alex 
Book3 

Jordan 
Book11 

Jordan 
Book12 

Jordan 
Book18 

and so on. 
代碼

我需要做些什麼修改才能讓我的代碼像預期的那樣工作。我盡了最大努力找到一個解決方案,但沒有幫助。所以,只是發了一個SO帳戶來發布問題。

請幫忙,如果可以的話。那真是太棒了。

在此先感謝

感謝您瑞安你reply.We幾乎沒有

1更多修復,那麼我們done.Now什麼,我得到的是

Problem 
Result is almost the way,I was looking for except for the first one.This is what I'm getting 

Alex 
Book1 

Jordan 
Book11 
Book12 
Book18 

Alex 
Book2 
Book3 

如果我可以在回覆$all之前臨時執行order by user_id,則可能會修復此錯誤。

因爲$all打印user和它的corresponding item它在數據庫

請告知,我使用的是第二種方式整理出來的樣子,你showed.First一個不能正常工作。

我想通了第二部分的problem.To的實現這一理想的結果,我需要做的這

$cl->SetSortMode(SPH_SORT_EXTENDED, '@relevance DESC,user_id ASC'); 

這行代碼輸出的第一個最相關的搜索結果,並通過user_id升序分類。

Special Thanks to Ryan

+0

保存當前的用戶ID,並且只打印出用戶信息 - >'$ page_owner = 「$ busi_title


」;'如果用戶ID發生變化。即。 '$ current_user = 0;如果($ current_user!= $ userx){$ page_owner。= ...; $ current_user = $ userx;' – Sean 2014-12-04 20:25:27

+0

感謝您的答覆。是,user_id更改,只是$ page_owner打印出來。我做了你說的,但仍然得到相同的結果 – Coder 2014-12-04 20:40:06

+0

**警告**:當使用'mysqli'您應該使用參數化查詢和['bind_param'](http://php.net/manual/en/mysqli-stmt.bind-param.php)將用戶數據添加到您的查詢中。 **不要**使用字符串插值來實現此目的,因爲您將創建嚴重的[SQL注入漏洞](http://bobby-tables.com/)。 – tadman 2014-12-04 21:15:36

回答

2

所以我有點困惑,其中重複的用戶是從,因爲我不知道你在查詢什麼,但我有想法可能是導致它而產生。

首先,如果內環是問題,那麼它是一個簡單的修復。只在第一個循環中顯示'user_id'。

   $alu=""; 
       $firstLoop = true; 
       while($row3 = mysqli_fetch_assoc($res_db2)){ 
         if($firstLoop){ 
          $alu.= '<img src="../../'.$row3['user_id'].'/lunch/'.$row3['image'].'" width="100" height="100">' 
          $firstLoop = false; 
         } 
         $alu.= '<a href="../../'.$row3['user_id'].'/menu_item2.php">' . row3['title'] . '<a>' 

         . '<br/> '.$row3['detail'].'<br><br><br><br>' ; 
        } 

另外,它可能會發生在外部循環,因爲肖恩建議。在這種情況下,我們可以跟蹤前一個用戶,以確定是否應該設置$ userx並使用$ page_owner。

 $prevUsr = ''; 
    foreach ($res["matches"] as $doc => $docinfo) { 
switch($docinfo['attrs']['table_id']) { 
    case 1:       //if search come from index 1 

    $res_db = mysqli_query($connect3,'select id_2, image, user_id, title, detail from lunch_menu where id_2 = (('.$doc.'-300000))'); 
     if ($res_db === false) { 
       echo "Error in mysql query #" . mysqli_errno($connect) . ' - ' . mysqli_error($connect); 
     } else { 
     $row = mysqli_fetch_assoc($res_db); 
         $connect4=mysqli_connect('localhost', 'root', '','user'); 
       $sql2="SELECT * FROM `user`.`user_det` WHERE id='".$row['user_id']."' GROUP BY id ORDER 
       BY id DESC"; 
       $query2=mysqli_query($connect4,$sql2); 
       while($row2 = mysqli_fetch_assoc($query2)){ 
       $userx=$row2['id']; 
       $image=$row2['img']; 
       $busi_title=$row2['busi_title']; 

       $page_owner.=""; 

       // only set the page owner if the user id is different 
       if($prevUsr != $userx){ 
        $page_owner.="<img src='../../account/$userx/$image' width='140' 
        height='140'><b>$busi_title</b><hr>"; 

        $prevUsr = $userx; 
       } 

       $res_db2 = mysqli_query($connect3,'select id_2, image, user_id, title, detail from 
       lunch_menu where id_2 in ((' . $doc . '-300000)) order by field(id_2,('.$doc.'-300000))'); 
       $alu=""; 
       while($row3 = mysqli_fetch_assoc($res_db2)){ 
         $alu.= 

         '<img src="../../'.$row3['user_id'].'/lunch/'.$row3['image'].'" width="100" height="100">' 
         . '<a href="../../'.$row3['user_id'].'/menu_item2.php">' . $row3['title'] . '<a>' 

         . '<br/> '.$row3['detail'].'<br><br><br><br>' ; 
        } 
       $all="<div id='' style='border:2px solid black;'>".$page_owner.".".$alu."</div>"; 
       } 
} 

我希望其中一個可以幫助你。

快樂編碼。 瑞安

+0

感謝您的回覆。我已經使用了第二種方法,因爲第一種方法不起作用。請看看@更新的問題。您的幫助將非常感謝 – Coder 2014-12-10 19:37:15

+0

當我回顯$ userx時,我得到9 7 7 9 9 9 9 。這裏7和9是user_id。爲什麼我沒有得到9 9 9 9 9 7 7,因爲我按ID排序?如果我可以通過回顯userx來實現這個結果,那麼我的程序將100% – Coder 2014-12-11 06:06:00