PHP + динамические 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. И нужно чтобы скрипт обработал их:
?>
При этом каким-то понятным образом определять, где чекбокс выбран, а где нет...
Извините за ламерство, но прошу вас помочь приблизителньым кодом с комментариями.
foreach ($_POST['my_cb'] as $checked_cb_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 берём, и как передаём имя???...
Может ли кто-то написать работающий код???
(для примера - хтмл-страница с чекбоксами, выделяем несколько, и в результате выдаётся список выбранных чекбоксов??)???
Спасибо за ранее
Выводим на страницу.
Если к имени инпута добавить [], то значения будут передаваться одним масивом.
Это, я так понимаю, после 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"] для тех чекбоксов которые были выбраны.
Полностю робочий код писать не буду, и самому лень и у тебя удовольствие отбирать не хочу. Делай сам, ето полезно.
Читай внимательнее что написанно выше. Тебе уже дали ответ.
Если все еще не понял:
<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>
// Файл обработки Формы
//Кусок 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.
еще то непонятно?
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 (без указания положения курсора в массиве) для получения нужных значений?... Т.е.
foreach ($my_check){
mysql_query("DELETE FROM table WHERE id='$my_check'");
}
(чтобы в цикле foreach удалять из базы те строки, id которых совпадает со значением каждой ячейки массива my_check)
foreach ($my_check as $line){
echo $my_check[$i]." - <BR> \n";
}
Нифига он не удобнее. На то тебе и дан foreach чтоб сразу значение получать а не по индексу обращаться. В $line у тебя сразу и будет айдишка. Ты ведь ее будеш в value чекбокса записывать в html-e. Что мешает тут же и удалить запись из БД ?
Зачем тебе сравнивать ? Тебе что елементы масива удалять надо или строчки в БД ? Ато я не пойму чтото.
Не должно оно там быть. Второй кусок кода от Tingo не робочий.
$my_check = $_POST['my_check'];
foreach ($my_check as $line){
echo $my_check[$i]." - <BR> \n";
}
Тут вообще так делать нельзя. Нельзя в foreach по индексу так обращаться к масиву, потому что не знаеш какой он етот индекс. Может он вообще не числовой, а даже если и числовой и ты начнеш с $i = 0, а потом $i++ будеш делать - где гарантия что у тебя индексы подрят идут. Нет в случае с чекбоксом так оно и будет, но вообще конструкция в корень неправильная.
Если уж делать то так
foreach ($my_check as $key=>$line){
echo $my_check[$key]." - <BR> \n";
}
но какой в етом смысл ? если в $line есть копия $my_check[$key], а в &$line, как я припоминаю будет то же место памяти.
Заработал следующий скрипт:
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>
Всем ещё раз большое спасибо за помощь...
Тут вообще так делать нельзя. Нельзя в foreach по индексу так обращаться к масиву, потому что не знаеш какой он етот индекс
Полностю с вами и согласен. Я и сам так считаю :D.
А неправильный кусок с обращением по индексу в цикле foreach,
был ошибкой моего копирования.
То есть я просто скопипастил код с циклом for(), от поэтому и получилась ошибка.
Приношу свои извинения.
$arr=is_array($_POST["checks"])?$_POST["checks"]:null;
for($i=0; $i<count($arr); $i++) {
$tmp=intval($arr[$i]);
echo $tmp.'<br>';
}
}
Особенно когда отписываются с таким звучным заголовком, и ещё криворукий код при этом приводят
Выше код описан под работу с индифекаторами таблицы, вот и было расчитано использовать integer. Вывод сделан для проверки пользователем кода, на счё null ты уже сам сказал просто цикл for не запустится если там null, и ошибок не выдаст.
Ща ещё другие люди, поумнее нас обоих, почитают, да объяснят тоже, где же я был не прав, а вы правы..
Привыкайте к обработке ошибок, но не в том виде, что написана тут.
2AlexRusSoft: в твоем примере много лишнего кода, на который UAS уже указал.
Все это можно свести к гораздо более компактному виду
{
for($i=0; $i<count($_POST['checks']); $i++)
{
echo $_POST['checks'][$i].'<br>';
}
}
а вообще если нам тупо надо посмотреть что прислано - то тут вообще получается проще всего)))
print_r($_POST['checks']);
echo '</pre>';
ЗЫ А слово "молодожь" пишется с мягким знаком.
вообще AlexRusSoft почти правильно написал или скажем в приделах допустимого
если смотреть полностью, для задачи поставленной в этой теме
$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 то при передаче строки или числа будет возникать ошибка
если в $_POST['checks'] будет строка, то вызов $_POST['checks'][$i] вернет первый символ.
последствия предсказать несложно
to RussianSpy
твой код конечно прост, но если в $_POST['checks'] будет содержатся например число или строка,
а не массив как мы ожидаем, то твой цикл выполнит одну итерацию
если for заменить foreach то при передаче строки или числа будет возникать ошибка
если в $_POST['checks'] будет строка, то вызов $_POST['checks'][$i] вернет первый символ.
последствия предсказать несложно
А никто и не претендует на универсальность кода. Это да будет вам известно вообще невозможно предусмотреть все варианты. Для каждого конкретного случая будет свой код
я не говорил об универсальности
в этой теме поставлена вполне конкретная задача
и для решения этой задачи вполне возможно сформулировать корректный вариант решения
я всего лишь на примере твоего кода демонстрирую то о чем пишут в каждой книге и не только:
пользователю доверять нельзя. по умыслу или без оного он может с легкостью сломать плохо защищенную систему