[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Select multiple в БД + ООП
Andrew_li
Доброго дня, профи :)

Достался мне самописный сайтик от гуру PHP походу..
Я только начинаю изучать PHP и пока не дошел до ООП.
Стоит задачка его модификации..
Вот пытаюсь реализовать multiple-выбор:
$filter_list = $FILTER->GetList();
$filter_option_list = '<select name="filter_id[]" multiple="multiple">';
foreach($filter_list as $filter_id => $filter_data)
{
if($filter_id == $data['filter_id']) $filter_option_list .= '<option value="'. $filter_id .'" selected="selected">'. $filter_data['name'] .'</option>';
else $filter_option_list .= '<option value="'. $filter_id .'">'. $filter_data['name'] .'</option>';
}
$filter_option_list .= '</select>';

Стоит вопрос как записать выбранные варианты в БД?
Думал через функцию implode(), да вот в БД не записывает..
Обработчик вроде понятный:
if($_POST['back']) header('Location: items.php');
else
{
if($_POST['save'] OR $_POST['apply'])
{
if(isset($_FILES['image'])) $_POST['image'] = $_FILES['image'];
if($ITEM->GetID($_GET['id'], 1))
{
if($ITEM->Update($_GET['id'], $_POST))
{
if($_POST['apply']) header('Location: item_edit.php?id='. $_GET['id']);
if($_POST['save'])
{
if(isset($_SESSION['ITEMS_LAST_PAGE'])) header('Location: '. $_SESSION['ITEMS_LAST_PAGE']);
else header('Location: items.php');
}
exit;
}
}

else
{
$item_id = $ITEM->Add($_POST);
if($item_id)
{
if($_POST['apply']) header('Location: item_edit.php?id='. $item_id);
if($_POST['save']) header('Location: items.php');
exit;
}
}
}
}


Функции тоже читаемые:
function Add($data)
{
$data['category_id'] = intval($data['category_id']);
$data['filter_id'] = intval($data['filter_id']);
$data['sort'] = intval($data['sort']);
$data['name'] = addslashes(trim(htmlspecialchars($data['name'])));
$data['description'] = addslashes(trim(htmlspecialchars($data['description'])));
if(!$data['category_id']) $data['category_id'] = 'NULL';
if($data['name'])
{
$sql = "INSERT INTO `items` (`category_id`, `filter_id`, `name`, `description`, `sort`, `date_create`) VALUES ({$data['category_id']}, '{$data['filter_id']}', '{$data['name']}', '{$data['description']}', '{$data['sort']}');";
$this->DB->sql_query($sql, __FILE__, __LINE__, 'Создание нового элемента');
$item_id = $this->DB->sql_insert_id();
if($item_id)
{
AddStatus('note', 'Запись добавлена.');
return $item_id;
}
else
{
AddStatus('error', 'Не удается добавить запись.');
return FALSE;
}
}

else
{
AddStatus('error', 'Не удается добавить запись. Не заполнено поле "Наименование".');
return FALSE;
}
}


function Update($item_id, $data)
{
$item_id = intval($item_id);
$data['category_id'] = intval($data['category_id']);
$data['filter_id'] = intval($data['filter_id']);
$data['sort'] = intval($data['sort']);
$data['name'] = addslashes(trim(htmlspecialchars($data['name'])));
$data['description'] = addslashes(trim(htmlspecialchars($data['description'])));
if(!$data['category_id']) $data['category_id'] = 'NULL';
$sql = "UPDATE `items` SET `name`='{$data['name']}', `category_id`={$data['category_id']}, `filter_id`='{$data['filter_id']}', `description`='{$data['description']}', `sort`='{$data['sort']}' WHERE `id`={$item_id} LIMIT 1;";
$this->DB->sql_query($sql, __FILE__, __LINE__, 'Обновление элемента');
if($this->DB->sql_affectedrows() !== -1)
{
AddStatus('note', 'Запись сохранена.');
if(!$data['image']['error'])
{
if($this->AddImage($item_id, $data['image'])) AddStatus('note', 'Изображение добавлено.');
else AddStatus('error', 'Не удается добавить изображение.');
}
elseif($data['del_image'])
{
if($this->DeleteImage($item_id)) AddStatus('note', 'Изображение удалено.');
else AddStatus('error', 'Не удается удалить изображение.');
}
return TRUE;
}
else
{
AddStatus('error', 'Не удается сохранить запись.');
return FALSE;
}
}

