Установите флажки в форме редактирования - PullRequest
0 голосов
/ 20 ноября 2010

У меня есть страница редактирования, которая заполняется при доступе.Входные значения работают нормально, но я с трудом отмечаю флажки категорий.Я получаю информацию из двух таблиц.Один отображает все категории, а другой - категории, связанные с элементом.

Следующий код не работает, поскольку второй оператор 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 ]

2 голосов
/ 20 ноября 2010

Ваша базовая структура может использовать улучшения.Вместо двух отдельных запросов и двух вложенных циклов вы можете использовать один запрос, который ОБЪЕДИНЯЕТ две таблицы вместе.Частью соединяемых данных будет флаг «флажок», который можно проверить в цикле и вывести соответствующий 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 голос
/ 20 ноября 2010

Вся ваша структура структурирована неправильно, вы не можете предполагать, что два результата будут идеально совмещены, а ваши циклы ошибочны. Попробуйте это:

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'

Улучшено на основе гибрида между марком B и моим ... Единственная разница в эффективности заключается в том, что запрос обрабатывает проверку достоверности category.id вместо php

0 голосов
/ 20 ноября 2010

Как то так?

<?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'];?>>
<?
}
?>
0 голосов
/ 20 ноября 2010

Я не совсем понимаю ваш вопрос, но вы хотите, чтобы флажок был установлен при загрузке страницы?В этом случае вы должны добавить «флажок» к тегу

<input type="checkbox" name="option2" value="Butter" checked>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...