За последние 24 часа нас посетили 18449 программистов и 1606 роботов. Сейчас ищут 953 программиста ...

Передача значений checkbox

Тема в разделе "PHP для новичков", создана пользователем LAlexS, 21 июл 2014.

  1. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Как передать value=0 чекбокса, если он unchecked, через массив методом post
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    я вас так понял.. у вас разные имена в name тоесть каждый input не зависит друг от друга, либо ваш вопрос составлен некорректно
     
  3. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Неужели никто не знает?
     
  4. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    if (!isset($_POST['some_checkbox'])) $_POST['some_checkbox'] = 0;
     
  5. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Уже пробовал такое, и пробовал if(!empty... — не работает ((
    Через POST передает только значения отмеченных чекбоксов. А мне надо, чтобы передавались и неотмеченные
     
  6. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    именно.
    Отсюда логика — если поля нет => чекбокс не отмечен
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    В формах в Zend Framework такой приём используют:
    Код (Text):
    1.  
    2. <form>
    3.    <input name='checkbox' type='hidden' value='0'>
    4.    <input name='checkbox' type='checkbox' value=1>
    5. </form>
    Насколько я понимаю, если чек-бокс отмечен, он перекроет hidden-поле.
     
  8. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Так вот я и не понимаю, как мне в обработчике это сделать. С помощью empty или isset не получается, т.к. в массиве только то кол-во значений сколько отмеченных чекбоксов, а мне надо обработать и те с которых отметка в чекбоксе была снята
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Так я же дал реальный пример. Вот, выполните этот скрипт, и поиграйтесь с чекбоксом. Я бы обошёлся и isset-ом, но этот приём подсмотрен в таком серьёзном проекте, как Zend Framework, так что наверное имеет право на существование: http://phpfiddle.org/main/code/2qf6-ab04
     
  10. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Это выводится в цикле
    Код (Text):
    1. echo "<form method=post action='price_change.php'>";
    2. if($product['onoff'] == 1)
    3.     {echo "<input type='checkbox' checked name='onoff[]' value='1'>";}
    4. else
    5.     {echo "<input type='checkbox' name='onoff[]' value='1'><input type='hidden' name='onoff[]' value='0'>";}
    6. <input type='text' name='vendor_price[]' value='".$product['vendor_price']."' size='6'>
    7. <input type='text' name='trade_markup[]' value='".$trade_markup."' size='3'>
    8. <input type='hidden' value='".$product['id']."' name='product_id[]'>
    9. <input name='submit' type='submit' value='Обновить'></form>
    Это обработчик
    Код (Text):
    1. $n=sizeof($_POST['product_id']) ;
    2.     for($i=0;$i<$n;$i++)
    3.         {
    4.         $id =$_POST['product_id'][$i];
    5.         $vprice=$_POST['vendor_price'][$i];
    6.         $trade_markup=$_POST['trade_markup'][$i];
    7.         $onoff = $_POST['onoff'][$i];
    8.         mysql_query("UPDATE product_info SET vendor_price='$vprice', trade_markup='$trade_markup', onoff='$onoff' WHERE id=$id");
    9.         }
    Где может быть ошибка?
    В этом случае, добавляется в массив лишнее значение 0, поэтому обновление базы происходит некорректно
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А подумать, почему добавляются лишние нули? А почитать, как работают пустые []? Вот вам пример с массивом:
    http://phpfiddle.org/main/code/7fsa-e361
     
  12. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    В примере же все нормально работает. Не могу я понять, что не так и почему появляется лишний 0.
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Сравните мой код и ваш. Я же не использовал в html пустые квадратные скобки! Я дублировал индекс
     
  14. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Как же я благодарен таким людям как вы. Не пишите готовые решения, а заставляете обдумано к ним приходить. Спасибо! Добавил переменную индекса в цикл и "вуаля!" — заработало.
    Хотя, все таки для меня осталось загадкой такое поведение массива. Когда не отмечен, то ничего не посылается, а когда дублируется hidden'ом то появляются оба. Поискал в инете, но нигде не нашел объяснения.(( Но как я понял, что когда мы принудительно пишем индекс, то в массив, в любом случае, загоняется значение, которое, в данном случае, по приоритету выше.
     
  15. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Осталось выяснить для чего автору обязательно передавать 0/1 из формы?
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Когда вы делаете [], то система автоматом назначает индексы по возрастанию. Т.е. у хайдена получался индекс 1, к примеру, а у следующего за ним чекбокса - уже 2. Неотмеченные чекбоксы не посылаются на сервер браузерами в соответствии со спецификациями html и пр.
     
  17. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Для того, чтобы обновить данные в бд, если чекбоксы были одновременно и отмечены и сняты отметки с изначально отмеченных, соответственно где был 1 изменить на 0 и наоборот

    Добавлено спустя 8 минут 31 секунду:
    А хидден всегда перекрывает значения чекбокса, если name[индекс] одинаковы?
     
  18. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    порядок полей имеет значение

    не, ну я понимаю что не просто ради вопроса, но чем стандартные средства не подходят?
    Код (PHP):
    1. if (strtoupper($_SERVER['REQUEST_METHOD']) == 'POST') {
    2.     $is_checked = FALSE;
    3.  
    4.     if (!empty($_POST['my_var'])) {
    5.          $is_checked = TRUE;
    6.     }
    7.  
    8.     // остальные проверки
    9.  
    10.     echo $is_checked?'отмечено':'не отмечено';
    11. }
    12. ?>
    13. <form method="post" action="">
    14.     <input type="checkbox" name="my_var" value="1" />
    15.     
    16.     <input type="submit" name="go" value="go" />
    17. </form>
     
  19. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Чтоб isset не делать. Мало ли. Вон в зенде они тоже предпочитают, чтоб им хоть что-то по поводу чекбокса пришло
     
  20. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Не срабатывает у меня isset... почему-то
     
  21. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    1. не надо кивать на других. Придёт ли от твоего чекбокса 1/0, on/off или вообще пушкин/толстой не имеет значения. Так удобно авторам движка и только им. Но, раз уж мы говорим про других, тот же ZF и приложения на нём проверяют входящие данные, а не доверяются скрытому полю

    2. Вытекающее из первого: серверную валидацию никто не отменял.

    3. Где ты в моём примере isset() увидал?
     
  22. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Убрал я эти хиддены и сделал все на isset. Он у меня не работал, пока принудительных индексов не было, вот и работал некорректно. Сейчас все работает отлично!
    Еще раз спасибо всем!!!
     
  23. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    а хиддены убрал зачем? Они мешали?
     
  24. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Из-за перекрытие значения чекбокса. В выводимом списке могут изначально быть отмеченные чекбоксы и наоборот, а потом пользователь отмечает другие и снимает галочки с отмеченных. Вобщем получается посыл некорректных данных. Вышло, что проще isset'ом.
     
  25. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    везде свои решения
    Код (PHP):
    1. $is_checked = (isset($_POST['my_var']) && ($_POST['my_var'] == 1)); 
    а ещё что-то про «думать» говорили…