Как узнать какие из чекбоксов были нажаты

Статус
В этой теме нельзя размещать новые ответы.
Хиддены нужны, чтоб передались нули.

Просто в реальном проекте строка с чекбоксом обычно имеет такой вид:
PHP:
<input type=checkbox name=a1 value=1 <?=$a1?'checked':''?>>

т.е. при открытиии формы юзером те чекбоксы, которые "установлены" - ему уже сразу и показываются установленными. Если он какие-то "поснимает", то вместо того чтобы передать в сабмите, что такой-то чекбокс был снят, бровзер не передает ничего. И в результате в базе они так и останутся установленными.

Т.е. выход - или самому заранее следить, какие ты там чекбоксы юзеру отправлял и сколько из них обратно получил, или проходиться по всему списку возможных чекбоксов и смотреть isset($GET...), или не париться и вставить еще по хидден полю - тогда для каждого чекбокса из формочки при сабмите придет или его value, если он был установлен, или 0, если он был снят.

Это я не сам придумал такой способ. Но имхо очень удобно.
 
Не забывай добавить, что это работает только тогда, когда в записи с квадратными скобками ключ массива указан.
то есть при
<input type="hidden" name="check[]" value="0" />
<input type="checkbox" name="check[]" value="1" />

эта конструкция будет работать немножко неправильно.
 
... или не париться и вставить еще по хидден полю - тогда для каждого чекбокса из формочки при сабмите придет или его value, если он был установлен, или 0, если он был снят.

Это я не сам придумал такой способ. Но имхо очень удобно.

или не париться с хидденами: лочим базы, снимаем все чекбокс-флаги для объекта к которому они относятся... заново устанавливаем отмеченные... снимаем блокировку баз... быстро и элегантно...
 
или не париться с хидденами: лочим базы, снимаем все чекбокс-флаги для объекта к которому они относятся... заново устанавливаем отмеченные... снимаем блокировку баз... быстро и элегантно...

Это если знаешь, сколько их всего для данного объекта. А с хидденами более универсальный способ - скрипт получает команды "снять такой-то флаг" или "поставить такой-то флаг". Про все остальные флаги ничего не знает, ни на какой конкретный объект не завязан, ни от чего не зависит, ни с чем не работает. Разделяй и властуй, как советуют адепты ООП :) Хоть тут и нет никакого ооп.

А лочим базы - чтоб никто не прочитал чекбоксы в тот момент когда они все сброшены? Или зачем?
 
Это если знаешь, сколько их всего для данного объекта. А с хидденами более универсальный способ - скрипт получает команды "снять такой-то флаг" или "поставить такой-то флаг".

а зачем это знать?
имеем:
таблица объетов "object"
справочник флагов "flag"
таблица связей между объектами и флагами "object_has_flag"

1) DELETE FROM object_has_flag WHERE object_idobject="айдишник объекта";
вуаля!.. я ничего незнал... а объект освободился от всех своих флагов
2) быстренько установили необходимые флаги..

и сделал все это мускул.. именно тот кто эти штуки умеет делать быстрее и надежнее чем php интерпретатор
 
Хиддены нужны, чтоб передались нули.

Просто в реальном проекте строка с чекбоксом обычно имеет такой вид:
PHP:
<input type=checkbox name=a1 value=1 <?=$a1?'checked':''?>>

т.е. при открытиии формы юзером те чекбоксы, которые "установлены" - ему уже сразу и показываются установленными. Если он какие-то "поснимает", то вместо того чтобы передать в сабмите, что такой-то чекбокс был снят, бровзер не передает ничего. И в результате в базе они так и останутся установленными.

поменять $a1 на
PHP:
!empty($_POST['a1'])
и все проблемы исчезнут, чекбоксы снял юзер, нажал отправить - с чекбоксов снимутся галочки
 
поменять $a1 на
PHP:
!empty($_POST['a1'])
и все проблемы исчезнут, чекбоксы снял юзер, нажал отправить - с чекбоксов снимутся галочки

да вроде и так как есть должно работать... тут скорее архитектурка логики неудачная..
варианта два:
1) айди_связи_объекта_с_флагом хранится в имени чекбокса или айди_флага хранится ... видимо есть 3 таблицы "объкеты" "флаги" "их связи"...
тогда в форме надо формировать такую структуру:
<input type='checkbox' name='a[]' value='<?=$idflag;>' <?=(in_array($idflag, $object_has_flag) ? 'checked' : '');?>>

2) флаги хранятся в таблице с объектами... подойдет то что предложено, но по любому не понятно зачем нужны хидден поля... все делается одним запросом к базе ..

UPDATE таблица_объектов SET a1=($_POST['a1'] ? 1: 0 ), a2=($_POST['a2'] ? 1: 0 ), ... , an=($_POST['an'] ? 1: 0 ) WHERE айди_объекта=$_POST['айди_объекта'];
 
типа понять что он таки был в форме но не нажат:)))
но изврат, да)

Хидденом можно передать просто максимальное количество элементов, а их имена формировать в цикле:
for($i=0;$i<=$max_val;$i++)
{
echo '<input type="checkbox" name="my_box_". $i ."" ... >';
}
echo '<input type=hidden name=max_val value='. $max_val .'>';
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху