Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: проверка нескольких checkbox
 
 автор: serjinio   (28.07.2009 в 14:35)   письмо автору
 
 

Есть несколько полей,каждому полю стоит в соответствии checkbox
<input  type="text" name="n[]" />
<input name="reg[]" type="checkbox"  value="1" /> 

<input  type="text" name="n[]" />
<input name="reg[]" type="checkbox"  value="1" /> 

<input  type="text" name="n[]" />
<input name="reg[]" type="checkbox"  value="1" /> 


надо проверит включен ли checkbox соответствующего поля
проверял через isset но результат не верный
for ($i=0; $i<count($_POST['n']); $i++) 
{
$ch = isset($_POST['reg'][$i]) ? intval($_POST['reg'][$i]) : 0;
echo '<br/>checkbox '.$i.' -- '.$ch;
}


если использовать дополнительные поля
<input type="hidden" name="reg[]" value="0">
то тоже не верный результат..массив увеличивается в двое

[reg] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 0
            [3] => 1
            [4] => 0
            [5] => 1
        )

  Ответить  
 
 автор: sim5   (28.07.2009 в 14:44)   письмо автору
 
   для: serjinio   (28.07.2009 в 14:35)
 

Ошибка именно в isset. array_map('intval', $_POST['reg']) - вернет вам все чекбоксы, без всякого цикла.

  Ответить  
 
 автор: serjinio   (28.07.2009 в 14:59)   письмо автору
 
   для: sim5   (28.07.2009 в 14:44)
 

array_map('intval', $_POST['reg'])..Что-то ругается на второй аргумент
Warning: array_map() [function.array-map]: Argument #2 should be an array

  Ответить  
 
 автор: sim5   (28.07.2009 в 15:49)   письмо автору
 
   для: serjinio   (28.07.2009 в 14:59)
 

Ошибка говорит о том, что второй аргумент функции не является массивом, хотя $_POST, это массив. Значит вы запендюрили эту функцию, не проверив, пришел ли вам массив $_POST. Проверьте:
<?
print_r
(array_map('intval', array(123'a'5)));

Если ваши чекбоскы служат для проверки выбора/не выбора определенных ID, то значениям этих чебоксов укажите не единички, а ID. Тогда вышеприведенный код позволит получить только реальные ID возвращенные пользователем. Можно ID указать и как ключи массива $_POST. В этом случае можно проверить вышеприведенным способом ключи, либо значения, но предварительно array_flip($_POST['reg']). Если указывать ключам ID, то значения для чекбоксов можно не указывать, невыбранные чекбоксы не передаются на сервер, а установленные передают значение "on".
В общем как делать проверку, зависит от того, чему служат ваши чекбоксы, а чему они служат я не знаю.

  Ответить  
 
 автор: serjinio   (29.07.2009 в 00:38)   письмо автору
 
   для: sim5   (28.07.2009 в 15:49)
 

Прошу прощение за паузу..к сожалению мне array_map не подходит кроме вышеуказанных полей присутствуют поля type="file"
смысл заключается в том что на страницу динамически те(произвольное количество )выводятся поля
выбор картинки ее описание и чекбокс ..опубликовывать или нет
далее они поступают в обработчик который загружается во фрейме ..он принимает массив $_FILES и массив$_POST текстовых полей и чекбоксов...обрабатывает это в цикле
for ($i=0; $i<count($_FILES['fl']['name']); $i++) {

if (is_uploaded_file($_FILES['fl']['tmp_name'][$i]) == TRUE) 
 {
проверки..ресайз....
$Description=$_POST['descr'][$i]...
$img_name=$_POST['n'][$i]== ...
проверка чекбоксов......
$hide_info=$_POST['reg'][$i].............
запись в БД.....
$Message.='<div ><img  src="'.$filename_thumb_path.'" width="160" height="120" border="0" /></div><p>Описание : <span class="info">'.$Description.'</span></p>
<p class="in">Статус просмртра : '.$hide_info.' </p>' и тд....
 } 
<script type="text/javascript">
parent.document.getElementById("imageId").innerHTML ='<?php echo $Message ?>'; 
</script>


делает ресайз картинок и выводит в этом фрейме блоки типа AJAX во фрейме...в которых превьюшка и данные к ней типа описание и включен или выключен чекбокс ..одновременно производится запись в Бд (в цикле) имя картинки ее параметры,описание ,название и значение чекбокса(для нее)..те опубликовывать или нет...
те все запустил но проблема привязки значений чекбоксов к картинкам....

  Ответить  
 
 автор: sim5   (29.07.2009 в 05:59)   письмо автору
 
   для: serjinio   (29.07.2009 в 00:38)
 

И почему это вам array_map не подходит? А если подумать? :) Текстовые поля, и поля загружаемых файлов должны иметь в имени своем индекс равный ID записи, а чекбоксы этот индекс содержат в качестве значения. Тогда:
<?
//получаем массив полей которые выбраны
$checked array_map('intval'$_POST['check']);
//далее по этому массиву проверяем все
//получаем только выбранные описания
$desc array_intersect_key($_POST['desc'], array_flip($checked));
//а в цикле проверки загруки изображений выбираем только те, что отмечены
//имеются в массиве $checked

  Ответить  
 
 автор: x64   (28.07.2009 в 14:51)   письмо автору
 
   для: serjinio   (28.07.2009 в 14:35)
 

