我有用户选项存储在数据库中,由逗号分隔,我有用户选择这些选项的选项的完整列表。我试图让用户选择的选项,然后分开它打破逗号后的每个值,然后将其与完整的选项进行比较,并使用复选框检查出所有选项的用户选项。其他选项都不启用。但问题是我的结果是重复的。这是我的代码
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
}
}
}
?>
既然你在循环中遇到了麻烦,为什么不直接在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。
这将为每个宗教返回一行,使用LEFT JOIN
来查看它是否在用户的宗教列表中列出。
真正应该做的是不要在列中存储逗号分隔的值,而是将宗教列表拆分为一个单独的表。这将允许数据库对数据执行更有效的查询。上面的查询没有使用任何索引进行字符串匹配,如果将来宗教数量增加,这可能会成为一个问题。