我有一个在访问时填充的编辑页面。输入值工作正常,但我很难勾选类别复选框。我从两个表中获取信息。一个显示所有类别,另一个显示与项目关联的类别。
以下代码不起作用,因为第二个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`
答案 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'];?>>
<?
}
?>