Мда...
Третировать и унижать человека который знает несколько меньше вас в одной конкретной области и который обратился к вам за помощью прекрасно осознавая, что вы в этой области являетесь бОльшими специалистами чем он - это конечно весьма почетно!
Именно так и должны себя вести настоящие профессионалы! (см. термин "ирония").
Тем не менее проблема остается и я тоже столкнулся с ней буквально несколько часов назад - надо признаться, что тот факт, что я не могу норамально обработать простейший checkbox подействовал на меня несколько обескураживающе... Однако Факт остается Фактом
- checkbox передает обработчику только значения тех полей которые выделены (checked), про остальные поля обработчик просто не знает. Соответственно в массив $_POST который советовали изучить выше, попадают только значения тех checkbox'ов которые были отмечены - те которые отмечены не были и те с которых отметки были сняты (если они раньше были отмечены) в массив не попадают вообще и передать именно их значение (0 в данном случае) не возможно.
И вот ситуация:
Имеем некую базу данных из значений которой PHP генерирует HTML форму, в том числе и группу checkbox'ов количество которых зависит от того, сколько соответствующих значений в эту базу ввели те кто имеет к ней доступ (этих личностей много и они совершенно неуправляемы!).
Задача 1., ("тривиальная"):
отметить те checkbox'ы которые удовлетворяют нашему перманентному представлению о глобальном мировом добре и сохранить в базе данных сведения о том какие именно значения были отмечены.
- В этом случае никаких проблем нет - просто ставим галочки напротив тех значений которые нам больше нравятся и жмем кнопку "сохранить". В массив $_POST нашей формы попадают имена (name) и значения (value) тех элементов которые мы отметили и собрав всю свою волю в кулак , и применив все сокровенные знания о том как разобрать массив $_POST на элементы, мы можем заставить базу данных сохранить невосполнимые сведения о том, что именно те поля одной из её таблиц напротив которых мы поставили галочку, имеют значение "on" (или например "1").
Задача 2., ("неочевидная"):
Под влиянием депрессии вызванной бесконечными семейными ссорами и постоянной нехваткой финансовых ресурсов мы решаем вновь обратиться к той же самой HTML форме (благо скрипт PHP который ее генерирует никуда не делся), и удостовериться в том, что те те checkbox'ы которые мы отметили ранее действительно удовлетворяют нашему представлению о глобальном мировом добре.
- В этом вопросе тоже нет ничего смертельного! Мы, будучи людьми подкованными и побитыми жизьнью, на полчаса излечившись от хронического пивного (мифического) алкоголизма, вполне можем вывести из нашей базы данных все значения которые формируют checkbox'ы так необходимой нам в данный момент HTML формы и присвоить им значение "checked" в случае если в ней, в базе данных, соответствующие поля имеют значение "on" (ну или "1" например). К примеру так:
if($row[2]=='' or $row[2]=='0') {$kl="";}
else {$kl="checked";}
print "<input type=\"checkbox\" name=\"dobro[]\" value=\"$row[0]\" $kl>\n";
Где $row[2] - поля базы в которых должны содержаться значения "on" (ну или "1" например), для полей $row[0] из которых строится группа checkbox'ов в форме, а dobro[] - имя (name) каждого эелемента группы (массива) checkbox'ов.
Если звезды будут к нам благосклонны, то теперь мы сможем лицезреть уже знакомую нам по Задаче 1., форму, в которой выделенные нами в прошлый раз checkbox'ы будут уже отмечены и мы сможем вновь убедиться в тонкости нашего выбора и в тайне возгордиться нашим величием!...
Задача 3., ("нетривиальная"):
Депрессия наша оказалась столь велика, а пропасть отделяющая от возможности благоговейно созерцать результаты собственных трудов многоумных настолько глубока, что нам непременно захотелось изменить значения выделенных нами ранее checkbox'ов, да так, чтобы некоторые из тех которые были до того выделены, вдруг волшебным образом очистились, другие из них так и остались выделенными а многие из тех что не были отмечены нами в свое прошлое посещение данной формы приняли вдруг значение "checked", да еще чтобы так оно всё в базе данных и сохранилось на веки вечные!
- А вот тут и начинается самая интерсная история, благополучного (и оптимального разумеется) разрешения которой ни я, ни _Благословенный Зачинатель Этого Топика Много Лет Назад_ так и не смогли найти на бескрайних просторах всемирной информационной паутины (этот факт особенно странен на фоне того, насколько повседневно выглядит задача и каков фактический возраст злемента "checkbox" как такового).
- Если мы отметим пустующие checkbox'ы в нашей форме, то они благополучно сохрняться в базе данных, по скольку их имена и значения будут явно фигурировать в массиве $_POST и соответственно смогут быть переданы обработчику.
Но, если мы снимем отметку с ранее отмеченных, то ни их имя (name) ни их начение (value) в обработчик не попадет, по скольку они попросту не будут занесены в массив $_POST и их неоткуда будет достать... Таким образом мы не сможем обнулить ранее выбранные значения хранящиеся в базе данных, хотя и сможем добавить к ним новые.
Помня о скудоумии своем, прежде чем пытаться решить столь глобальную проблему, затрагивающую глубинные струны в умах и душах современников своих, своими не достойными упоминания силами, я попытался найти в многочисленных форумах и других доступных источниках хоть приблизительный метод решения хоть приблизительно похожей на описанную здесь проблемы....
Однако судьба не была ко мне благосклонна...
Я нашел массу вопросов практически полностью совпадающих с тем, что был задан здесь автором этой темы и тем, что интересует меня в данный момент, но в ответах фигурировали лишь оскрбления и унизительные констатации и практически ни слова по делу...
В результате мне пришлось наступить на горло здравому смыслу и решить задачу самостоятельно - пусть это криво и не правильно, но оно работает и выдает в итоге нужный результат. Все равно никто из тех кто знает как правильно, не хочет делиться своими Сокровенными Познаниями, так может хоть мой вариант кому то поможет...
- А решение у меня получилось максимально простое:
Вместо того чтобы вычислять какое значение табицы было отмечено а какое обнулено (ведь checkbox передает только два значения - либо "0" либо "1"), мы дделаем два запроса:
1. Очистить всю таблицу. (Не важно отмечены поля - нет, стереть всё!)
2. Вставить в таблицу отмеченные поля. (Они есть в $_POST). И ничего ни с чем сравнивать не нужно и огород из бесконечных циклов городить...