Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

PHP + динамические Checkbox. Обработка.

369
09 октября 2007 года
Kesano
451 / / 09.10.2007
Добрый день, наверное баян, но прошу помочь чётким руководством и если можно - примером с объяснеиями\комментариями по генерации и обработке checkbox'ов.

Например, у меня есть:

Код:
<?
    $result=mysql_query("SELECT * from TABLE where (param='X') order by ID desc"); //---- Где param - поле, Х- значение, ID - уникальный идентификатор auto_increment .

    $rows=mysql_num_rows($result);

   if($rows>0)
     {
        for($i=0; $i<$rows; $i++)
           {
             mysql_data_seed($result,$i);
             $array=mysql_fetch_array($result);

             echo('<input type="checkbox" name="'.$array["id"].'"> text1');
           
           }
     }
?>


Т.е. мне нужно, чтобы динамически генерировалось коль-во чекбоксов с привязкой к параметру (ID). И при отправке формы динамически обрабатывалсь (в нужном количестве) в цикле.

Т.е. например мы получили чекбоксы $c3, $c6, $c8, $c24, $c30. И нужно чтобы скрипт обработал их:
 
Код:
<? for ($i=0; $i<$checknum; $i++) // ---- Где $checknum - коль.во сгенерированных (полученных) чекбоксов одной группы.
      ?>


При этом каким-то понятным образом определять, где чекбокс выбран, а где нет...

Извините за ламерство, но прошу вас помочь приблизителньым кодом с комментариями.
92
09 октября 2007 года
Тень Пса
2.2K / / 19.10.2006
в скрипт передадутся только выбранные чекбоксы.
276
09 октября 2007 года
Rebbit
1.1K / / 01.08.2005
Сделай
 
Код:
'name="my_cb[]" value="'.$array["id"].'"'

foreach ($_POST['my_cb'] as $checked_cb_id)
369
09 октября 2007 года
Kesano
451 / / 09.10.2007
Цитата: Rebbit
Сделай
 
Код:
'name="my_cb[]" value="'.$array["id"].'"'

foreach ($_POST['my_cb'] as $checked_cb_id)



Извини, а в какую часть кода это всё впихнуть???

Простоте что надоедаю. но я очень прошу или пример рабочего кода или комментарии...

'name="my_cb[]" value="'.$array["id"].'"' - это мы засовываем в массив данные об именах всех чекбоксов... или это таким образом выводить чекбоксы на страницу????

foreach ($_POST['my_cb'] as $checked_cb_id)
Это, я так понимаю, после Submit обрабатывает переданные данные и сверяет $checked_cb_id имена чек-боксов с номерами в массиве. Какие были - какие checked...

вот только откуда переменную $checked_cb_id берём, и как передаём имя???...

Может ли кто-то написать работающий код???
(для примера - хтмл-страница с чекбоксами, выделяем несколько, и в результате выдаётся список выбранных чекбоксов??)???

Спасибо за ранее

276
09 октября 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: Kesano
'name="my_cb[]" value="'.$array["id"].'"' - это мы засовываем в массив данные об именах всех чекбоксов... или это таким образом выводить чекбоксы на страницу????


Выводим на страницу.
Если к имени инпута добавить [], то значения будут передаваться одним масивом.

Цитата:
foreach ($_POST['my_cb'] as $checked_cb_id)
Это, я так понимаю, после Submit обрабатывает переданные данные и сверяет $checked_cb_id имена чек-боксов с номерами в массиве. Какие были - какие checked...

вот только откуда переменную $checked_cb_id берём, и как передаём имя???...


Да ето обработка после сабмита. В $_POST['my_cb'] будет масив в котором будут индексы всех отмеченых чекбоксов.
Откуда берется $checked_cb_id.....
Ето тебе справку по foreach смотреть надо :).
А в кратце тело цикла foreach ($_POST['my_cb'] as $checked_cb_id)
выполнится для каждого елемента масива $_POST['my_cb'] а в $checked_cb_id (назвать ету переменную можно и по другому) будет собственно значение елемента масива. Тоесть там будут $array["id"] для тех чекбоксов которые были выбраны.

Полностю робочий код писать не буду, и самому лень и у тебя удовольствие отбирать не хочу. Делай сам, ето полезно.

