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

Форум PHP

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

 

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

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

тема: Массовая проверка существования checkbox.
 
 автор: lElectroHardl   (30.07.2010 в 12:54)   письмо автору
 
 

Вчера я уже создавал тему http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=75249&page=1 , но тема не удалась из-за непонимания мной вопроса. И способ который мне давали, не работает.

Теперь вопрос:
1. как можно проверить состояние чекбокса в цикле, если часть имени чекбокса берется из базы. Т.е. у каждого чекбокса свое уникальное имя (i1, i2, i3...). Из которого, цифры этих имен берутся из базы по идентификатору выбранного чекбокса.
2. Как мне в цикле совместить первую часть имени (i) и вторую часть (1, 2, 3...) и проверить на существования этих чекбоксов?
Соединять 1-ю и 2-ю часть так что ли?
<input type="checkbox" name="i$data['id']" />

По-другому не знаю.
И как сделать проверку?
$_POST['i$data[id]'];


Подскажите не знающему.

  Ответить  
 
 автор: sim5   (30.07.2010 в 13:04)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 12:54)
 

Вы сперва объясните, к чему такая привязка id к чекбоксам? И как потом вы будете выяснять кто чей?

  Ответить  
 
 автор: lElectroHardl   (30.07.2010 в 13:10)   письмо автору
 
   для: sim5   (30.07.2010 в 13:04)
 

Привязка такая потому что у каждого чекбокса свое уникальное имя. Что бы было проще определять, какой чекбокс был выбран, а не по значению, которое передал чекбокс. Имя состоит из 2 частей: "i" и соответствующий ему цифре по идентификатору в таблице базы - "[0-66]".
А как вы предлагаете выяснять это? Если в базе 66+ чекбоксов?

  Ответить  
 
 автор: ols   (30.07.2010 в 13:15)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 13:10)
 

<input type="checkbox" name="idata[<?=$data['id'];?>]" value="<?=$data['id'];?>" />
<?print_r($_POST['idata']);?>

  Ответить  
 
 автор: sim5   (30.07.2010 в 13:20)   письмо автору
 
   для: ols   (30.07.2010 в 13:15)
 

Зачем в имя тоже вставлять ID?

  Ответить  
 
 автор: ols   (30.07.2010 в 13:23)   письмо автору
 
   для: sim5   (30.07.2010 в 13:20)
 

Да необязательно — поставил для наглядности

  Ответить  
 
 автор: sim5   (30.07.2010 в 13:24)   письмо автору
 
   для: ols   (30.07.2010 в 13:23)
 

Ни к чему эта наглядность, в данном случае она лишняя.

  Ответить  
 
 автор: ols   (30.07.2010 в 13:29)   письмо автору
 
   для: sim5   (30.07.2010 в 13:24)
 

Уговорили :)
<input type="checkbox" name="idata[]" value="<?=$data['id'];?>" /> 
<?print_r($_POST['idata']);?>

  Ответить  
 
 автор: sim5   (30.07.2010 в 13:22)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 13:10)
 

У каждой записи свой уникальный ID, и по этому признаку и надо определять чекбоксы, а не по уникальному имени. Вы же не с ними в конечном итоге работать будете, а с записями. И получить просто массив уникальных значений равных этим ID проще, и обработать его проще.

  Ответить  
 
 автор: lElectroHardl   (30.07.2010 в 13:33)   письмо автору
 
   для: sim5   (30.07.2010 в 13:22)
 

Что-то не пойму, как определять чекбоксы по ID поля таблице? Поясните. Желательно с примером.
>Вы же не с ними в конечном итоге работать будете, а с записями.
Как раз на оборот. Я буду работать с значениями чекбоксов. А что бы узнать значение, мне нужно знать, у кого я взял это значение. Для этого и нужно уникальное имя.

  Ответить  
 
 автор: ols   (30.07.2010 в 13:37)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 13:33)
 

Двлее обходите циклом массив, и в цикле получаете ид выбранных чекбоксов

  Ответить  
 
 автор: sim5   (30.07.2010 в 13:39)   письмо автору
 
   для: ols   (30.07.2010 в 13:37)
 

