допустим, у меня есть список флажков, которые выбирает пользователь.
<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...
Пользователь выбрал «Вода» и добавлен в базу данных. Теперь пользователь хочет обновить список:
<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...
Как я могу проверить, что утилита уже была проверена на PHP?
То, что я делал в прошлом, чтобы сохранить сотни линий раздувания, это …
Сначала скомпилируйте весь 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;
Вы могли бы сделать что-то вроде этого:
<input type="checkbox" name="utility[]" value="Water" <?= in_array('Water', $utilities) ? 'checked="checked"' : '' ?>" />
(Переменная $utilities
приведенная выше, представляет собой резерв для чего-то вроде $_REQUEST['utilities']
, в зависимости от того, как структурирован ваш код.)
Как это?
<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 } ?>
Я пробовал каждый из вариантов in_array
и там НИКОГДА не мог заставить это работать (проверяя флажки, значения которых были предварительно выбраны и, таким образом, вставлены в базу данных). Я пробовал сложные запросы со стыками таблиц и не везет с этим. Я, наконец, сдался и создал display:hidden
div
который открыл массив (который по какой-то нечетной причине я должен был IMPLODE, а не взорваться) и перечислил его элементы как текст, разделенный запятыми. Затем я бросил небольшую indexOf()
jQuery indexOf()
чтобы определить, является ли значение каждого флажка частью указанного массива или нет. Взял мне 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
не позволяет им. Поскольку это попадает в сумеречную зону между данными и пользовательским интерфейсом относительно сохранения данных, я думаю, что это законный маршрут. У вас есть одно выражение «эхо» для создания нескольких .each()
в моей ситуации около 40 категорий), а затем простой jQuery .each()
чтобы найти то, что было выбрано до этого, и отобразить соответствующие соответствующие поля.