2010-11-19 43 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'];?>> 
<? 
} 
?>