7.8K
09 октября 2007 года
Tingo
201 / / 17.05.2007
Нет. Ты видимо не знаком с конструкцией foreach. RFMs по этой и другим темам. http://ru.php.net/foreach
Читай внимательнее что написанно выше. Тебе уже дали ответ.


Если все еще не понял:
 
Код:
// Файл Формы
<form action="proc.php" method="post">
Первый - <input type="checkbox" name="my_check[]" value="1">
Второй - <input type="checkbox" name="my_check[]" value="2">
Третий - <input type="checkbox" name="my_check[]" value="3">
Четвертый - <input type="checkbox" name="my_check[]" value="4">
</form>


Код:
<?php
// Файл обработки Формы
//Кусок 1:::
$my_check = $_POST['my_check'];
$len = sizeof($my_check);
for(i=0; i<len; i++){
 echo $my_check[$i]." - <BR> \n";
};
//Кусок 2:::
$my_check = $_POST['my_check'];
foreach ($my_check as $line){
 echo $my_check[$i]." - <BR> \n";
}

// КУСОК 1 равен КУСОК 2
?>


Если помеченны checbox'ы 1,2 и 4. то на экран выйдет 1, 2, 4.

еще то непонятно?
369
09 октября 2007 года
Kesano
451 / / 09.10.2007
 
Код:
$my_check = $_POST['my_check'];
foreach ($my_check as $line){
 echo $my_check[$i]." - <BR> \n";
}


В принципе этот метод, конечно. удобнее вервого... 2 вопроса.

1. foreach ($my_check as $line) можно ли заменить на foreach ($my_check) , т.е. чтобы не сравнивать каждый элемент массива со значением $line ???

2. не понял echo $my_check[$i] - откуда $i вылезло, если цикл for применяется только в первом куске? "Поканает" ли инструкция echo $my_check (без указания положения курсора в массиве) для получения нужных значений?... Т.е.

 
Код:
$my_check = $_POST['my_check'];
foreach ($my_check){
    mysql_query("DELETE FROM table WHERE id='$my_check'");
}

(чтобы в цикле foreach удалять из базы те строки, id которых совпадает со значением каждой ячейки массива my_check)
276
09 октября 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: Kesano
 
Код:
$my_check = $_POST['my_check'];
foreach ($my_check as $line){
 echo $my_check[$i]." - <BR> \n";
}
В принципе этот метод, конечно. удобнее вервого... 2 вопроса.


Нифига он не удобнее. На то тебе и дан foreach чтоб сразу значение получать а не по индексу обращаться. В $line у тебя сразу и будет айдишка. Ты ведь ее будеш в value чекбокса записывать в html-e. Что мешает тут же и удалить запись из БД ?

 
Код:
mysql_query("DELETE FROM table WHERE id='$line'");


Цитата:
1. foreach ($my_check as $line) можно ли заменить на foreach ($my_check) , т.е. чтобы не сравнивать каждый элемент массива со значением $line ???


Зачем тебе сравнивать ? Тебе что елементы масива удалять надо или строчки в БД ? Ато я не пойму чтото.

Цитата:
2. не понял echo $my_check[$i] - откуда $i вылезло


Не должно оно там быть. Второй кусок кода от Tingo не робочий.

276
09 октября 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: Tingo
 
Код:
//Кусок 2:::
$my_check = $_POST['my_check'];
foreach ($my_check as $line){
 echo $my_check[$i]." - <BR> \n";
}


Тут вообще так делать нельзя. Нельзя в foreach по индексу так обращаться к масиву, потому что не знаеш какой он етот индекс. Может он вообще не числовой, а даже если и числовой и ты начнеш с $i = 0, а потом $i++ будеш делать - где гарантия что у тебя индексы подрят идут. Нет в случае с чекбоксом так оно и будет, но вообще конструкция в корень неправильная.

Если уж делать то так

 
Код:
$my_check = $_POST['my_check'];
foreach ($my_check as $key=>$line){
 echo $my_check[$key]." - <BR> \n";
}

но какой в етом смысл ? если в $line есть копия $my_check[$key], а в &$line, как я припоминаю будет то же место памяти.
369
09 октября 2007 года
Kesano
451 / / 09.10.2007
спасибо всем за участие в дискуссии...

Заработал следующий скрипт:

Код:
<?
mysql_connect("localhost", "test", "test");
mysql_select_db("test");