Не надо циклов.

  Ответить  
 
 автор: ols   (30.07.2010 в 13:42)   письмо автору
 
   для: sim5   (30.07.2010 в 13:39)
 

в принципе да, можно преобразовать массив в строку

  Ответить  
 
 автор: sim5   (30.07.2010 в 13:49)   письмо автору
 
   для: ols   (30.07.2010 в 13:42)
 

Зачем в строку?

  Ответить  
 
 автор: lElectroHardl   (30.07.2010 в 13:42)   письмо автору
 
   для: sim5   (30.07.2010 в 13:39)
 

Как же без циклов?

  Ответить  
 
 автор: lElectroHardl   (30.07.2010 в 13:41)   письмо автору
 
   для: ols   (30.07.2010 в 13:37)
 

Как это на примере реализовать, не пойму.

  Ответить  
 
 автор: ols   (30.07.2010 в 13:44)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 13:41)
 

Если циклом, то

foreach($_POST['idata'] AS $id)
{
    /// $id - ид опроса
}

Ну лучше преобразовать в строку, с помощью implode

  Ответить  
 
 автор: sim5   (30.07.2010 в 13:52)   письмо автору
 
   для: ols   (30.07.2010 в 13:44)
 

Прямо таки сразу implode и баста?

  Ответить  
 
 автор: ols   (30.07.2010 в 13:57)   письмо автору
 
   для: sim5   (30.07.2010 в 13:52)
 

Если в конечном итоге нужно обратится к таблице — да.
<html>

<head>
  <title></title>
</head>

<body>

<form action="" method="post">
<?
for($i=1$i<8$i++) echo '<input type="checkbox" name="chk[]" value="'.$i.'">';
?>
<input type="submit" value="Send">
</form>

<input type="checkbox" name="idata" value="i$data['id']" />
  <hr>

<?
    $ids 
implode(",",$_POST['chk']);

    echo 
$sql "...WHERE id IN({$ids});"
?>

</body>

</html>

  Ответить  
 
 автор: sim5   (30.07.2010 в 13:59)   письмо автору
 
   для: ols   (30.07.2010 в 13:57)
 

Вы точно в этом уверены?

  Ответить  
 
 автор: ols   (30.07.2010 в 14:00)   письмо автору
 
   для: sim5   (30.07.2010 в 13:59)
 

В чем?

  Ответить  
 
 автор: sim5   (30.07.2010 в 14:01)   письмо автору
 
   для: ols   (30.07.2010 в 14:00)
 

$ids = implode(",",$_POST['chk']);
echo $sql = "...WHERE id IN({$ids});"

  Ответить  
 
 автор: ols   (30.07.2010 в 14:03)   письмо автору
 
   для: sim5   (30.07.2010 в 14:01)
 

Уверен :) Если у Вас есть сомнения, пожалуйста, обоснуйте)))

  Ответить  
 
 автор: sim5   (30.07.2010 в 14:10)   письмо автору
 
   для: ols   (30.07.2010 в 14:03)
 

Нельзя необработанные от пользователя данные вставлять параметрами в запрос, ну хотя бы ради вежливости к MySQL, что-ли.

  Ответить  
 
 автор: ols   (30.07.2010 в 14:15)   письмо автору
 
   для: sim5   (30.07.2010 в 14:10)
 

sim5, вот я честно с Вами несколько удивляюсь читая Ваши посты. Я пологаю у автора голова должна думать сама о таких вещах как безопасности. Я написал код не для того чтобы он его использовал как copy/paste.

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

это не вопрос безопасности.
Это вопрос корректной обработки данных.
Вы учите автора голые строки облеплять кавычками. Это неправильно.

  Ответить  
 
 автор: ols   (30.07.2010 в 14:25)   письмо автору
 
   для: Trianon   (30.07.2010 в 14:17)
 

Какие кавычки?

  Ответить  
 
 автор: Trianon   (30.07.2010 в 16:00)   письмо автору
 
   для: ols   (30.07.2010 в 14:25)
 

