[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Мультивыбор Select при выборке из БД через цикл
allforweb
Задача такая. Есть меню и в нем список категорий. При редактировании контента категории к которым принадлежит новость должны быть отмечены selected в списке SELECT, чтобы при редактировании видеть к какой категории принадлежит новость.
Вот код функции, но эта функция почему то делат активными все категории, подскажите где ошибка:

function multicat()
{
$multicat = '';
$rescat = mysql_query("SELECT id, name FROM `category`");
$resnews = mysql_query("SELECT category FROM `news`");
while($row = mysql_fetch_assoc($rescat))
{
if ($resnews['category'] == $rescat['id'])
{
$multicat .='<option value="'. $row['id'] .'" selected>'. $row['name'] .'</option>';
}

else {
$multicat .='<option value="'. $row['id'] .'">'. $row['name'] .'</option>';
}
}

return $multicat;
}


Первая выборка id и название всех категорий из базы выводится в меню SELECT, вторая выборка поле категории из таблицы новости. Также пробовал указывать id новости, но результат тот же. Все категории отмечены selected – т.е. получаются активными. Может в цикле что-то неправильно сделано.




Спустя 14 минут, 46 секунд (11.10.2010 - 00:02) arvitaly написал(а):
Дело в том что переменные $resnews и $rescat содержат в себе либо указатель на ресурс (mysql result) либо false.

И, так как они не являются массивом, то и элемента с ключом category или id у них естественно нет, поэтому

$resnews['category'] есть null

и
$rescat['id'] есть null.

Следовательно условие (null == null) всегда есть истина (печатается с selected).

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

Спустя 46 минут, 3 секунды (11.10.2010 - 00:48) allforweb написал(а):
И как же такая функция пишется?

Спустя 1 час, 32 минуты, 24 секунды (11.10.2010 - 02:21) aH6y написал(а):
замени $rescat['id'];
на $row['id'];

и допиши как тут:
function multicat()
{
$multicat = '';
$rescat = mysql_query("SELECT id, name FROM `category`");
$resnews = mysql_query("SELECT category FROM `news`");
$row2 = mysql_fetch_assoc($resnews);
while($row = mysql_fetch_assoc($rescat))
{
if ($row2['category'] == $row['id']) // так правильно и при каждой новой выборке будет браться новый id
{
$multicat .='<option value="'. $row['id'] .'" selected>'. $row['name'] .'</option>';
}

else {
$multicat .='<option value="'. $row['id'] .'">'. $row['name'] .'</option>';
}
}

return $multicat;
}

Спустя 6 часов, 18 минут, 38 секунд (11.10.2010 - 08:39) linker написал(а):
На самом деле, все это делается так
function multicat()
{
$multicat = '';
$rescat = mysql_query("SELECT (SELECT COUNT(`n`.`category`) FROM `news` AS `n` WHERE `n`.`category` = `c`.`id`) AS `countnews`, "
. "`c`.`id`, `c`.`name` FROM `category` AS `c`");
while($row = mysql_fetch_assoc($rescat))
{
if ($row['countnews']) // так правильно и при каждой новой выборке будет браться новый id
$multicat .='<option value="'. $row['id'] .'" selected>'. $row['name'] .'</option>';
else
$multicat .='<option value="'. $row['id'] .'">'. $row['name'] .'</option>';
}
return $multicat;
}

Спустя 2 часа, 31 минута, 56 секунд (11.10.2010 - 11:11) allforweb написал(а):
Обе функции не сработали. Но ошибку свою понял, не было массивов из которых сравнивать надо. А вторая версия для меня вообще пока темный лес.

Спустя 1 день, 34 минуты, 36 секунд (12.10.2010 - 11:46) allforweb написал(а):
Все, разобрался с ошибкой, балбес я конечно. Там нужно просто указывать ID новости из которой выбираешь категории.

Но вот у меня теперь еще одна проблема выскочила.
Я сделал мультивыбор категорий при добавлении и массив преобразую через impode в строку. Получается 1,2 запись в базу. А как же теперь для редактирования сделать возврат. Мне же нужно получить снова эти строки как массив и уже не просто обрабатывать переменную с номером категории, а обрабатывать вложенный массив.

Например:
Новость ID 1 принадлежит category 1,2 (эту строку же в массив нужно занести и обработка опять не сработает)

Спустя 36 минут, 52 секунды (12.10.2010 - 12:23) linker написал(а):
Для этого создается отдельная таблица, в которой указывается группа отношений ID-категории - ID-новости.

Спустя 3 минуты, 19 секунд (12.10.2010 - 12:26) allforweb написал(а):
Цитата (linker @ 12.10.2010 - 09:23)
Для этого создается отдельная таблица, в которой указывается группа отношений ID-категории - ID-новости.

Это зачем еще делать? У меня в базе такая структура:
ID новости = 1, Категория = 1,2 (если сделан мультивыбор).

Теперь проблема в том, что нужно выбрать эту строку, занести ее в массив (как я думаю) и потом сравнить уже массив.

Спустя 19 минут (12.10.2010 - 12:45) arvitaly написал(а):
Цитата
Теперь проблема в том, что нужно выбрать эту строку, занести ее в массив (как я думаю) и потом сравнить уже массив.


Вот для того, чтобы таких проблем не было (да и еще по десятку причин) - нужно сделать так как сказал linker. Это называется нормализация БД.

Спустя 37 минут, 41 секунда (12.10.2010 - 13:23) allforweb написал(а):
Да ну, зачем городить огород?
Если в поле две категории 1,2 то нужно просто сделать из этой строки массив и потом каждый элемент полученного массива сравнить со списком категорий и там где они совпадут сделать активными через selected или я не прав?
Можно это сделать через функцию explode?

Спустя 8 минут, 25 секунд (12.10.2010 - 13:31) arvitaly написал(а):
Цитата
Да ну, зачем городить огород?


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

Спустя 27 минут, 44 секунды (12.10.2010 - 13:59) linker написал(а):
Цитата
Да ну, зачем городить огород?


Вот ты и мучаешься с плевым делом, потому что не хочешь "городить огород".

Спустя 5 минут, 10 секунд (12.10.2010 - 14:04) allforweb написал(а):
Цитата (linker @ 12.10.2010 - 10:59)
Цитата
Да ну, зачем городить огород?


Вот ты и мучаешься с плевым делом, потому что не хочешь "городить огород".

А можно пояснить почему? На некоторых движках так делается.

Спустя 10 минут, 15 секунд (12.10.2010 - 14:14) aH6y написал(а):
думаю, что еще одна таблица - найболее рациональное решение.

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

Спустя 9 минут, 14 секунд (12.10.2010 - 14:24) linker написал(а):
allforweb
Те движки, в которых так делается пишутся говнокодерами.

С таблицей отношений все данные можно вытянуть одним запросом и без последующих танцев с бубном. Так элементарно одним запросом происходит: добавление новости в категорию, удаление новости из категории или смена одной из категории.

Спустя 22 минуты (12.10.2010 - 14:46) allforweb написал(а):
Цитата (linker @ 12.10.2010 - 11:24)
allforweb
Те движки, в которых так делается пишутся говнокодерами.

С таблицей отношений все данные можно вытянуть одним запросом и без последующих танцев с бубном. Так элементарно одним запросом происходит: добавление новости в категорию, удаление новости из категории или смена одной из категории.

Ну на счет говнокодеров не совсем согласен, но все же. В чем разница будет с дополнительной таблицей? Разве в нее не также будут вноситься категории?
Например:
Новость id1 - категории 1,3
Новость id2 - категория 4

Спустя 18 часов, 3 минуты, 10 секунд (13.10.2010 - 08:49) linker написал(а):
Потому что тебе придется танцевать со своим парсером значений аля 1,2,4,10 и при каждом чихе то разбирать данные, то собирать обратно и не дай бог где ошибка. А уж получить названия категорий из этой ботвы вообще не реально одним запросом.
Быстрый ответ:

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