2013-05-05 92 views
0

我有用逗號分隔的用戶選項存儲在數據庫中,我有用戶選擇這些選項的完整選項列表。我正在嘗試獲取用戶選擇的選項,然後將逗號後的每個值分開,然後將其與完整選項進行比較,並使用複選框檢出所有選項中的用戶選項。並保持其他選項不被選中。但問題是我的結果正在重複。這是我的代碼當與循環的結果比較時,mysql結果會重複出現

function 

    get_religion_pref($page,$user_id) 

     { 
      $getrow=mysql_query("select * from religion"); 
      while($results=mysql_fetch_array($getrow)) 
      { 
       $main_values=$results['religion']; 
       $query=mysql_query("select * from partner_prefrences where uid=$user_id"); 
        $row=mysql_fetch_array($query); 

        $string =$row['religion']; 
        $string = preg_replace('/\.$/', '', $string); //Remove dot at end if exists              

        $array = explode(',', $string); //split string into array seperated by ', ' 
        foreach($array as $value) //loop over values 
         { 
         ?> 
         <li> 
          <label class="checkbox"> 
          <input type="checkbox" value="<?php echo $main_values; ?>" 
        <?php if($main_values==$value){?> checked <?php } ?>><?php echo $main_values; ?> 

          </label> 
          </li> 
          <?php 
          } 
          } 
          } 
            ?> 
+1

當你爲每個複選框收到一個相同的結果時,它們會重複嗎?這將是因爲你的第二次讀取沒有迭代,並且你只檢索第一行,但多次因爲其他循環放置在哪裏 – 2013-05-05 07:14:16

+0

我從第一次查詢中獲得每行重複3次 – user1001176 2013-05-05 07:31:13

回答

1

既然您遇到的循環,爲什麼不只是做整個事情在MySQL,而不是把多個查詢的麻煩;

SELECT r.id, r.religion,IFNULL(p.uid,0) selected 
FROM religion r 
LEFT JOIN partner_preferences p 
    ON p.uid=1 
AND CONCAT(',',p.religion,',') 
    LIKE CONCAT('%,',r.religion,',%'); 

An SQLfiddle to test with

這將爲每個宗教返回一行,使用LEFT JOIN來查看它是否列在用戶的宗教列表中。

什麼真的應該做的,不是將逗號分隔的值存儲在一列中,而是將宗教列表分解到單獨的表中。這將允許數據庫對數據進行更高效的查詢。上面的查詢沒有使用任何索引來進行字符串匹配,如果宗教數量增長,未來可能會成爲一個問題。

+0

感謝這個解決方案通過mysql本身但我還需要其他選項,以便用戶可以再次從其餘選項中進行選擇,並且在複選框中預先選擇了以前的選項,並且可以進一步選擇左邊的選項 – user1001176 2013-05-05 07:40:56

+0

@ user1001176查詢結果中缺少的解決方法是什麼?它會列出所有的宗教,所以你會得到一個完整的選項列表,它會顯示哪些是用戶選擇的,應該檢查。 – 2013-05-05 07:51:45

+0

謝謝有一個拼寫錯誤,我修復它,並使用你的解決方案,它像一個魅力工作謝謝你 – user1001176 2013-05-05 08:11:24