在编辑表单上填充复选框

时间:2010-11-19 21:06:38

标签: php sql mysql loops

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

以下代码不起作用,因为第二个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`

4 个答案:

答案 0 :(得分: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"' : ''
      ...
}

答案 1 :(得分: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和mine之间的混合改进...只有效率差异是查询处理测试categories.id的有效性而不是php

答案 2 :(得分:0)

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

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

答案 3 :(得分: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'];?>>
<?
}
?>