я вас так понял.. у вас разные имена в name тоесть каждый input не зависит друг от друга, либо ваш вопрос составлен некорректно
Уже пробовал такое, и пробовал if(!empty... — не работает (( Через POST передает только значения отмеченных чекбоксов. А мне надо, чтобы передавались и неотмеченные
В формах в Zend Framework такой приём используют: Код (Text): <form> <input name='checkbox' type='hidden' value='0'> <input name='checkbox' type='checkbox' value=1> </form> Насколько я понимаю, если чек-бокс отмечен, он перекроет hidden-поле.
Так вот я и не понимаю, как мне в обработчике это сделать. С помощью empty или isset не получается, т.к. в массиве только то кол-во значений сколько отмеченных чекбоксов, а мне надо обработать и те с которых отметка в чекбоксе была снята
Так я же дал реальный пример. Вот, выполните этот скрипт, и поиграйтесь с чекбоксом. Я бы обошёлся и isset-ом, но этот приём подсмотрен в таком серьёзном проекте, как Zend Framework, так что наверное имеет право на существование: http://phpfiddle.org/main/code/2qf6-ab04
Это выводится в цикле Код (Text): echo "<form method=post action='price_change.php'>"; if($product['onoff'] == 1) {echo "<input type='checkbox' checked name='onoff[]' value='1'>";} else {echo "<input type='checkbox' name='onoff[]' value='1'><input type='hidden' name='onoff[]' value='0'>";} <input type='text' name='vendor_price[]' value='".$product['vendor_price']."' size='6'> <input type='text' name='trade_markup[]' value='".$trade_markup."' size='3'> <input type='hidden' value='".$product['id']."' name='product_id[]'> <input name='submit' type='submit' value='Обновить'></form> Это обработчик Код (Text): $n=sizeof($_POST['product_id']) ; for($i=0;$i<$n;$i++) { $id =$_POST['product_id'][$i]; $vprice=$_POST['vendor_price'][$i]; $trade_markup=$_POST['trade_markup'][$i]; $onoff = $_POST['onoff'][$i]; mysql_query("UPDATE product_info SET vendor_price='$vprice', trade_markup='$trade_markup', onoff='$onoff' WHERE id=$id"); } Где может быть ошибка? В этом случае, добавляется в массив лишнее значение 0, поэтому обновление базы происходит некорректно
А подумать, почему добавляются лишние нули? А почитать, как работают пустые []? Вот вам пример с массивом: http://phpfiddle.org/main/code/7fsa-e361
Как же я благодарен таким людям как вы. Не пишите готовые решения, а заставляете обдумано к ним приходить. Спасибо! Добавил переменную индекса в цикл и "вуаля!" — заработало. Хотя, все таки для меня осталось загадкой такое поведение массива. Когда не отмечен, то ничего не посылается, а когда дублируется hidden'ом то появляются оба. Поискал в инете, но нигде не нашел объяснения.(( Но как я понял, что когда мы принудительно пишем индекс, то в массив, в любом случае, загоняется значение, которое, в данном случае, по приоритету выше.
Когда вы делаете [], то система автоматом назначает индексы по возрастанию. Т.е. у хайдена получался индекс 1, к примеру, а у следующего за ним чекбокса - уже 2. Неотмеченные чекбоксы не посылаются на сервер браузерами в соответствии со спецификациями html и пр.
Для того, чтобы обновить данные в бд, если чекбоксы были одновременно и отмечены и сняты отметки с изначально отмеченных, соответственно где был 1 изменить на 0 и наоборот Добавлено спустя 8 минут 31 секунду: А хидден всегда перекрывает значения чекбокса, если name[индекс] одинаковы?
порядок полей имеет значение не, ну я понимаю что не просто ради вопроса, но чем стандартные средства не подходят? Код (PHP): if (strtoupper($_SERVER['REQUEST_METHOD']) == 'POST') { $is_checked = FALSE; if (!empty($_POST['my_var'])) { $is_checked = TRUE; } // остальные проверки echo $is_checked?'отмечено':'не отмечено'; } ?> <form method="post" action=""> <input type="checkbox" name="my_var" value="1" /> <input type="submit" name="go" value="go" /> </form>
Чтоб isset не делать. Мало ли. Вон в зенде они тоже предпочитают, чтоб им хоть что-то по поводу чекбокса пришло
1. не надо кивать на других. Придёт ли от твоего чекбокса 1/0, on/off или вообще пушкин/толстой не имеет значения. Так удобно авторам движка и только им. Но, раз уж мы говорим про других, тот же ZF и приложения на нём проверяют входящие данные, а не доверяются скрытому полю 2. Вытекающее из первого: серверную валидацию никто не отменял. 3. Где ты в моём примере isset() увидал?
Убрал я эти хиддены и сделал все на isset. Он у меня не работал, пока принудительных индексов не было, вот и работал некорректно. Сейчас все работает отлично! Еще раз спасибо всем!!!
Из-за перекрытие значения чекбокса. В выводимом списке могут изначально быть отмеченные чекбоксы и наоборот, а потом пользователь отмечает другие и снимает галочки с отмеченных. Вобщем получается посыл некорректных данных. Вышло, что проще isset'ом.
везде свои решения Код (PHP): $is_checked = (isset($_POST['my_var']) && ($_POST['my_var'] == 1)); а ещё что-то про «думать» говорили…