пардон. не кавычки.
Вы просто подставляете строковые данные в тело запроса, не приводя тип к числовому.

  Ответить  
 
 автор: ols   (30.07.2010 в 16:22)   письмо автору
 
   для: Trianon   (30.07.2010 в 16:00)
 

Ну да. В любом случае чтобы привести к целому типу, нужно прогнать массив в цикле либо array_walk();

  Ответить  
 
 автор: sim5   (30.07.2010 в 16:24)   письмо автору
 
   для: ols   (30.07.2010 в 16:22)
 

Не надо циклов и array_walk().

  Ответить  
 
 автор: ols   (30.07.2010 в 16:27)   письмо автору
 
   для: sim5   (30.07.2010 в 16:24)
 

А как?

  Ответить  
 
 автор: sim5   (30.07.2010 в 16:32)   письмо автору
 
   для: ols   (30.07.2010 в 16:27)
 

$_POST['name'] = implode(",", array_map('intval', $_POST['name']));

  Ответить  
 
 автор: sim5   (30.07.2010 в 14:22)   письмо автору
 
   для: ols   (30.07.2010 в 14:15)
 

Это форум, и коли вы объясняя "непонимающему", хотите опустить вопрос безопасности раскрывая суть иного, то объясняйте это. Иначе в сторону и не машите саблей, вредно это для тех кому вы пытаетесь что-то объяснить.

  Ответить  
 
 автор: sms-send   (30.07.2010 в 16:52)   письмо автору
 
   для: sim5   (30.07.2010 в 13:59)
 

Что интересно, на неправильную обработку данных перед вставкой в SQL все внимание обращают, а текст в html просто так выводят в большинстве постов, так это ничего... Странные правила)

  Ответить  
 
 автор: sim5   (30.07.2010 в 16:55)   письмо автору
 
   для: sms-send   (30.07.2010 в 16:52)
 

Что именно странного?

  Ответить  
 
 автор: lElectroHardl   (30.07.2010 в 16:13)   письмо автору
 
   для: ols   (30.07.2010 в 13:57)
 

Нет. В конечном итоге мне нужно не к базе по именам чекбоксов обратиться. Мне нужно сделать проверку по именам чекбоксов. А именно, проверить: если существует какой-либо чекбокс (с своим уникальным именем), то дать ему значение CHECKED.
Для Trianon как перевести строковые данные в числовые, что далее воспользоваться implode()?
sim5, нет. Вот ситуация, которую я пытаюсь решить:
Человек выбирает названия каки-либо продуктов через чекбоксы, нажимает Субмит. Его перекидывает на другую страницу, где выдает результат из базы, по значениям, которые поступили от чекбоксов. И теперь, самое главное, нужно поставить параметр CHECKED на тех чекбоксах, которые пользователь выбрал в начале. Что бы он видел, что ж он выбрал. Вот...

  Ответить  
 
 автор: sim5   (30.07.2010 в 16:22)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 16:13)
 

Может я действительно дурной, и не понимаю ваш философский язык, ну тогда будьте так добры, объясните, что сие означает:
>1. В конечном итоге мне нужно не к базе по именам чекбоксов обратиться.
>2. Человек выбирает названия каки-либо продуктов через чекбоксы, нажимает Субмит. Его перекидывает на другую страницу, где выдает результат из базы, по значениям, которые поступили от чекбоксов.


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

  Ответить  
 
 автор: lElectroHardl   (30.07.2010 в 16:29)   письмо автору
 
   для: sim5   (30.07.2010 в 16:22)
 

