Показать сообщение отдельно
  #10 (permalink)  
Старый 23.07.2017, 04:05
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Огонек
Неа, поспешил радоваться
А я был уверен на 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.

Последний раз редактировалось laimas, 23.07.2017 в 07:31.
Ответить с цитированием