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

Форум PHP

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

 

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

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

тема: Как занести в базу выбраные checkbox
 
 автор: Ванек2010   (31.01.2010 в 10:47)   письмо автору
 
 

Вот такой вопрос, как в базу занести если выбрали 2-3 или 8 checkbox?
Я так понял через массивы как-то..

  Ответить  
 
 автор: sim5   (31.01.2010 в 10:51)   письмо автору
 
   для: Ванек2010   (31.01.2010 в 10:47)
 

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

  Ответить  
 
 автор: Ванек2010   (31.01.2010 в 11:02)   письмо автору
 
   для: sim5   (31.01.2010 в 10:51)
 

<? /* Страница тест */
$res8 mysql_query("SELECT * FROM test WHERE user='$_SESSION[login]' ",$db);
$myr8 mysql_fetch_array($res8);  

echo
"
<form name='form1' method='post' action='obrabotchik.php'>"
;
  do { echo 
"
<input type='checkbox' name='idt' id='checkbox' value='
$myr8[id]' >";


while (
$myr8 mysql_fetch_array($res8));
echo 
"
<input type='submit' name='submit1'   value='Сохранить изменения'>
</form>"
;
?>

<? /*Страница обработчик  */
if (isset($_POST['idt'])) {$idt $_POST['idt']; if ($idt == '') {unset($idt);}}

$resUP1 mysql_query ("UPDATE test SET add='ON' WHERE id='$idt'  ");


?>


Вот и как мне занести если 2 выбрали или 3 или 8 checkbox ? У меня только 1 заносится

  Ответить  
 
 автор: sim5   (31.01.2010 в 11:17)   письмо автору
 
   для: Ванек2010   (31.01.2010 в 11:02)
 

mysql_fetch_array если использовать, то хотя бы флаг указывайте, а вообще используйте mysql_fetch_assoc.
do ... while тут вообще ни к чему, и вам вроде бы как уже указывали на сей факт.
Что касается группы выбранных чекбоксов, начнем с этого - а вы знаете что получите на сервере, если чекбокс выбран? Каким образом они у вас именуются в форме, при ее выводе, если форма имеет 8 чекбоксов?

  Ответить  
 
 автор: Ванек2010   (31.01.2010 в 11:43)   письмо автору
 
   для: sim5   (31.01.2010 в 11:17)
 

Именуются они одинакого, name='idt' просто значение разное , там же в цикле их выполняю.
Их может быть 8 на следущий день 20 на следущий 30, и как показать файлу обработчику, какой именно выбран checkbox я не могу понять. Думал как-то через массивы

  Ответить  
 
 автор: Trianon   (31.01.2010 в 11:48)   письмо автору
 
   для: Ванек2010   (31.01.2010 в 11:43)
 

обрабатывая набор чекбоксов, в форме нужно давать полям имена элементов массива.
"<input type='checkbox' name='idt[$id]' ..."
Где $id - номер позиции.

  Ответить  
 
 автор: Ванек2010   (31.01.2010 в 11:59)   письмо автору
 
   для: Trianon   (31.01.2010 в 11:48)
 

а на странице обработчике, что надо добавить?
И почему тут "<input type='checkbox' name='idt[$id]' ..."
$id а не 0 тож не понял

  Ответить  
 
 автор: sim5   (31.01.2010 в 11:58)   письмо автору
 
   для: Ванек2010   (31.01.2010 в 11:43)
 

Ну ведь можно проверить, что вы будете получать, послав на сервер форму, например, с тремя чекбоксами и с одинаковыми именами? Посмотрите обязательно, и уже поймете, что в таком случае вы просто никоим образом не узнаете были ли нажаты несколько чекбоксов или один.
Учить надо и пробовать для уяснения.

  Ответить  
 
 автор: Ванек2010   (31.01.2010 в 12:23)   письмо автору
 
   для: sim5   (31.01.2010 в 11:58)
 

Блин я уже так запутался ппц.
Допустим я сюда всунул $id
<?
echo "<input type='checkbox' name='idt[$id]' id='checkbox' value='$myr8[id]' >";
?>

Ну а че $id значит то? Где ей давать значения:/


Ну вот , сделал так idt[$id] дальше отсылается на обработчик, а как доставать этот масив и заносить в базу? Вот это я не пойму

  Ответить  
 
 автор: sim5   (31.01.2010 в 12:32)   письмо автору
 
   для: Ванек2010   (31.01.2010 в 12:23)
 

Вот почему бы прежде чем заносить что-то в базу из формы, понять что вы получаете от нее?
Отправьте для теста вот эту форму и посмотрите, что вы получите в этом случае, при выборе тех или иных чекбоксов:
<form action="" method="post">
<input type="checkbox" name="as[]" value="1">
<input type="checkbox" name="as[]" value="2">
<input type="checkbox" name="as[]" value="3">
<input type="submit" value="Send">
</form>

Проверку производить так:
print_r($_POST)

  Ответить  
 
 автор: Ванек2010   (31.01.2010 в 15:46)   письмо автору
 
   для: sim5   (31.01.2010 в 12:32)
 

Так как передать массив я вроде понял, а как заносить массив в базу ??

  Ответить  
 
 автор: sim5   (31.01.2010 в 17:05)   письмо автору
 
   для: Ванек2010   (31.01.2010 в 15:46)
 

Кроме этого вы должны уснить, что вы будете получать в случае именования чекбоскосов, или иных элментов формы, таким образом:
<form action="" method="post"> 
<input type="checkbox" name="as]" value="1"> 
<input type="checkbox" name="as]" value="2"> 
<input type="checkbox" name="as]" value="3"> 
<input type="submit" value="Send">
и
<form action="" method="post"> 
<input type="checkbox" name="as1" value="1"> 
<input type="checkbox" name="as2" value="2"> 
<input type="checkbox" name="as3" value="3"> 
<input type="submit" value="Send"> 
</form> 
</form>

Кроме этого должны уяснить, что невыбранный чекбокс на сервер не передается.
Если чекбоксы в качестве значений имеют id-записей, кторым и нужно установить значение "выбрано", то можно сделать это следующим образом:
<?
//обработать и подготовить входные значения чекбоксов для запроса
$chk implode(","array_map('intval'$_POST['check']));
//а затем запрос для обновления этих полей, используя в запросе
.... WHERE `idIN(" . $chk . ") ....

Но еще раз - невыбранные чекбоксы не передаются на сервер, а это значит....?

  Ответить  
 
 автор: Ванек2010   (31.01.2010 в 17:21)   письмо автору
 
   для: sim5   (31.01.2010 в 17:05)
 

Спасибо большое, на счет того, что те которые не выбрал не будут отсылаться это знал.
За код спасибо, с этими функциями implode, array_map не встречался.. и поэтому незнал как же внести массив в базу

  Ответить  
 
 автор: sim5   (31.01.2010 в 17:26)   письмо автору
 
   для: Ванек2010   (31.01.2010 в 17:21)
 

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

  Ответить  
 
 автор: Ванек2010   (31.01.2010 в 17:41)   письмо автору
 
   для: sim5   (31.01.2010 в 17:26)
 

Понимаю, что не чего не будут означать =) Я в обработчике сделал так, что бы поумолчанию сперва везде ставил OFF в таблице, а те которые были выбраны т.е. массив им поставить в таблице ON, все просто) И если массив пустой то не делать UPDATE базы.

  Ответить  
 
 автор: sim5   (31.01.2010 в 17:58)   письмо автору
 
   для: Ванек2010   (31.01.2010 в 17:41)
 

Запрос у вас будет изменять состояние выбранных чекбоксов, а что тогда должно произойти, если, например, запись под номером 7 ранее была выбрана, а в следующий раз, пользователь не выберет чекбокс 7? То есть, надо будет сбросить это значение в таблице, но ведь этого запрос вышеуказанный не делает. Кстати, уж лучше тогда использовать вместо on и off - 1 и 0.

  Ответить  
 
 автор: Ванек2010   (31.01.2010 в 19:51)   письмо автору
 
   для: sim5   (31.01.2010 в 17:58)
 

Я сделал так, перед выносом chechboxa, создал запрос, если ON стоит то установить флажок(checked), а иначе оставить пустым бокс.

  Ответить  
 
 автор: Лена   (31.01.2010 в 21:25)   письмо автору
 
   для: Ванек2010   (31.01.2010 в 19:51)
 

Вы, похоже, вообще не слышите и не понимаете, что Вам говорят.
Перед вставкой значений чекбоксов в базу, все значения поля, которое принимает значения чекбоксов, надо ОБНУЛИТЬ, т.е. перед Вашим запросом выполнить запрос:
UPDATE test SET add=0 и только потом - UPDATE test SET add='ON' WHERE id='$idt'.

  Ответить  
 
 автор: Trianon   (31.01.2010 в 21:38)   письмо автору
 
   для: Лена   (31.01.2010 в 21:25)
 

несколько неожиданный шаг.
А если между запросами параллельному процессу поплохеет?

  Ответить  
 
 автор: Лена   (31.01.2010 в 21:51)   письмо автору
 
   для: Trianon   (31.01.2010 в 21:38)
 

Я объяснила то, что выше сказал sim5(31.01.2010 в 17:58), потому как сама тоже так делаю.
Ну автор же нигде не указывал, что у него есть параллельные процессы.
Если не обнулять, то тогда перемешаются все чекбоксы.

  Ответить  
 
 автор: Trianon   (31.01.2010 в 21:54)   письмо автору
 
   для: Лена   (31.01.2010 в 21:51)
 

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

А то, что параллельные процессы есть, в web-программировании как-то само собой :)

Не то что бы в данном случае это было такой уж большой бедой.
Но если есть возможность написать аккуратно - почему не написать?

  Ответить  
 
 автор: Лена   (31.01.2010 в 22:03)   письмо автору
 
   для: Trianon   (31.01.2010 в 21:54)
 

Согласна. Честно говоря, обнуляла все подряд, а потом отмечала только те, которые пришли отмеченными.

> (при постраничной навигации по списку элементов - не самый прозрачный аспект.)
Вот это дополнение непонятно. Почему не самый прозрачный?

  Ответить  
 
 автор: Trianon   (31.01.2010 в 22:12)   письмо автору
 
   для: Лена   (31.01.2010 в 22:03)
 

Типичная ситуация. У Вас сотня товаров в таблице.
И форма правки с постраничкой по 20 товаров. ключи без прорех, допустим.

Находясь на 3-й странице вы увидели помеченными 4-й десяток и без отметок - 5-й .
Сняли отметку 42, 48 товаров, пометили 55, 58й.

Если обнулить в таблице всё кроме 41,43,44,45,46,47,49,50,55,58 товаров,
то исказятся данные не только на этой странице, но и на остальных.

  Ответить  
 
 автор: Лена   (31.01.2010 в 22:24)   письмо автору
 
   для: Trianon   (31.01.2010 в 22:12)
 

Я не могу понять, какая разница, на какой я буду странице, если в базу я все равно передаю только отмеченные чекбоксы. База не знает, сколько у меня страниц и как на них расположены элементы с чекбоксами, постраничка - это уже работа другого сервера, база "видит" только массив отмеченных чекбоксов.
Постараюсь завтра найти время и попробовать - сделаю две страницы и на них - элементы с чекбоксами и сама посмотрю. Доверяй, но проверяй :) Тем более, когда не верится.

  Ответить  
 
 автор: Trianon   (31.01.2010 в 22:33)   письмо автору
 
   для: Лена   (31.01.2010 в 22:24)
 

Еще веселее, когда размер страницы каждый пользователь вправе указывать в настройках профиля индивидуально.

  Ответить  
 
 автор: Лена   (02.02.2010 в 10:52)   письмо автору
 
   для: Trianon   (31.01.2010 в 22:33)
 

Обещала посмотреть - посмотрела. И попробовала :)
Взяла для примера список модулей сайта. Напротив каждого названия модуля - чекбокс, который показывает статус модуля. Список расположен на нескольких страницах, я поставила по 5 названий на страницу. Получается, отмечаешь чекбоксы на одной странице - на других страницах все обнуляется. А нам это не нужно.
Значит, нужно обнулять чекбоксы только на той странице, где мы находимся.
Мы запоминаем в массив все id`ы модулей, которые выводятся на данной странице.
Далее получаем массив $_POST['modules'] c отмеченными чекбоксами и исключаем из массива id`ов модулей совпавшие значения $_POST. Все, что осталось - обнуляем. Если ничего не осталось - ничего не обнуляем, для чего делаем соответствующую проверку.
Код - ниже. Писала исходя из экономии времени, поэтому логику и представление не разделяла, а линейку навигатора честно содрала у софттайма, потому как в моей линейке больше кода.
Обработчик: mod.php

<?php
include("configs/dbopen.php");
if(isset(
$_POST['Mod'])){
$itemsOnPage 5;

$page = isset($_GET['one_page']) ? (int)$_GET['one_page'] : 1;
$result1 mysql_query("SELECT COUNT(*) FROM modules");
$posts mysql_result($result1,0);

$total intval(($posts 1)/$itemsOnPage) + 1;
$from $page $itemsOnPage $itemsOnPage;
    if(
$page $total$page $total;

$qu "SELECT * FROM modules LIMIT " .  $from "," $itemsOnPage;
$result mysql_query($qu);
if(!
$result) exit("Error in" $qu mysql_error());
        while (
$row mysql_fetch_assoc($result)){
        
$ids[]  = $row['mod_id']; //все id`ы, которые выводятся на данной странице
        
}
        
