2010-11-19 40 views
0

我有一个编辑页面,在访问时会填充该页面。输入值工作正常,但我很难勾选类别复选框。我从两张表中获得信息。一个显示所有类别,另一个显示与该项目关联的类别。填写编辑表格上的复选框

以下代码不起作用,因为第二个while语句在第一轮中完成其循环。有没有适当的方法来做到这一点?

<?php $check_cats = mysql_query("SELECT * FROM item_categories WHERE itemid = '$itemid'") or die(mysql_error()); ?> 
<?php $result = mysql_query("SELECT * FROM categories ORDER BY cname") or die(mysql_error()); ?> 

<?php while($row = mysql_fetch_array($result)) { ?> 
    <input type="checkbox" id="<?php echo $row['cname']; ?>" name="cat[]" value="<?php echo $row['id']; ?>" 
<?php while($check_cat_rows = mysql_fetch_array($check_cats)) { 
    if ($check_cat_rows['catid'] == $row['id']) { 
     echo 'checked="yes"'; 
    } 
    } 
} ?> 

我的两个表:

TABLE `item_categories` 
    `id` 
    `itemid` 
    `catid` 

TABLE `categories` 
    `id` 
    `cname` 

回答

1

你整个事情是不正确的结构,你不能假设这两个结果将完全排队,你的循环是错误的。试试这个:

SELECT *, 
(case when id IN 
(SELECT catid FROM item_categories WHERE itemid = '$itemid') 
then 1 else 0 end) checked 
FROM categories ORDER BY cname 

现在你只要运行一个查询,并有一个可爱的小$row['checked']使用!

SELECT *, 
(case when categories.id IS NOT NULL 
then 1 else 0 end) checked 
FROM item_categories 
LEFT JOIN categories 
ON (item_categories.catid = categories.id) 
WHERE itemid = '$itemid' 

改进基于Marc的B和矿山之间的混合......只有效率的区别在于查询处理测试categories.id而不是PHP

+0

我得到这个错误:操作数应包含1列(S) – Norbert 2010-11-19 21:25:57

+1

固定...选择所需要的内联指定的列... 可能有这样做的更有效的方法,但这是最容易阅读的。马克B的查询将更加谨慎,如果你正在做一个非常重的网站(每秒几百个查询,十万行) – 2010-11-19 21:29:51

+0

感谢一堆!这是SQL在我头上的限制:) – Norbert 2010-11-19 21:36:40

0

我真的不明白你的问题,但你想要的复选框可以在页面加载时检查?在这种情况下,您必须将“已检查”添加到标签

<input type="checkbox" name="option2" value="Butter" checked> 
2

您的基本结构可以使用改进。而不是两个单独的查询和两个嵌套循环,您可以使用单个查询将两个表连接在一起。部分连接的数据将是“检查”标志,您可以在循环内检查并输出适当的html。

SELECT ..., categories.id AS checked 
FROM item_categories 
LEFT JOIN categories 
ON (item_categories.catid = categories.id) 

,然后同时循环:

while($row = mysql_fetch_assoc()) { 
     $flag = ($row['checked') ? ' checked="yes"' : '' 
     ... 
} 
0

像这样的有效性?

<?php 
    $query = <<<query 
     SELECT 
      c.id, 
      c.cname, 
      ifnull(ic.catid, '', 'checked="yes"') as checked 
     FROM 
      categories c 
      LEFT JOIN item_categories ic 
       ON ic.itemid = '$itemid' 
       AND ic.catid = c.id 
     ORDER BY 
      c.cname 
query; 

$result = mysql_query($query) or die(mysql_error()); 

while ($row = mysql_fetch_array($result)) { ?> 
    <input type="checkbox" id="<?=$row['cname'];?>" name="cat[]" value="<?=$row['id'];?>" <?=$row['checked'];?>> 
<? 
} 
?>