Вопрос по php, checkbox, mysql – Обновление уже отмеченных флажков в PHP

1

скажем, у меня есть список флажков, которые выбирает пользователь.

<code><input type="checkbox" name="utility[]" id="utility[]" value="Water" />Water<br />
<input type="checkbox" name="utility[]" id="utility[]" value="Cable" />Cable<br />
<input type="checkbox" name="utility[]" id="utility[]" value="Electricity" />Electricity<br />
etc...
</code>

Пользователь выбрал «Вода» и он был добавлен в базу данных. Теперь пользователь хочет обновить список:

<code><input type="checkbox" name="utility[]" id="utility[]" value="Water" checked="checked"/>Water<br />
<input type="checkbox" name="utility[]" id="utility[]" value="Cable" />Cable<br />
<input type="checkbox" name="utility[]" id="utility[]" value="Electricity" />Electricity<br />
etc...
</code>

Как я могу проверить, что утилита уже проверена в PHP?

Ваш Ответ

4   ответа
0

<input type="checkbox" name="utility[]" id="utility[]" value="Water"
   <?php
   if(isAlreadyChecked("Water"))
     echo "checked=\"checked\""
   ?>
/>Water<br />

<?php
   function isAlreadyChecked(value)
   {
     //Check if it is already checked and return a boolean
   }
?>
Как я сказал ниже, есть ли более эффективный способ сделать это, о котором вы можете подумать? Я пытаюсь думать прямо сейчас. OneSneakyMofo
0

<input type="checkbox" name="utility[]" value="Water" 
     <?= in_array('Water', $utilities) ? 'checked="checked"' : '' ?>" 
/>

(The$utilities Переменная выше является заменой для чего-то вроде$_REQUEST['utilities']в зависимости от того, как структурирован ваш код.)

Есть ли способ сделать это иначе, чем иметь оператор if в каждой форме флажка? У меня их около 50, и это кажется неэффективным. OneSneakyMofo
Для эффективности вы можете поместить все значения флажков в массив логических значений (при условии, что их не тысячи). Тогда вы можете сделать что-то вроде этого:<?= $values['Water'] ? 'checked="checked" : '' ?>
Но да, вам действительно понадобитсяif или троичный оператор для каждогоinput, Это не означает, что это будет неэффективно, потому что это очень простые операторы. Проблема производительности будет просто в том, как вы извлекаете данные из вашей БД.
2

что я делал в прошлом, чтобы сохранить сотни линий раздувания, это ...

Сначала скомпилируйте все html в переменную, без какого-либо "флажка". экземпляров.

$boxes = '';
$boxes .= '<input type="checkbox" name="utility[]" id="utility[]" value="Water" />Water<br />';
$boxes .= '<input type="checkbox" name="utility[]" id="utility[]" value="Cable" />Cable<br />';
$boxes .= '<input type="checkbox" name="utility[]" id="utility[]" value="Electricity" />Electricity<br />';

Теперь я проверяю ваш массив полей для проверки. Я также предоставил образец массива здесь.

$already_checked = array('Water', 'Electricity');

foreach( $already_checked as $ac ) {
    $find = 'value="' . $ac . '"';
    $replace = $find . ' checked="checked"';
    $boxes = str_replace($find, $replace, $boxes);
}

echo $boxes;
Благодарю. Я думаю, что это должно сработать. OneSneakyMofo
Но тогда вы должны вручную перечислить проверенный массив в каждом случае. Лучшее решение состоит в том, чтобы генерировать его динамически (а также сами флажки), чтобы любые будущие изменения или дополнения не требовали переписывания массивов или значений элементов формы вручную.
Это будет работать, но это не интуитивно понятно и не особенно эффективно. Линейный поиск по строке вряд ли является лучшим или более производительным решением, чем универсальный метод или хорошо структурированныйif заявление.
Стюарт, ты упускаешь суть. Гораздо проще поддерживать большие списки флажков с помощью вышеуказанного метода (то есть в виде простого HTML), чем редактировать отдельные операторы if для каждого ввода. Я согласен, что технически это более грубый метод, но он делает код чище.
0

in_array условно и НИКОГДА не может заставить это работать (снимая флажки, значения которых были предварительно выбраны и, таким образом, вставлены в базу данных). Я пробовал сложные запросы с объединениями таблиц, и мне тоже не повезло. Я наконец сдался и сгенерировалdisplay:hidden div это открыло массив (который по какой-то странной причине мне пришлось НЕ взорвать, а РАЗЪЕМИТЬ) и перечислил его элементы в виде текста через запятую. Затем я бросил в немного JQueryindexOf() Волшебство, чтобы определить, было ли значение каждого флажка частью указанного массива или нет. Мне понадобилось 10 минут, чтобы сделать это с помощью jQuery, очень просто.

Вот пример кода, который работает и работает нормально:

<div class="categories">
  <span class="keywords"><?php $categories = array(); $categories = implode(', ', $keywords); echo $categories ?></span>
  <em>Please verify category selections with each update.</em><br/>
  <?php
    include 'db.php'; 
      $sql = mysqli_query($con,"SELECT * FROM categoriesTable ORDER BY Category_Name ASC");
        while ($row = mysqli_fetch_assoc($sql))
        {
        $key = urldecode($row['Category_Name']);
        $id = urlencode($row['catID']);
        echo "<input type='checkbox' name='Category_Key[]' value='$id' id='cat_$id' $chk> $key<br/>";
        }
  ?>
</div>

CSS устанавливает этот div в невидимое:

.keywords { display:none; visibility:hidden; }

и часть jQuery:

$(document).ready(function() {  
    $('.categories input').each(function(index,data) {
        var str=$('.keywords').text();
        var catid = $(this).val();
        var chk = str.indexOf(catid);
        if (chk >= 0) {
            $(this).prop('checked', true);
        }
    });
});

Я надеюсь, что это помогает кому-то, кто застрял, задаваясь вопросом, почемуin_array условно терпит неудачу их. Так как это происходит в сумеречной зоне между данными и пользовательским интерфейсом в отношении сохранения данных, я думаю, что это законный путь. У вас есть один "эхо" оператор для создания нескольких флажков (в моей ситуации около 40 категорий), а затем простой jQuery.each() чтобы найти то, что было выбрано ранее, и отобразить соответствующие поля, как отмечено.

Похожие вопросы