$str '';
        
$arr array_flip($ids); //переворачиваем массив, нам нужны ключи
        
foreach($arr as $k=>$v){//сравниваем ключи $_POST['modules'](массив отмеч. чекбоксов) и ключи $ids
            
if(!array_key_exists($k,$_POST['modules']))
                
$str .= $k ",";
        }

        
//проверяем, отмечены ли все чекбоксы
           
if(preg_match("/[0-9]+/su",$str)){
        
$q "UPDATE modules SET visib = 0
            WHERE mod_id IN (" 
mb_substr($str,0,-1) . ")";
        
$r mysql_query($q);
        if(!
$r) exit("Error in" $q mysql_error());
        }

        foreach (
$_POST['modules'] as $item=>$value) {
        
$sql "UPDATE modules SET visib = " $value " WHERE mod_id =" $item;
        
$res mysql_query($sql);
        if(!
$res) exit("Error in " $sql mysql_error());
        }

include(
'mod_pager.php');
include(
'page_nav.php');
}else{
include(
'mod_pager.php');
include(
'page_nav.php');
}

?>


mod_pager.php

<?php
$itemsOnPage 
5;
$page = isset($_GET['one_page']) ? (int)$_GET['one_page'] : 1;

$result1 mysql_query("SELECT COUNT(*) FROM modules");
$posts mysql_result($result1,0);