if(@$add)
  {
    mysql_query("INSERT into chekbox (myt) values ('$pole')"); // Добавляем значение поля myt, id ставится автоинкрементом
  }
if(@$del)
  {
    $arr=$_POST["checks"];

    $len = sizeof($arr);
    echo('Всего к удалению '.$len); // чисто для себя смотрим сколько элементов к удалению
    for($i=0; $i<$len; $i++)
       {
        $tmp=$arr[$i];
        mysql_query("delete from chekbox where id='$tmp'"); // Удаляем из БД строки, где ID равно значению ячейки массива
       
     
        }


  }

$res=mysql_query("select * from chekbox order by id desc"); // Сразу выводим все строки БД чтобы видеть что добавили с единой формой.

$rows=mysql_num_rows($res);

if($rows>0)
  {
   echo('<form id="form2" name="form2" method="post" action="">');

   for($i=0; $i<$rows; $i++)
      {
        mysql_data_seek($res,$i);
        $ares=mysql_fetch_array($res);

        echo('<p><input type="checkbox" name="checks[]" value="'.$ares["id"].'"> '.$ares["myt"].'</p>');
      }
    echo('  <p>
    <input name="del" type="submit" id="del" value="Удалить" />
</p>
</form>'
);

   }
?>

<form id="form1" name="form1" method="post" action="">
  <input type="text" name="pole" id="pole">
  <input name="add" type="submit" id="add" value="Добавить" />
</form>


Всем ещё раз большое спасибо за помощь...
7.8K
11 октября 2007 года
Tingo
201 / / 17.05.2007
Временно отсуствовал...
Цитата:

Тут вообще так делать нельзя. Нельзя в foreach по индексу так обращаться к масиву, потому что не знаеш какой он етот индекс



Полностю с вами и согласен. Я и сам так считаю :D.
А неправильный кусок с обращением по индексу в цикле foreach,
был ошибкой моего копирования.

То есть я просто скопипастил код с циклом for(), от поэтому и получилась ошибка.

Приношу свои извинения.

36K
16 марта 2008 года
Mukcep
3 / / 16.03.2008
тут вопрос один образовался: с массивом все хорошо, если в нем есть элементы, а как быть если ни один чек не проставлен?
Цитата:
Notice: Undefined variable: my_check in

244
16 марта 2008 года
UAS
2.0K / / 19.07.2006
функция isset();
43K
21 октября 2008 года
AlexRusSoft
3 / / 21.10.2008
 
Код:
if(isset($_POST['del'])) {
  $arr=is_array($_POST["checks"])?$_POST["checks"]:null;
  for($i=0; $i<count($arr); $i++) {  
    $tmp=intval($arr[$i]);
    echo $tmp.'<br>';
  }
}
244
21 октября 2008 года
UAS
2.0K / / 19.07.2006
Меня радуют такие аккаунты) Которые считают обязательством найти на форуме древнюю тему и в ней отписаться))

Особенно когда отписываются с таким звучным заголовком, и ещё криворукий код при этом приводят
43K
21 октября 2008 года
AlexRusSoft
3 / / 21.10.2008
обоснуй или досей поры нотисы обробатывал :D
244
21 октября 2008 года
UAS
2.0K / / 19.07.2006
Элементарно. Почему не проверятете is_array($_POST["checks"]) на isset? Тогда у вас $arr может принимать значение null, что вы и передаете в count() - функцию. Не отрицаю - в пхп это должно работать (проверять не буду), но то что вы пихаете null туда, где должен быть массив или объект - уже не есть валидность. Но все же за типизацией следует следить, хоть пхп и не на то ориентрирован. Ещё вы собираетесь выводить значения $arr. Ну дык нафига их превращать в int? Тем более, в некоторых случаях, если $arr[$i] будет 1 (или ещё чем-то, ща не вспомню), то она просто не выводится, приходится явно преобразовывать в (string).
43K
21 октября 2008 года
AlexRusSoft
3 / / 21.10.2008
Цитата: UAS
Элементарно. Почему не проверятете is_array($_POST["checks"]) на isset? Тогда у вас $arr может принимать значение null, что вы и передаете в count() - функцию. Не отрицаю - в пхп это должно работать (проверять не буду), но то что вы пихаете null туда, где должен быть массив или объект - уже не есть валидность. Но все же за типизацией следует следить, хоть пхп и не на то ориентрирован. Ещё вы собираетесь выводить значения $arr. Ну дык нафига их превращать в int? Тем более, в некоторых случаях, если $arr[$i] будет 1 (или ещё чем-то, ща не вспомню), то она просто не выводится, приходится явно преобразовывать в (string).