Не могу понять в чем может быть засада?




Спустя 2 минуты, 12 секунд (18.07.2011 - 10:47) ADiel написал(а):
при чем тут implode? передается массив
$data['category_id']
$data['filter_id']
$data['sort']
$data['name']
$data['description']

Спустя 6 минут, 51 секунда (18.07.2011 - 10:54) Andrew_li написал(а):
Меня интересует $data['filter_id'], сейчас он записывает одно значение, а мне нужно чтобы он записывал id выбранных <option>

Для последующего выбора фильтра.

Спустя 28 минут, 29 секунд (18.07.2011 - 11:23) ADiel написал(а):
нужно создать таблицу для реляционного добавления, либо serialize\unserialize, то ИМХО костыль

Спустя 13 минут, 33 секунды (18.07.2011 - 11:36) Andrew_li написал(а):
А можно немного по подробнее:)
Может, я не понятно изложил суть проблемы..
Нужно реализовать фильтр, например: выбираешь "группа1", а выдается подборка всего именного этой группы1, выбираешь "группа2", и выдается подборка всего, куда входит и некоторая продукция из группы1..
А для этого нужно как-то присвоить "продукту" и "группу1" и "группу2"

А что значит "Костыль" rolleyes.gif

Спустя 28 минут, 17 секунд (18.07.2011 - 12:04) ADiel написал(а):
Это значит, что если у тебя будет один объект привязан к 1000 каталогов, размер ячейки, в который ты будешь писать индексы, будет огромным.

И так. имеем таблицу pages
id, title, text

Имеем таблицу catalogs
id, title

Имеем таблицу pages_catalogs_relation

id, page, catalog

где page - id из записи в таблице pages, catalog - id из записи в таблице catalogs

Спустя 16 минут, 34 секунды (18.07.2011 - 12:21) Andrew_li написал(а):
Понятно, похоже как тут
Спасибо, буду копать в этом направлении

Спустя 42 секунды (18.07.2011 - 12:22) Sanchopansa написал(а):
Я так понял что первая проблема это записать массив значений приходимый от select

у тебя сейчас стоит фильтр:
$data['filter_id'] = intval($data['filter_id']);


попробуй сделать так:
$data['filter_id'] = (array)$data['filter_id'];

и потом просто используй implode
$data['filter_id'] = implode(',',$data['filter_id']);

И не забудь тип поля для хранения значений filter_id перевести в varchar например...
а чтоб ввести нужные страницы в зависимости от выбора сделать можно типа так
SELECT t1.* FROM `tbl1` as t1, `tbl2` as t2 WHERE t1.id IN (t2.filter_id) AND t2.id = 12;

Как-то так наверное...

Спустя 3 минуты, 1 секунда (18.07.2011 - 12:25) ADiel написал(а):

Спустя 1 час, 45 минут, 8 секунд (18.07.2011 - 14:10) Andrew_li написал(а):
Sanchopansa
Все супер получилось smile.gif
Записывает id через запитую smile.gif
А как сделать, чтоб он сохранял выделенные <option>, а то выделяет только один

