【问题标题】:Populate Checkboxes on Edit Form填充编辑表单上的复选框
【发布时间】:2010-11-19 21:06:37
【问题描述】:

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

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

【问题讨论】:

    标签: php sql mysql loops


    【解决方案1】:

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

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

    然后while循环:

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

    【讨论】:

      【解决方案2】:

      您的整个事情的结构不正确,您不能假设两个结果会完美对齐,并且您的循环是错误的。试试这个:

      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的有效性

      【讨论】:

      • 已修复...内联选择需要特定列...可能有更有效的方法来执行此操作,但这是最容易阅读的方法。如果您正在制作一个非常重量级的网站(每秒数百次查询,一万行),Marc B 的查询会更加谨慎
      • 非常感谢!这是 SQL 越过我的极限:)
      • 实际上,可以在 Marc B 和我的使用案例之间达成妥协,甚至比我们俩都更精简...让我看看我能拼凑出什么...
      • 我尝试了他的建议,但我无法弄清楚 $itemid 的来源。
      • 就在最后,添加WHERE itemid = '$itemid' 不管怎样,现在有很多方法可用...
      【解决方案3】:

      我不太明白您的问题,但您希望在页面加载时选中复选框?在这种情况下,您必须在标签中添加“已选中”

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

      【讨论】:

        【解决方案4】:

        这样的?

        <?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'];?>>
        <?
        }
        ?>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-27
          • 2019-10-28
          • 1970-01-01
          • 1970-01-01
          • 2014-10-08
          • 1970-01-01
          • 1970-01-01
          • 2014-06-19
          相关资源
          最近更新 更多