Не пойму, что я путаю? Уникальные имена - имена, присущие только одному объекту (чекбоксу), значения - то, что находиться в value у чекбокса с уникальным именем. В чем я не прав?
А объяснить вот что:
как мне сделать так, что бы при переходе через submit на следующею страницу, которая находиться в action, помечались CHECKED`том те чекбоксы, которые выбрал пользователь? Что бы он видел то, что сам отметил (до перехода по ссылке через action).

  Ответить  
 
 автор: sim5   (30.07.2010 в 16:36)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 16:29)
 

<input type="checkbox" name="as1" value="1">
<input type="checkbox" name="as2" value="2">
<input type="checkbox" name="as2" value="3">

Это три чекбокса и каждый с уникальным именем. Теперь объясните, как вы будете получать из этих имен id значения?

  Ответить  
 
 автор: lElectroHardl   (30.07.2010 в 16:41)   письмо автору
 
   для: sim5   (30.07.2010 в 16:36)
 

А разве уникальное имя не может являться идентификатором? Я в базу обращаюсь не по ID, а по value.

  Ответить  
 
 автор: sim5   (30.07.2010 в 16:49)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 16:41)
 

Идентификатором может служить что угодно, у вас это уникальные номера записей (id). И конечно по ID вам надо обращаться, но их надо сперва получить из этих чекбоксов, как вы будете это делать?

  Ответить  
 
 автор: lElectroHardl   (30.07.2010 в 17:03)   письмо автору
 
   для: sim5   (30.07.2010 в 16:49)
 

Если по одиночки, то:
... WHERE id IN ($as1).

Если все сразу, то: через
$_POST['name'] = implode(",", array_map('intval', $_POST['name']));
занесу в $abc значения $ac1, $ac2, $ac3 и ...
WHERE id IN ($abc)

Правда
$_POST['name'] = implode(",", array_map('intval', $_POST['name']));
выдает ошибку.

  Ответить  
 
 автор: sim5   (30.07.2010 в 17:07)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 17:03)
 

Это вы отвечаете по подсказке, и, думаю, совсем не представляя смысла написанного, ибо по примему с уникальними именами (выше), этого вы никак не сделаете приведенным кодом. Думаю и ошибки у вас по этой же причине.

  Ответить  
 
 автор: lElectroHardl   (30.07.2010 в 17:21)   письмо автору
 
   для: sim5   (30.07.2010 в 17:07)
 

Что посоветуете делать, что бы задумка получилась? Т.к. из-за малого опыта идей 0.

  Ответить  
 
 автор: sim5   (30.07.2010 в 13:49)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 13:33)
 

Вы уверены что вам эти чекбоксы "посмертно" теперь нужы? Надо полагать, они вам только как временные индикаторы тех или иных значений нужны, забрали их и забыли о чекбоксах. Вся эта кухня для того, чтобы в конечном итоге опять обратиться к базе.
Еще раз повторяю - не путайте уникальное имя с уникальным id, это разные понятия. Чтобы обработать уникальные имена, вам придется обращаться к каждому имени по отдельности, а вот к массиву уникальных значений одного ключа можно обратиться сразу.
Что поле таблицы, что просто вывести циклом, одно и тоже, а посему:

<form action="" method="post">
<?
for($i=1$i<8$i++) echo '<input type="checkbox" name="chk[]" value="'.$i.'">';
?>
<input type="submit" value="Send">
</form>

Отправьте эту форму и просмотрите полученный массив $_POST['chk']. Что наблюдаем?

  Ответить  
 
 автор: lElectroHardl   (30.07.2010 в 16:56)   письмо автору
 
   для: sim5   (30.07.2010 в 13:49)
 

Наблюдаю Array ( [0] => 2 [1] => 3 )....
Это все замечательно. Но вот как сделать так, основываясь на ваш пример , что бы я видел отмеченными те чекбоксы, которые я выбрал?
Что бы, когда мне выводило "Array ( [0] => 1 [1] => 3 [2] => 5 ) - выбраны 1-й. 3-й и 5-й чекбокс" эти чекбоксы (1-й, 3-й и 5-й) были отмечены CHECKED?

  Ответить  
 
 автор: sim5   (30.07.2010 в 17:04)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 16:56)
 

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

Вот сценарий как:
1. Получаем записи для вывода на страницу. Если выбор по чекбоксам, то Примечание.
2. Выводим в цикле ресурс, добавляя чекбоксы.
3. Прверяем, если был получен массив чекбоксов из формы, то проверяем, есть ли в этом массиве значение равное id текущей записи, и если есть, отмечаем чекбокс, указывая ему соответсвующий атрибут.

Примечание: Если пользователь отметил чекбоксы, и нужно вывести список отмеченных, то все чекбоксы естественно нужно отметить. Смысл такого вывода?

  Ответить  
 
 автор: lElectroHardl   (30.07.2010 в 17:20)   письмо автору
 
   для: sim5   (30.07.2010 в 17:04)
 

Блин, причем тут записи? Сейчас мы не говорим про базу. Все, кроме проверки на выборность чекбокса и присвоение ему атрибута, у меня работает. Сейчас проверка у меня работает, только вручную. А хотелось бы, что это работало на автомате (через цикл и проверку).
Сейчас структура такая:
<p class="gen_section"><label><input type="checkbox" <?php if ( $i1 ) {echo "checked='checked'";} else {echo "";} ?> name="i1" value=",1" /> Яблоки</label></p>
<p class="gen_section"><label><input type="checkbox" <?php if ( $i2 ) {echo "checked='checked'";} else {echo "";} ?> name="i2" value=",2" /> Груши</label></p>
<p class="gen_section"><label><input type="checkbox" <?php if ( $i3 ) {echo "checked='checked'";} else {echo "";} ?> name="i3" value=",3" /> Абрикосы</label></p>

*В базе имеются эти ингредиенты (цифры после "i" - их идентификаторы).
А мне надо совместить вывод в цикле из базы этих ингредиентов и присвоение CHECKED, где он надо. То есть цикл с проверкой. И вот это у меня не получается.
Подскажите, что мне нужно понять, что бы это сделать (т.к. изначально меня не правильно поняли). Или пример покажите.

  Ответить  
 
 автор: ols   (30.07.2010 в 17:29)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 17:20)
 

Может быть так до вас до «летит».
<html>

<head>
  <title></title>
</head>

<body>

<form action="" method="post">
<?
    $array_data 
= array();
     
$array_data $_POST['chk'];

    for(
$i=1$i<8$i++)
    {
        if(
in_array($i,$array_data)) $checked "checked"; else $checked '';
        echo 
'<input type="checkbox" name="chk[]" value="'.$i.'" '.$checked.'>';
    }
?>
<input type="submit" value="Send">
</form>
</body>

</html>

  Ответить  
 
 автор: lElectroHardl   (30.07.2010 в 17:38)   письмо автору
 
   для: ols   (30.07.2010 в 17:29)
 

Warning: in_array() expects parameter 2 to be array, null given in ...

  Ответить  
 
 автор: psychomc   (30.07.2010 в 17:50)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 17:38)
 

$_POST['chk'] не существует
начали бы лучше с основ...

  Ответить  
 
 автор: sim5   (30.07.2010 в 17:42)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 17:20)
 

Опять:

1. Блин, причем тут записи? Сейчас мы не говорим про базу.
2. А мне надо совместить вывод в цикле из базы этих ингредиентов и присвоение CHECKED, где он надо.


Вы понимаете, что несете полную ахинею? А понимаете, что if ( $i1 ) {echo "checked='checked'";}, это бессмыслица? А понимаете, что цифры после "i" - их идентификаторы нужно использовать грамонто, и так, чтобы они облегчили вам выполнение задачи?

Вы в элементарное не хотите вникнуть и понять, как же вам объяснить более серьезное? Такое впечатление, что вы сами собственной задачи не понимате.

  Ответить  
 
 автор: lElectroHardl   (30.07.2010 в 18:04)   письмо автору
 
   для: sim5   (30.07.2010 в 17:42)
 

Хорошо, тогда последний вопрос:
Как подсветить выбранную категорию, кроме такого
if ( $section1 ) {echo "style='color:red;'";} else {echo "style='color:black;'"}

метода

  Ответить  
 
 автор: psychomc   (30.07.2010 в 18:15)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 18:04)
 

8-/

  Ответить  
 
 автор: lElectroHardl   (30.07.2010 в 18:38)   письмо автору
 
   для: psychomc   (30.07.2010 в 18:15)
 

На том же habrahabr.ru, когда заходишь в "посты", надпись подсвечивается черным. Как это реализовано?

  Ответить  
 
 автор: psychomc   (02.08.2010 в 10:24)   письмо автору
 
   для: lElectroHardl   (30.07.2010 в 18:38)
 

спросите у habrahabr.ru

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

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