За последние 24 часа нас посетили 16534 программиста и 1578 роботов. Сейчас ищут 814 программистов ...

POST и множество checkbox'ов

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

  1. Dmtq

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

    С нами с:
    2 мар 2014
    Сообщения:
    28
    Симпатии:
    0
    Есть календарь, генерируемый так:
    Код (Text):
    1. <form name="datearray" action="datearray_save_action.php">
    2. <?php
    3.  $from = $_POST['from'];
    4. echo 'С '.$from.'<br>';
    5.  $to = $_POST['to'];
    6. echo 'По '.$to.'<br>';
    7. setlocale(LC_ALL, 'ru_RU.UTF-8');
    8. date_default_timezone_set('Asia/Yekaterinburg');
    9. $dat1=$from; $dat2=$to;
    10. $per=strtotime($dat1); $per2=strtotime($dat2);
    11. $it=$per/(3600*24); $it2=$per2/(3600*24);
    12. $days=$it2-$it;
    13. $daysamount = $days+1;
    14. echo 'Интервал '.$daysamount.' дней<br>';
    15. $cost=0;
    16. echo '<table><tr><td align="center">';
    17. for ($i=0; $i<=$days; $i++) {
    18. $chdate = date( 'd.m.y', strtotime($dat1)+3600*24*$i);
    19. echo strftime('%a', strtotime($dat1)+3600*24*$i).'<br>';
    20. echo date( 'd', strtotime($dat1)+3600*24*$i).'<br>';
    21. echo '<input type="checkbox" name="chdate" id="ch" value = "'.$chdate.'"onclick="count()"/>';
    22. // запросы в базу
    23. echo '</td><td align="center">';
    24. }
    25. echo '</td></tr></table>';
    26. ?>
    27. Выбрано: <h id="count">0</h>
    28. <input type="submit" value="Сохранить">
    пытаюсь передать его в datearray_save_action.php, точнее хотя бы принять так:
    Код (Text):
    1. <?php
    2. if(isset($_POST['chdate'])) {
    3.   print_r($_POST);
    4. }
    5. ?>
    Ничего не выходит.
    Пожалуйста, подскажите как записать 'checked' даты из диапазона в базу mysql
    Шпасибо
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Откуда он должен браться? есть еще код?
    Ничего не выводится потому что переменной нету).
    И кроме кнопки в форме у вас ничего не передается.
    Используйте hidden поля чтобы передать какие то данные.
    к примеру
    Код (Text):
    1. <input type=hidden name=date value=<?php echo $chdate ;?>
    Код (Text):
    1. <?php
    2. if(isset($_POST['chdate'])) {
    3.   print_r($_POST['date']);
    4. }
    5. ?>
    а по поводу записи в БД. там думаю все поняться.

    тоже проверяете существование кнопки, потом вызываете функцию записи данных в бд.
     
  3. Dmtq

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

    С нами с:
    2 мар 2014
    Сообщения:
    28
    Симпатии:
    0
    суть в том что чекбоксов много. их количество задается интервалом дат переменными from, to.
    допустим их десять, генерированных циклом. они одинаковы кроме value.
    хочу кнопкой передать значения всех "чекнутых" чекбоксов на другую страницу post'ом.
    как?
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    У "чекнутый" бокс создаст переменную, вот и все дела. Ловить эти переменные в том скрипте куда передали

    Покажите код
     
  5. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    просто давай правильные имена инпутам. типа

    Код (Text):
    1. <input name="calendar[20140322]" type="checkbox>
    2. <input name="calendar[20140323]" type="checkbox>
    тогда в $caledar = $_POST['calendar'] у тебя будет массив из отмеченных записей. что-то вроде
    Код (Text):
    1. array(
    2.   '20140322' => 'on',
    3.   '20140323' => 'on',
    4. )
    а неотмеченных там не будет упоминаться вообще.

    далее, крутишь массив по интересующему диапазону и каждое значение календарного ключа сверяешь с полученным массивом
    Код (Text):
    1. if (array_key_exists($key, $calendar)) { /* что-то делаем */ }
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Итоговый вид
    [​IMG]

    Разметка
    Код (Text):
    1.  
    2. ...
    3.   <form method="post">
    4.     <label><input name="calendar[20140301]" type="checkbox"> 01.03.2014</label><br>
    5.     <label><input name="calendar[20140302]" type="checkbox"> 02.03.2014</label><br>
    6.     <label><input name="calendar[20140303]" type="checkbox"> 03.03.2014</label><br>
    7. ...
    Скрипт
    Код (PHP):
    1. <?php
    2.  
    3. define('ONE_DAY', (24*60*60));
    4.  
    5. $date1 = strtotime('2014-03-01');
    6. $date2 = strtotime('2014-04-01') - ONE_DAY;
    7.  
    8. ?>
    9. <!DOCTYPE html>
    10. <html>
    11. <head>
    12. </head>
    13. <body>
    14.   <p><strong>
    15. <?php
    16.  
    17. // Get RESULT if any
    18. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    19.  
    20.     $checked = array();
    21.     for ($d = $date1; $d <= $date2; $d += ONE_DAY) {
    22.         // Is checkbox checked?
    23.         if (isset($_POST['calendar'][date('Ymd', $d)])) {
    24.             $checked[] = $d;
    25.         }
    26.     }
    27.  
    28.     // Show result
    29.     echo implode(', ', array_map(function($d) {return date('d.m.Y', $d);}, $checked));
    30. }
    31.  
    32. // Show FORM
    33. ?>
    34.   </strong><p>
    35.  
    36.   <form method="post">
    37. <?php for ($d = $date1; $d <= $date2; $d += ONE_DAY): ?>
    38.     <label><input name="calendar[<?= date('Ymd', $d) ?>]" type="checkbox"> <?= date('d.m.Y', $d) ?></label><br>
    39. <?php endfor; ?>
    40.     <p><input type="submit" value=" Send "></p>
    41.   </form>
    42.  
    43. </body>
    44. </html>
     
  7. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Ещё один момент. в коде можно написать:

    Код (Text):
    1. <input type="checkbox" name="calendar[]" value="..." />
    2. <input type="checkbox" name="calendar[]" value="..." />
    Тогда на сервере будет собран массив из $_POST['calendar'] === array('...', '...')
     
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    [ edited: ошибка выпилена ]
    я был неправ насчет атрибута value у checkbox. да, это тоже работает, а я не пользовался ))) век живи — век учись.
    кажется это стандартное поведение. просто если НЕ указан value, то принимает значение 'on' для чекбокса.

    p.s. Есть элегантный способ создать список дат: $dates = range($date1, $date2, ONE_DAY);
     
  9. Dmtq

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

    С нами с:
    2 мар 2014
    Сообщения:
    28
    Симпатии:
    0
    ткните мордой, пинайте, но не отображает он в datearray_save_action.php нифига
    Код (Text):
    1. <meta charset="utf-8">
    2. <form name="datearray" action="datearray_save_action.php">
    3. <?php
    4.  $from = $_POST['from'];
    5. echo 'С '.$from.'<br>';
    6.  $to = $_POST['to'];
    7. echo 'По '.$to.'<br>';
    8. setlocale(LC_ALL, 'ru_RU.UTF-8');
    9. date_default_timezone_set('Asia/Yekaterinburg');
    10. $dat1=$from; $dat2=$to;
    11. $per=strtotime($dat1); $per2=strtotime($dat2);
    12. $it=$per/(3600*24); $it2=$per2/(3600*24);
    13. $days=$it2-$it;
    14. $daysamount = $days+1;
    15. echo 'Интервал '.$daysamount.' дней<br>';
    16. $cost=0;
    17. echo '<table><tr><td align="center">';
    18. for ($i=0; $i<=$days; $i++) {
    19. $chdate = date( 'd.m.y', strtotime($dat1)+3600*24*$i);
    20. echo strftime('%a', strtotime($dat1)+3600*24*$i).'<br>';
    21. echo date( 'd', strtotime($dat1)+3600*24*$i).'<br>';
    22. echo '<input type="checkbox" name="chdate['.$chdate.']" id="ch" onclick="count()"/>';
    23. // запросы в базу
    24. echo '</td><td align="center">';
    25. }
    26. echo '</td></tr></table>';
    27. ?>
    28. Выбрано: <h id="count">0</h>
    29. <input type="submit" value="Сохранить">
    30. </form>
    31. <script language="JavaScript"><!--
    32.   function count() {
    33.     var form = document.forms.datearray;
    34.     var n = 0;
    35.     for (var i=0; i < form.elements.length; i++) {
    36.       var elt = form.elements[i];
    37.       if (elt.id == "ch" && elt.checked) n++;
    38.     }
    39.     var node = document.getElementById('count');
    40.     node.innerHTML = n
    41.   }
    42. //--></script>
    В адресной строке:
    Код (Text):
    1. datearray_save_action.php?chdate%5B01.03.14%5D=on&chdate%5B02.03.14%5D=on
    datearray_save_action.php:
    Код (Text):
    1. <?php
    2. $test = $_POST['chdate'];
    3. print ($test);
    4. ?>
     
  10. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    http://phpfaq.ru/debug

    Добавлено спустя 3 минуты 47 секунд:
    <form method="post"...