Логика отправки чекбоксов

diverck

Новичок
Логика отправки чекбоксов

Добрый вечер, столкнулся со следующим вопросом (я новичек):
Как правельно отправить данные с формы а именно с блока чекбоксов в БД. Конкретно запутался в следующем: если человек выбирает несколько чек боксов в строке как их поместить в одно поле БД.
С одной переменной все понятно, но вот чуть дальше запутался,... перед тем как сюда писать дня три переделывал различные варианты, перерыл интернет (это первая самостоятельная форма).
Подскажите плиз логику.
Сразу обозначу пример:
Блок чекбоксов - выберете связь с юзерами
- чат
- форма обратной связи
- форум

При выборе 2-х переменных из трех что делать?, Я предположил (это последний вариант на чем остановился пока) что можно все записывать в свое поле предназначенное под каждую переменную в отдельной таблице, то есть форум, чат, форма связи, а далее брать массивом и уже его записывать в таблицу (в ячейку) с полем "выберете связь с юзерами"

Скорее всего есть способы проще....?
За рание благодарен
 

diverck

Новичок
то есть если ничего не выбрано нужно писать что в поле помещается 0 или false?, то есть "пустую" переменную не удалять?

грубо говоря все поля чемто заполнены, тк я делаю проверку $_POST естьли переменная или нет и если есть то что с ней или как делать подскажите??
 

freeek

Новичок
немного не до конца понял суть вопроса
но тут несколько моментов, на мой взгляд

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

например, так:

PHP:
<input type=checkbox name=somename[chat]  /><br />
<input type=checkbox name=somename[form]  /><br />
<input type=checkbox name=somename[forum]  />
соответсвенно обратиться, в случае присвоения значения, к чекбоксу можно через массив $_POST['somename']

далее, плодить 156 таблиц БД необходимости никакой нет, это пока у нас 3 поля формы, а вдруг они вырастут до 23, это будет "полный пизнес"(с)

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

для этого например может существовать некая таблица связей, допустим с полями

user_id, relation, activ

user_id и activ числа
relation строка, или опять же возможно число, в зависмости от реализации и т.д. и т.п.

user_id, relation, activ все три использовать как primary key



ну вот где то так, сухо, насколько понял вопрос
 

Sigorma

Новичок
для хранения "нескольких переменных" можно использовать:
1. serialize в одно поле
2. в отдельных филдах таблицы
3. в отдельной таблице со связкой по id
 

dimagolov

Новичок
Sigorma, 1-е новичкам советовать нельзя да и вообще, крайне редкий случай, чтобы его на 1-е место ставить. лучше его выкинуть и вместо 3-го пункта написать "а можно иногда и по-другому, но редко".

атомарность, однако.
 

diverck

Новичок
Посмотрите плиз пример, вот форма:

<p>Маркентинговые инструменты: *<br>
<input type=checkbox name='market_golos'>Голосование<br>
<input type=checkbox name='market_statistic'>Система сбора и обработки статистики посещаемости<br>
<input type=checkbox name='market_banner'>Внутренняя баннерная система<br>
</p>

<p>Дополнительные работы:<br>
<input type=checkbox name='dop_usabillity'>Проектирование интерфейса (Usabillity)<br>
<input type=checkbox name='dop_zapolnenie'>Первоначальное заполнение сайта Исполнителем<br>
<input type=checkbox name='dop_textformat'>Корректировка после заполнений сайта Заказчиком<br>
<input type=checkbox name='dop_domen'>Подбор и регистрация доменного имени<br>
<input type=checkbox name='dop_subdomen'>Размещение сайта на сервере Исполнителя<br>
</p>

Вот эта вещ обрабатывает эти переменные:

//Четвертый блок чекбоксов
if (isset($_POST['market_golos'])){$market_golos = $_POST['market_golos']; } else {unset($market_golos);}
if ($market_golos == true) {$market_golos = "Голосование"; echo $market_golos;}

if (isset($_POST['market_statistic'])){$market_statistic = $_POST['market_statistic']; } else {unset($market_statistic);}
if ($market_statistic == true) {$market_statistic = "Статистика"; echo $market_statistic;}

if (isset($_POST['market_banner'])){$market_banner = $_POST['market_banner']; } else {unset($market_banner);}
if ($market_banner == true) {$market_banner = "Баннерная крутилка"; echo $market_banner;}

//Пятый блок чекбоксов

if (isset($_POST['dop_usabillity'])){$dop_usabillity = $_POST['dop_usabillity']; } else {unset($dop_usabillity);}
if ($dop_usabillity == true) {$dop_usabillity = "Юзабилити"; echo $dop_usabillity;}