Спустя 56 минут, 17 секунд (18.07.2011 - 15:06) Andrew_li написал(а):
Сейчас пробую вывести список
 SELECT `items`.* filter`.`name` AS `filter_name` FROM `items` WHERE `filter_id` IN ('{$_POST['filter_id']}')

Выбирает из базы только filter_id = <option value> например = 2
Т.е. он пропускает filter_id где = 2,5,7
Может какое условие написать, подскажите с функцией.

Спустя 1 час, 16 минут, 41 секунда (18.07.2011 - 16:23) Sanchopansa написал(а):
если ты хочешь чтоб при загрузки страницы он брал значения из БД и выделял все эти значения?

если да то тогда нужно делать так...

$filter_id = $row['filter_id'];//получаем из БД сохраненные ранее значения записаные через запятую.. 2,3,4,5
$filter_id = explode(',', $filter_id);//преобразуем в массив
$html = '<select name="filter_id" multiple="multiple">';
foreach($options as $name=>$value)
{
$selected = (in_array($value, $filter_id))?'selected="selected"':'';
$html .= '<option '.$selected.' value="'.$value.'">'.$name.'</option>';
}
$html .= '</select>';
echo $html;

Спустя 22 минуты, 16 секунд (18.07.2011 - 16:45) Andrew_li написал(а):
Sanchopansa

Если не сложно, можешь "перевести" эту строку, смущает ? и : знаки
$selected = (in_array($value, $filter_id))?'selected="selected"':'';

Спустя 15 часов, 28 минут, 6 секунд (19.07.2011 - 08:13) Andrew_li написал(а):
Может кому пригодится, для того чтобы выбрать из колонки вида (2,5,23, и тд)
Мне помог
WHERE `filter_id` LIKE '%{$_POST['filter_id']}%'

Спустя 3 часа, 59 минут, 59 секунд (19.07.2011 - 12:13) Sanchopansa написал(а):
$selected = (in_array($value, $filter_id))?'selected="selected"':'';

это короткая запись оператора IF
Можно его записать так:
if(in_array($value, $filter_id))
{
$selected = 'selected="selected"';
} else {
$selected = '';
}

Спустя 4 часа, 21 минута, 31 секунда (19.07.2011 - 16:35) Andrew_li написал(а):
Sanchopansa
Спасибо, ОГРОМНОЕ :)

Помоги разобраться, куда вставлять этот код? просто там так накручено :blink:
$filter_id = $row['filter_id'];//получаем из БД сохраненные ранее значения записаные через запятую.. 2,3,4,5
$filter_id = explode(',', $filter_id);//преобразуем в массив
$html = '<select name="filter_id" multiple="multiple">';
foreach($options as $name=>$value)
{
$selected = (in_array($value, $filter_id))?'selected="selected"':'';
$html .= '<option '.$selected.' value="'.$value.'">'.$name.'</option>';
}
$html .= '</select>';
echo $html;

Спустя 17 часов, 48 минут, 57 секунд (20.07.2011 - 10:24) Andrew_li написал(а):
Данный код, наверно, мне не поможет, для нормального отображения выбранного фильтра, пришлось в базу записывать значения вида 001,003,013 и т.д.

Так еще если захочешь редактировать(изменить) содержимое "Продукта" (страницы, формат) выбранные категории сбрасываются и в базу ничего не записывается:(

Даже не знаю как придумать unsure.gif

Спустя 23 часа, 37 минут, 45 секунд (21.07.2011 - 10:01) Andrew_li написал(а):
Sanchopansa
СПАСИБО! laugh.gif
Разобрался в твоем коде и применил, все получилось!!!
Главное понять, что делает та или иная функция rolleyes.gif

Спустя 1 день, 7 часов, 16 минут, 7 секунд (22.07.2011 - 17:18) Andrew_li написал(а):
Друзья, дабы не создавать тему, пишу здесь :)
Есть форма
<form id="filter" method="post">
<
table>
<
tr>
<
td align="left" valign="middle"><input type="radio" value="1" name="paty_radio" onclick="HideTip(this)" />Мероприятие</td>
<
td>{$filter_option_list}</td><td rowspan="2"><input type="submit" name="send_filter" value="Фильтровать"></td>
</
tr>
<
tr>
<
td align="left" valign="middle"><input type="radio" value="2" name="paty_radio" onclick="HideTip(this)" />Тип клиента</td>
<
td>{$filter_k_option_list}</td>
</
tr>
</
table>
</
form>

Хочу чтобы после submit`а запоминалось положение padio-кнопок и выбранный <option>
Пытаюсь сделать с помощью $_SESSION
переменные в сессии есть, а как их заставить выделять не могу понять, подскажите.