$total intval(($posts 1)/$itemsOnPage) + 1;
$from $page $itemsOnPage $itemsOnPage;
if(
$page $total$page $total;

    
$q "SELECT * FROM modules LIMIT " .  $from "," $itemsOnPage;
    
$result mysql_query($q);
    if(!
$result) exit("Error in $q: "mysql_error());
        echo 
"<table width=100% border='1px' class = 'admin_table'>
               <tr>
            <td>Название модуля</td>
            <td>Статус</td>
            </tr>"
;
        while (
$row mysql_fetch_assoc($result)){
            
//отмеченные чекбоксы
            
if($row['visib'] == 1$check 'checked';
            else 
$check '';
            
//форма должна обрабатываться на разных страницах
            
if($page>0$query "?one_page=" $page;
            else 
$query '';
               
//форма
            
echo "<form action='mod.php" $query "' method='post'>";
             echo 
"<tr>
             <td>"
$row['mod_name'] . "</td>
             <td><input type='checkbox' name='modules[" 
$row['mod_id'] . "]' value='1'" $check  ">
            </td>"
;
            echo 
"</tr>";
        }
        echo 
"<tr>
            <td colspan=3><input type='submit' value='Подключить/отключить модуль' name = 'Mod'></td>
            </tr>
            </form></table>"
;
?>


page_nav.php

<?php
if ($page != 1$pervpage "<a href='?one_page=1'><<</a>
                               <a href='?one_page=" 
. ($page 1) ."'><</a>";
if (
$page != $total$nextpage "<a href='?one_page=" . ($page 1) . "'>></a>
                                   <a href='?one_page=" 
.$total"'>>></a>";

if(
$page 0$page2left "<a href='?one_page=". ($page 2) ."'>". ($page 2) ."</a> | ";
if(
$page 0$page1left "<a href='?one_page=" . ($page 1) ."'>". ($page 1) ."</a> | ";
if(
$page <= $total$page2right " | <a href='?one_page=" . ($page 2) ."'>". ($page 2) ."</a>";
if(
$page <= $total$page1right " | <a href='?one_page=" . ($page 1) ."'>". ($page 1) ."</a>";

echo 
$pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
?>

  Ответить  
 
 автор: sim5   (02.02.2010 в 11:01)   письмо автору
 
   для: Лена   (02.02.2010 в 10:52)
 

Есть функции пересечения массивов.

  Ответить  
 
 автор: Лена   (02.02.2010 в 11:31)   письмо автору
 
   для: sim5   (02.02.2010 в 11:01)
 

Функции пересечения массивов, мне кажется, здесь не подошли бы...
Потому как мне надо пересечение ключей, а не значений массивов.

  Ответить  
 
 автор: sim5   (02.02.2010 в 11:40)   письмо автору
 
   для: Лена   (02.02.2010 в 11:31)
 

Чем же они не подошли бы? Их меджу прочим не 1 и не 2 ;-)

  Ответить  
 
 автор: Лена   (02.02.2010 в 11:46)   письмо автору
 
   для: sim5   (02.02.2010 в 11:40)
 

Увидела. array_diff_key() думаю, подойдет :) Спасибо.

  Ответить  
 
 автор: Trianon   (02.02.2010 в 12:00)   письмо автору
 
   для: Лена   (02.02.2010 в 11:46)
 

теперь с учетом (31.01.2010 в 22:33)
:)
подсказка.
Потребуется одно поле Hidden

  Ответить  
 
 автор: Ванек2010   (01.02.2010 в 00:19)   письмо автору
 
   для: Лена   (31.01.2010 в 21:25)
 

Да это сделал, еще вначале, сперва все обнуляю, и заношу только те которые были выбраны, вроде все норм пашет =)

  Ответить  
 
 автор: sim5   (01.02.2010 в 04:10)   письмо автору
 
   для: Ванек2010   (01.02.2010 в 00:19)
 

Ну работает и слава богу. Но возможно, что записи, значения которых определяют чекбоксы, это постоянно упорядоченный набор, и в таком случе, можно работать с битовым набором (одним для всех) определящим состояние чекбоксов, установку/сброс битов которого производить логической операцией XOR.

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

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