if (isset($_POST['dop_zapolnenie'])){$dop_zapolnenie = $_POST['dop_zapolnenie']; } else {unset($dop_zapolnenie);}
if ($dop_zapolnenie == true) {$dop_zapolnenie = "Наполнение сайта"; echo $dop_zapolnenie;}

if (isset($_POST['dop_textformat'])){$dop_textformat = $_POST['dop_textformat']; } else {unset($dop_textformat);}
if ($dop_textformat == true) {$dop_textformat = "Корректировка текста"; echo $dop_textformat;}

if (isset($_POST['dop_domen'])){$dop_domen = $_POST['dop_domen']; } else {unset($dop_domen);}
if ($dop_domen == true) {$dop_domen = "Регистрация домена"; echo $dop_domen;}

if (isset($_POST['dop_subdomen'])){$dop_subdomen = $_POST['dop_subdomen']; } else {unset($dop_subdomen);}
if ($dop_subdomen == true) {$dop_subdomen = "Размещение на субдомене"; echo $dop_subdomen;}

Только теперь как я понимаю нужно написать вместо echo $dop_subdomen; INSERT INTO проста вставаить в таблицу если есть?

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

Yaponchick

Новичок
Убил, увидев код формы, я вспомнил это зло, её до сих пор ещё друг у друга воруют ;)

По теме: унифицируй чекбоксы и сделай "3. в отдельной таблице со связкой по id"
Гемороя будет в сто раз меньше.
 

Sigorma

Новичок
diverck
я бы посоветовал только
PHP:
<input type=hidden name='__NAME__' value='0'>
<input type=checkbox name='__NAME__' value='1'>
имена чекбоксам можно давать вида
service['имя_услуги']
после субмита формы
PHP:
print_r($_POST['service']);
MySQL 5.1 insert multiple rows
либо пробегаемся по массиву service и формируем список инсерт запросов
 

diverck

Новичок
Ребята, написал вот так вот -- http://studio.newstream.ru/1.rtf пременные вообще не попада.ют в таблицу..... почему такое может быть????
 

diverck

Новичок
Все перепроверил, начало записываться в БД, сейчас переделываю в соответствии с вашими рекомендациями, все получаеться но вот когда дохожу до чек боксов то в таблицу выводиться первый или последний ключ чекбокса. Хотя если написать просто echo то на странице выводиться все выбранные пункты. Подскажите как записать все выбранное в одну строку и закинуть в таблицу.

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

<? include('blocks/bd.php')?>

<form action='array.php' method='POST'>
<p>Укажите сферу деятельности компании: *<br>
<input type='text' name='sfera'>
<p>
<p>Тип сайта: бизнес-сайт, интернет-магазин: *<br>
<input type=hidden name='type_site[]' value='0'>
<input type=radio name='type_site[]' value='1'>Визитка<br>
<input type=hidden name='type_site[]' value='0'>
<input type=radio name='type_site[]' value='1'>Интернет магазин<br>
</p>
<p>Инструменты для предоставления информации: *<br>
<input type=hidden name=tools['news'] value=0>
<input type=checkbox name=tools['news'] value="1">Новости<br>
<input type=hidden name=tools['catalog'] value="0">
<input type=checkbox name=tools['catalog'] value="1">Каталог продукции или услуг<br>
<input type=hidden name=tools['galery'] value="0">
<input type=checkbox name=tools['galery'] value="1">Фотогалерея<br>
<input type=hidden name=tools['faq'] value="0">
<input type=checkbox name=tools['faq'] value="1">Часто задаваемые вопросы<br>
<input type=hidden name=tools['search'] value="0">
<input type=checkbox name=tools['search'] value="1 ">Поиск по сайту<br>
</p>
<p>
<input type="submit" name="go" value="Расчитать стоимость">
</p>
</form>

<?
if (isset($_POST['go']))
{
if (isset($_POST['sfera']))
{
$sfera = $_POST['sfera'];
}
else
{
unset($sfera);
}
foreach ($_POST['type_site'] as $names=>$values)
{
if ($values)
{
$type_site = $names;
}
}
if ($type_site == 1)
{
$type_site = "Сайт визитка";
}
if ($type_site == 2)
{
$type_site = "Интернет магазин";
}
foreach ($_POST['tools'] as $name=>$value)
{
if ($value)
{
$tools = $name;
echo $tools; // Вот тут все выводиться как надо, нопри INSERT захватывает только последнее значение

/*Тут мои искания
$rez = mysql_fetch_array($tools);
do
{
echo $tools;
}
while ($rez = mysql_fetch_array($tools));
*/

/*Искания номер 2, также без результата
function tools($a){
do
{
echo $a;
}
while ($a > 1);
}
tools($tools);*/
}
}
if ($sfera or $type_site or $tools){
$myrows = mysql_query("INSERT INTO forma (type_site, sfera, tools) VALUES ('$type_site', '$sfera', '$tools')", $db);
}

}
?>