Выше код описан под работу с индифекаторами таблицы, вот и было расчитано использовать integer. Вывод сделан для проверки пользователем кода, на счё null ты уже сам сказал просто цикл for не запустится если там null, и ошибок не выдаст.

244
21 октября 2008 года
UAS
2.0K / / 19.07.2006
Ппц ты бы потише с заголовками.. Мне есть чему завидовать?? Да я с таким кодом, где суют че попало не туда куда надо, даже работать не буду, и использовать тоже.
Ща ещё другие люди, поумнее нас обоих, почитают, да объяснят тоже, где же я был не прав, а вы правы..
13
21 октября 2008 года
RussianSpy
3.0K / / 04.07.2006
Мда...

Привыкайте к обработке ошибок, но не в том виде, что написана тут.

2AlexRusSoft: в твоем примере много лишнего кода, на который UAS уже указал.

Все это можно свести к гораздо более компактному виду

 
Код:
if(isset($_POST['checks']))
{
  for($i=0; $i<count($_POST['checks']); $i++)
  {  
     echo $_POST['checks'][$i].'<br>';
  }
}


а вообще если нам тупо надо посмотреть что прислано - то тут вообще получается проще всего)))

 
Код:
echo '<pre>';
print_r($_POST['checks']);
echo '</pre>';



ЗЫ А слово "молодожь" пишется с мягким знаком.
312
24 октября 2008 года
dead_star
392 / / 26.11.2006
порассуждаем немножко
вообще AlexRusSoft почти правильно написал или скажем в приделах допустимого
если смотреть полностью, для задачи поставленной в этой теме
 
Код:
if (isset($_POST['del'])){
 $dels = is_array($_POST['del']) ? $_POST['del'] : array();
 foreach ($dels as $id){
  mysql_query("DELETE FROM `chekbox` WHERE `id` = ".intval($id));
 }
}

в данном случае можно спокойно использовать foreach вместо for.
переменной $dels можно устанавливать значение как null так и array() результат одинаковый,
но присваивание array() на мой личный взгляд логичней, но это кому как.

to RussianSpy
твой код конечно прост, но если в $_POST['checks'] будет содержатся например число или строка,
а не массив как мы ожидаем, то твой цикл выполнит одну итерацию
если for заменить foreach то при передаче строки или числа будет возникать ошибка
Цитата:
Warning: Invalid argument supplied for foreach()


если в $_POST['checks'] будет строка, то вызов $_POST['checks'][$i] вернет первый символ.
последствия предсказать несложно

13
24 октября 2008 года
RussianSpy
3.0K / / 04.07.2006
Цитата: dead_star

to RussianSpy
твой код конечно прост, но если в $_POST['checks'] будет содержатся например число или строка,
а не массив как мы ожидаем, то твой цикл выполнит одну итерацию
если for заменить foreach то при передаче строки или числа будет возникать ошибка
если в $_POST['checks'] будет строка, то вызов $_POST['checks'][$i] вернет первый символ.
последствия предсказать несложно



А никто и не претендует на универсальность кода. Это да будет вам известно вообще невозможно предусмотреть все варианты. Для каждого конкретного случая будет свой код

312
24 октября 2008 года
dead_star
392 / / 26.11.2006
Цитата: RussianSpy
А никто и не претендует на универсальность кода. Это да будет вам известно вообще невозможно предусмотреть все варианты. Для каждого конкретного случая будет свой код



я не говорил об универсальности
в этой теме поставлена вполне конкретная задача
и для решения этой задачи вполне возможно сформулировать корректный вариант решения
я всего лишь на примере твоего кода демонстрирую то о чем пишут в каждой книге и не только:
пользователю доверять нельзя. по умыслу или без оного он может с легкостью сломать плохо защищенную систему

13
24 октября 2008 года
RussianSpy
3.0K / / 04.07.2006
Друг мой - в приведенном примере автор выводил все хозяйство в браузер. Соответственно и проверка тут не нужна. В любом случае тема давно исчерпана.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог