Сообщение от Огонек
|
Неа, поспешил радоваться
|
А я был уверен на 99%, что return в тему будет, а все потому, что рассуждения ваши не с нужного начинаются. Обновление состояния поля в таблице будут определять все: сколько и как, что в итоге определит какими элементами будет удобнее представить флажки в форме. Я тоже не знаю всей конкретики задачи, я могу только предполагать и исходить из общих условий. Поэтому будет написано по-примерно.
Допустим таблица (tbl) содержит всего 5 записей (первое поле id, второе состояние set) со следующими состояниями:
12 1
24 0
17 0
19 1
85 1
В форму выводятся все пять записей, то есть флажки и их состояния, и кроме флажков других полей форма не имеет. Форма передается методом POST и в итоге будет такой:
<form method="post">
<input name="check[]" value="12" checked type="checkbox">
<input name="check[]" value="24" type="checkbox">
<input name="check[]" value="17" type="checkbox">
<input name="check[]" value="19" checked type="checkbox">
<input name="check[]" value="85" checked type="checkbox">
<button>Send</button>
</form>
При передаче формы на сервер будут переданы только те флажки, которые установлены, поэтому
"если я отмечаю любой один или несколько флажков, то сервер получает 1, если ни одного - то 0" быть никак не может. Если не меняя состояние флажков отправить форму, то на сервере будет $_POST массив:
Код:
|
Array
(
[check] => Array
(
[0] => 12
[1] => 19
[2] => 85
)
) |
Если сбросить все и отправить форму, то массив $_POST будет пуст. О каких 1 и 0 идет речь? Если проверка массива показала, что он пуст, а мы знаем, что сброшенные флажки не передаются, значит мы знаем, что пользователь сбросил все, а значит всем записям состояние нужно изменить на 0:
$sql = 'UPDATE tbl SET `set`=0';
Если есть выбор, то так:
if($check = array_diff(array_map('intval', $_POST['check']), [0])) {
print_r($check); //массив выбранных флажков
}
Теперь можно обновлять, но сначала нужно сбросить все, то есть установить 0 в поле set у всех записей, а затем в цикле установить 1 для выбранных:
foreach($check as $id) {
$sql = 'UPDATE tbl SET `set`=1 WHERE id='.$id;
//запрос
}
Примечание: Если же иметь ввиду, что обновляется только одно поле, других полей обновляемых нет в вашей форме, то все можно решить одним запросом, без цикла:
$sql = 'UPDATE tbl SET `set`=1 WHERE id IN('.implode(',', $check).')';
Но если из таблицы выбраны не все записи и форма содержит пусть три флажка для записей с id 24, 19, 85, и какие-то будут сброшены установлены, то обновить состояние этих записей, предварительно сбросив все состояние в таблице, уже нельзя. А для того, чтобы оперировать только теми записями, которые описывает форма, лишь два пути:
1) сервер хранит массив id=>"состояние" переданных клиенту флажков, а при приеме формы пересечениями массивов хранимого на сервере и полученного от формы формирует результирующий массив для обновления.
2) отказаться от полей типа checkbox и использовать поля типа radio, где группы из двух кнопок со значениями 0 и 1, и имеющий из них атрибут checked определяют состояние записи в базе.
Если форму отправлять асинхронным методом, то набор значений
"установить в 0/1", подобное с полями radio, можно сформировать даже если форма использует поля типа checkbox.