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

Тема в разделе "PHP", создана пользователем dandandan, 31 янв 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    991
    Симпатии:
    267
    Есть нескольео checkbox'oв. Их имена формируются согласно правилу:
    name="umy_".$ids
    На странице может быть разное количество чекбоксов. Например их 5 штук. Заранее не известно какие значения может принимать переменная ids
    Например получилось 5 имен:
    umy_1
    umy_2
    umy_322
    umy_43
    umy_65

    Пользователь может отметить некоторые чекбоксы. После отправки формы с чекбоксами необходимо узнать какие из чекбоксов были нажаты. Как оптимальнее это проверить?

    Сейчас делаю так. формирую скрытое поле. В это поле вписывают значения переменной ids через знак подчеркивания
    1_2_322_43_65 . После передачи формы скрипту распарсиваю эту строку и проверяю существует ли эта переменная
    Думаю можно проще поступить. Жду ваших вариантов.

    Такая же проблема возникает при передачи большого количество полей для ввода данных, имена которых генерируются по определенному закону.
     
  2. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    591
    Формировать чекбоксы так
    Код:
    name="umy[" . $ids . "]"
    В итоге у тебя будет массив $_GET['umy'] с индексами отмеченных чекбоксов.
     
  3. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    1) Способ первый:
    PHP:
    for($i=0$i<100000$i++)
      if (isset(
    $GET['umy_' $i]))
    несмотря на очевидный тупизм работает просто мегабыстро, так что лично я бы дальше ничего и не искал. Но ты, видимо, эстет, поэтому продолжим

    2)
    PHP:
    foreach($_GET as $k => $v
      if (
    preg_match('/^umy_(\d+)$/'$k) && $v)
    несмотря на то, что используется preg_match (кстати вместо него можно strstr) способ тоже мегабыстрый, поскольку цикл проходит только по принятым переменным.


    3)
    Код:
    <input name="umi[]" value=21 type=checkbox>
    <input name="umi[]" value=48 type=checkbox>
    <input name="umi[]" value=11 type=checkbox>
    
    Отмечаешь птичками нужные чекбоксы, в PHP получаешь массив с только
    выбранными значениями. Например $_GET[umi] = array(21,11).
     
  4. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    991
    Симпатии:
    267
    Последний способ понравился. Попробую. :)
     
  5. BDS

    BDS Читатель

    Заблокирован
    Регистр.:
    7 янв 2009
    Сообщения:
    42
    Симпатии:
    2
    эт все круто.. а если были отмечены и юзер их снял.. ;)
     
  6. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    591
    А **х это знать кому-то нужно? :D
     
  7. LinuxFan

    LinuxFan Создатель

    Регистр.:
    13 янв 2009
    Сообщения:
    11
    Симпатии:
    2
    действительно :D

    Ну в качестве предположения - если знаем какие были нажаты чекбосы и знаем какие были вообще в форме, то разница между нажатыми и общими даст как раз именно ненажатые :) :yahoo:
     
  8. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    591
    Не самый оптимальный способ - часто нужно использовать поле value для реальных значений, а не для передачи id.
     
  9. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Тогда так:

    Код:
    <input type=hidden name="chk[48]" value=0>
    <input type=checkbox name="chk[48]" value=1>
    
    <input type=hidden name="chk[51]" value=0>
    <input type=checkbox name="chk[51]" value=1>
    
    <input type=hidden name="chk[70]" value=0>
    <input type=checkbox name="chk[70]" value=1>
    
    После сабмита делаешь
    PHP:
    foreach($_REQUEST['chk'] as $id => $val)
       if (
    $val)  // чекбокс $id был нажат
       
    else  // чекбокс $id присутствовал в форме, 
              // но его отжали или не нажимали 
    Только важно, чтоб hidden шли в коде выше чем соответствующие им checkbox. Можно вообще в самый верх формы всех вынести.
     
  10. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    591
    О-о-о какой изврат :eek:
    HTML:
    <input type=checkbox name="chk[X]" value="Y" />
    Нахрена хидены то? :D
     
Статус темы:
Закрыта.