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

Форум MySQL

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

 

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

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

тема: Снять чекбокс - изменения отразить в базе данных
 
 автор: Лена   (20.09.2009 в 23:34)   письмо автору
 
 

Если чекбокс отмечен, у меня поле в таблице обновляется.

$one.mod_id - id модуля
<input type="checkbox" value="{$one.mod_id}" name="modules" {if $one.visib == 1} checked {/if}>

И обновление таблицы:

$sql = "UPDATE modules SET visib = 1 WHERE mod_id = " . $_POST['modules'];
        $res = mysql_query($sql);
    if(!$res) exit("Error in $sql: ". mysql_error());

А как сделать наоборот: снимаем чекбокс - таблица еще раз обновляется, только теперь уже visib = 0. Как передать значение, что чекбокс в этот раз не отмечен?

  Ответить  
 
 автор: cheops   (20.09.2009 в 23:48)   письмо автору
 
   для: Лена   (20.09.2009 в 23:34)
 

Чекбокс один или их целая группа и она формируется в цикле? В любом случае нужно искать параметр modules - если он не обнаружен - сбрасывать значение visib в 0.

  Ответить  
 
 автор: Лена   (21.09.2009 в 11:01)   письмо автору
 
   для: cheops   (20.09.2009 в 23:48)
 

Чекбоксы выводятся в цикле(привожу нужный кусок кода):
$mod - ассоциативный массив, данные из базы

<?php
{foreach from=$mod item=one key=keys}
<
tr>
    <
td>{$keys}</td>
    <
td>{$one.mod_name}</td>
    <
td>
    <
input type="checkbox" value="{$one.mod_id}name="modules" 
{if $one.visib == 1checked
{/if}>
</
td>
</
tr>
{/foreach}
?>


И потом по пришествии данных, меняю данные в базе:

<?php
if(isset($_POST['send'])){
//обновляем данные про видимость модулей в таблице модулей
    // Защита 
    
if (!get_magic_quotes_gpc()){
    
$_POST['modules'] = mysql_escape_string($_POST['modules']);
    }
if(
$_POST['modules']){
    
$sql "UPDATE modules SET visib = 1 WHERE mod_id = " $_POST['modules'];
        
$res mysql_query($sql);
    if(!
$res) exit("Error in $sql: "mysql_error());
}else{
//вот здесь нужно поставить условие, если чекбокс не отмечен...
    
$sql "UPDATE modules SET visib = 0 WHERE mod_id = " $_POST['modules'];
        
$res mysql_query($sql);
    if(!
$res) exit("Error in $sql: "mysql_error());
}
//выводим список всех модулей сайта(и подключенных, и неподключенных)
}
?>

  Ответить  
 
 автор: cheops   (21.09.2009 в 12:06)   письмо автору
 
   для: Лена   (21.09.2009 в 11:01)
 

Хм... вот что не понятно: т.е. у вас несколько чекбоксов? И все называются modules? А как вы отличаете их друг от друга?

  Ответить  
 
 автор: Лена   (21.09.2009 в 12:20)   письмо автору
 
   для: cheops   (21.09.2009 в 12:06)
 

Несколько у меня чекбоксов. Ошиблась.
Сделала уже.

<?php
if(isset($_POST['send'])){
//обновляем данные про видимость модулей в таблице модулей
    // Защита от SQL-инъекции
    
if (!get_magic_quotes_gpc()){
    
$_POST['modules'] = mysql_escape_string($_POST['modules']);
    }

    
//обнулить все записи в базе
    //в противном случае $_POST-массив содержит только отмеченные чекбоксы
    
$q "UPDATE modules SET visib = 0";
    
$result mysql_query($q);
    if(!
$result) exit("Error in $sql: "mysql_error());

    
//а потом присвоить значения выбранных
    
foreach ($_POST['modules'] as $item=>$value) {
    
$sql "UPDATE modules SET visib = $value WHERE mod_id =" $item " LIMIT 1";
    echo 
$sql.'<br>';
    
$res mysql_query($sql);
    if(!
$res) exit("Error in $sql: "mysql_error());
}
?>

И шаблон Смарти, если кому-то надо:

<?php
{foreach from=$mod item=one key=keys}
<
tr>
    <
td>{$keys}</td>
    <
td>{$one.mod_name}</td>
    <
td>
<
input type="checkbox" name="modules[{$one.mod_id}]" value="1" {if $one.visib}checked{/if}>
</
td>
</
tr>
{/foreach}
?>

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

<input type="checkbox" value="{$one.mod_id}" name="modules" 
{if $one.visib == 1} checked
{/if}> 


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

Обычно имя чекбокса указывают элементом массива.

Либо с явным индексом
 name="modules[{$one.mod_id}]" 
, при этом значение может быть практически любым.

Либо с подразумеваемым
name="modules[]" 
, передавая при этом ключевую информацию в значении элемента (как у Вас).

  Ответить  
 
 автор: Лена   (21.09.2009 в 14:10)   письмо автору
 
   для: Trianon   (21.09.2009 в 12:27)
 

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

  Ответить  
 
 автор: Trianon   (20.09.2009 в 23:53)   письмо автору
 
   для: Лена   (20.09.2009 в 23:34)
 

$sql = "UPDATE modules SET visib = 0 WHERE mod_id = " . $_POST['modules'];

вот только это неприкрытая ничем SQL-инъекция.

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

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