Спустя 20 минут, 47 секунд (22.07.2011 - 17:38) ADiel написал(а):
Чему людей учите? Жалко смотреть. Потом сами удивляемся, как в реляционных бд записано serialize(array) и почему поля text(2048) и почему большие массивы обрезаются.....

Спустя 2 дня, 14 часов, 46 минут, 13 секунд (25.07.2011 - 08:25) Andrew_li написал(а):
Сам только учусь smile.gif
Вот и пытаюсь вкорячить так чтоб работало.. Так как сайт, который мне достался писался "наркоманом" и понять постоение и логику получается с трудом..
Поэтому и спрашиваю, кто отвечает - ОГРОМНОЕ СПАСИБО!!!
А кто надеется под халтурить, так я сам бы рад оплатить, да нечем..

Спустя 19 минут, 56 секунд (25.07.2011 - 08:44) ADiel написал(а):
Сосетую сделать доп. таблицу для назначения каталогов странице вместо щаписи сериализованного массива в строку.
P.S. Мне тоже попался код алкоголика и наркомана, код понял, но стал странным =)

Спустя 31 минута, 21 секунда (25.07.2011 - 09:16) Andrew_li написал(а):
ADiel Спасибо, думал на эту тему и тут описывали подобное, но пока не получается вкорячить сюда..
Можешь подсказать по на сущему, как при такой записи
<form id="filter" method="post">
<
table>
<
tr>
<
td align="left" valign="middle"><input type="radio" value="1" name="paty_radio" onclick="HideTip(this)" />Мероприятие</td>
<
td>{$filter_option_list}</td><td rowspan="2"><input type="submit" name="send_filter" value="Фильтровать"></td>
</
tr>
<
tr>
<
td align="left" valign="middle"><input type="radio" value="2" name="paty_radio" onclick="HideTip(this)" />Тип клиента</td>
<
td>{$filter_k_option_list}</td>
</
tr>
</
table>
</
form>

Сохранить выбранные варианты после submit`a

Спустя 20 минут, 58 секунд (25.07.2011 - 09:37) ADiel написал(а):
Проверяешь значение $_POST['paty_radio'], в зависимости от значения, пишешь нужные поля. Я с трудом представляю что ты изобразил в последнем посте.

Спустя 9 минут, 22 секунды (25.07.2011 - 09:46) Andrew_li написал(а):
У меня идет проверка..
Если если выбран radio-button Мероприятие И название из <select> и идет запрос в базу, по submit

Так после submit radio-button и <select> сбрасываются, пробовал сессиями, значение в сессии держится, а применить не знаю как..
P.S. код <select>

$FILTER = new Filter($DB);
$filter_list = $FILTER->GetList();
$filter_option_list = '<select id="fil_id" name="filter_id" style="width: 650px"><option value="0">(Не выбрано)</option>';
foreach($filter_list as $filter_id => $filter_data)
{
if($filter_id == $data['filter_id']) $filter_option_list .= '<option value="'. $filter_id .'" selected="selected">'. $filter_data['name'] .'</option>';
else $filter_option_list .= '<option value="'. $filter_id .'">'. $filter_data['name'] .'</option>';
}
$filter_option_list .= '</select>';

Спустя 1 час, 34 минуты, 57 секунд (25.07.2011 - 11:21) ADiel написал(а):
selected="selected" я пишу просто selected
Должно работать.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.