-~{}~ 05.02.10 00:54:

Переписал чтобы значения массива захватывались строкой:
foreach ($_POST['tools'] as $name=>$value)
{
if ($value)
{
$tools = $name;
$s_arr = serialize($tools);
}
}
if ($sfera or $type_site or $tools){
$myrows = mysql_query("INSERT INTO forma (type_site, sfera, tools) VALUES ('$type_site', '$sfera', '$s_arr')", $db);


Опять таже беда, записывает только последний ключ чекбокса?? ((((((((( Как же сделоть то??(((((
 

freeek

Новичок
Автор оригинала: Pestilence
Убил, увидев код формы, я вспомнил это зло, её до сих пор ещё друг у друга воруют ;)

По теме: унифицируй чекбоксы и сделай "3. в отдельной таблице со связкой по id"
Гемороя будет в сто раз меньше.
зависит от кол-ва самих чекбоксов

если все представить в виде is/was то в случае если их много в то же цикле пройтись и проверить, измеилосьли значение или нет

если их мало, то возможен вариант описанный мной выше

нет значения - удаляем из базы
есть апдейтим

______________________-

не осилил все прочитать,
подозреваю проблема в type_site[]

указывай имена явно
 

Sigorma

Новичок
to diverck
у тебя явные пробелы в html, стоит немного почитать про синтаксис форм.
конкретнее:
PHP:
<input type=hidden name='type_site[]' value='0'>
<input type=radio name='type_site[]' value='1'>Визитка<br>
<input type=hidden name='type_site[]' value='0'>
<input type=radio name='type_site[]' value='1'>Интернет магазин<br>
заменяется на:
PHP:
<input type=radio name='tools[type_site]' value='1' CHECKED>Визитка<br>
<input type=radio name='tools[type_site]' value='2'>Интернет магазин<br>
для радио кнопок нет необходимости иметь "дублирующие" хидден инпуты, дефолтным значением уже будет пункт отмеченный опцией "CHECKED"

-~{}~ 05.02.10 10:22:

субмит формы:
PHP:
<?php
if($_SERVER['REQUEST_METHOD'] == "POST")
{
	$sqlSt = Array();
	
	foreach($_POST['tools'] as $key => $value)
	{
		$sqlSt[] = "`".$key."`='".$value."'";
	}
	
	$sql = "INSERT INTO `__TABLE__` SET ".join(", ", $sqlSt).";";
}
?>
 

Sigorma

Новичок
dimagolov
Я знал что обязательно кто то вылезет с этой ссылкой, этого просто не могло быть иначе. Да, валидацию я тут опустил сознательно с целью максимум упростить код ибо думаю даже этот кусок кода будет сложно понять ТСу. Кстати ты как человек с таким огромным количеством постов и думаю огромным опытом понимаешь что тут не идет никакой речи о БД, весь скрипт заканчивается формированием переменной $sql (значение этой переменной как мы видим нигде не используется), а это еще далеко не запись в бд где нужно было бы как минимум проверить типы параметров, количество параметров все это заэкранировать и записать в БД.
 

dimagolov

Новичок
весь скрипт заканчивается формированием переменной $sql (значение этой переменной как мы видим нигде не используется), а это еще далеко не запись в бд где нужно было бы как минимум проверить типы параметров, количество параметров все это заэкранировать и записать в БД.
с такими мыслями тебе перечитывать ссылку до полного просветления.
ты переменную создаешь для чего? для исполнения запроса к БД или для ее созерцания как образца иероглифической каллиграфии?
 

Sigorma

Новичок
dimagolov
переменную я создаю с целью собрать массив полученный из формы в строку, без потери элементов (в чем собственно проблема у ТС). Как и куда будет использоваться переменная sql это уже второй вопрос который я вообще не затрагивал.
Можешь считать что приведенный кусок кода создает переменную только для "образца иероглифической каллиграфии".
Собственно как и твой пост рассматриваю как пост каунт и не более.
 

diverck

Новичок
$sqlSt[] = "`".$key."`='".$value."'";

Все равно попадаеТ В бд последнее значение выбранного чекбокса..
 

Sigorma

Новичок
diverck
исправленную форму покажи, по максимум сократив лишнее.
 
Сверху