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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Как занести в базу выбраные checkbox

Сообщения:  [1-10]    [11-20]   [21-30]  [31-33] 

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

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

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

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

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

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

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

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

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

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

  Ответить  
 
 автор: Лена   (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   (01.02.2010 в 04:10)   письмо автору
 
   для: Ванек2010   (01.02.2010 в 00:19)
 

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

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

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

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

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

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

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

  Ответить  

Сообщения:  [1-10]    [11-20]   [21-30]  [31-33] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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