0

我将用户选项存储在以逗号分隔的数据库中,并且我拥有用户从中选择这些选项的完整选项列表。我正在尝试获取用户选择的选项,然后将其分隔为逗号后的每个值,然后将其与完整选项进行比较,并使用复选框将用户选项从所有选项中选中。并保持其余选项未选中。但问题是我的结果正在重复。这是我的代码

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
                            }
                            }
                            }
                                    ?>
4

1 回答 1

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,',%');

一个用于测试的 SQLfiddle

这将为每个宗教返回一行,使用 aLEFT JOIN查看它是否列在用户的宗教列表中。

但是,您真正应该做的是不要将逗号分隔的值存储在列中,而是将宗教列表分成单独的表。这将允许数据库对数据进行更有效的查询。上面的查询没有使用任何索引来匹配字符串,如果将来宗教数量增加,这可能会成为问题。

于 2013-05-05T07:35:41.067 回答