а и не получится.
[] портят всю малину.
нужно использовать как-то так:


<input  type="text" name="n[1]" />
<input name="reg[1]" type="checkbox"  value="1" />

<input  type="text" name="n[2]" />
<input name="reg[2]" type="checkbox"  value="1" /> 


без этого нельзя определить, какой чекбокс чему относится (просто потому, что если флаг не отмечен, значение не посылается)

  Ответить  
 
 автор: ride   (28.07.2009 в 15:17)   письмо автору
 
   для: x64   (28.07.2009 в 14:51)
 

думаю, при данной задаче массив ничего не портит:
просто в значении чекбокса нужно передавать не 1, а, конкретное значение-идентификатор, то есть

<input name="reg[]" type="checkbox"  value="10" />
<input name="reg[]" type="checkbox"  value="12" />

после сабмита будут доступны выбранные айди.

  Ответить  
 
 автор: Trianon   (28.07.2009 в 15:17)   письмо автору
 
   для: ride   (28.07.2009 в 15:17)
 

><input name="reg[1]" type="checkbox" value="10" />
><input name="reg[2]" type="checkbox" value="12" />

>просто в значении чекбокса нужно передавать не 1, а, конкретный идентификатор

лишнее это.

  Ответить  
 
 автор: ride   (28.07.2009 в 15:23)   письмо автору
 
   для: Trianon   (28.07.2009 в 15:17)
 

не очень понятно.

  Ответить  
 
 автор: Trianon   (28.07.2009 в 15:26)   письмо автору
 
   для: ride   (28.07.2009 в 15:23)
 

Так понятнее?

  Ответить  
 
 автор: ride   (28.07.2009 в 15:31)   письмо автору
 
   для: Trianon   (28.07.2009 в 15:26)
 

если вы о reg[1] - то это я копипастил, потом исправил.
а вообще, думаю, оба варианта имеют право на жизнь:

<input type="checkbox" name="reg[]" value="22">
и 
<input type="checkbox" name="reg[22]" value="1">

в обоих методах можно добраться до цифры 22
впринципе,
<input type="checkbox" name="reg[22]" value="22">
- тоже вариант и ни к каким плохим последствиям не приведет.

  Ответить  
 
 автор: Trianon   (28.07.2009 в 15:36)   письмо автору
 
   для: ride   (28.07.2009 в 15:31)
 

>впринципе,
>
<input type="checkbox" name="reg[22]" value="22">
- тоже вариант и ни к каким плохим последствиям не приведет.

Конечно. Равно как возможен и следующий вариант:
<input type="checkbox" name="reg[22]" value="Повторяю для тех, кто в танке, 22 (двадцать второй нумер)  отмечен!  22 is on!!! ">


Вопрос лишь, зачем?

  Ответить  
 
 автор: ride   (28.07.2009 в 15:40)   письмо автору
 
   для: Trianon   (28.07.2009 в 15:36)
 

смешной примерчик. убедили :)

  Ответить  
 
 автор: Рома   (28.07.2009 в 17:20)   письмо автору
 
   для: Trianon   (28.07.2009 в 15:17)
 

Можно у Вас просто поинтересоваться, а то мне уже неудобно ответы постить? А разве не логичнее здесь применить foreach?

  Ответить  
 
 автор: x64   (28.07.2009 в 17:23)   письмо автору
 
   для: Рома   (28.07.2009 в 17:20)
 

если тут:
><input name="reg[1]" type="checkbox" value="10" />
><input name="reg[2]" type="checkbox" value="12" />
флажок не отмечен, браузер значение не передаёт.

  Ответить  
 
 автор: Рома   (28.07.2009 в 17:35)   письмо автору
 
   для: x64   (28.07.2009 в 17:23)
 

>флажок не отмечен, браузер значение не передаёт.

А восемь умножить на восемь равно шестьдесят четыре.

  Ответить  
 
 автор: x64   (28.07.2009 в 23:13)   письмо автору
 
   для: Рома   (28.07.2009 в 17:35)
 

стебун?

смотря для чего это нужно.
для данного вопроса (как Я его понял), проще посмотреть наличие $_POST['reg'][1]
а не изгаляться через
foreach ($_POST['reg'] as $v) {
switch ($v) {
case 10: <код>; break;
case 20: <код>; break;

}
}

если понял не так, то проще просуммировать все значения $_POST['reg'] (аналог SET в mysql; для этого value-значение представляются как степень двойки. удобно)

ps: одним людям мозг нужен для того, чтобы думать; другим — чтобы не ‘бухало’, когда стучишь по голове…

  Ответить  
 
 автор: Trianon   (28.07.2009 в 17:45)   письмо автору
 
   для: Рома   (28.07.2009 в 17:20)
 

дело вкуса.
По мне так array_map выглядит симпатичней.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования