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

Форум PHP

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

 

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

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

тема: Мультивыбор Select при выборке из БД через цикл

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

 
 автор: sim5   (13.10.2010 в 04:47)   письмо автору
 
   для: allforweb   (12.10.2010 в 22:16)
 

Как же нет проблем, если они у вас уже есть. Даже не совсем понимая, что конкретно вам нужно в результате сравнения, уверенно могу сказать - будь у вас не строка в базе, а числовые значения, это самое сравнение можно было сделать еще в процессе выборки данных из базы.

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

Чтоже вы тут тогда пытались сравнивать:
if ($resnews['category'] == $rescat['id'])
если таблица news содержит строки, а значение категорий это число? ID категории с ID новости? Нет смысла, а строку с числом глупо. И где же удобство и отсутствие проблем? Дело хозяйское, поступайте как знаете, но поступаете вы в корне не верно, таким образом определив основную связь данных.

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

  Ответить  
 
 автор: allforweb   (12.10.2010 в 22:16)   письмо автору
 
   для: sim5   (12.10.2010 в 16:08)
 

Нет, я все равно не пойму. У меня получаются такие же цифры. Я их вывожу без проблем в строку, потом строку в массив. И могу с ними работать. Я просто не могу вывести цикл который бы сравнивал бы не два массива, а массив и массив с вложенным массивом.

  Ответить  
 
 автор: sim5   (12.10.2010 в 16:08)   письмо автору
 
   для: allforweb   (12.10.2010 в 15:48)
 

Вот представьте себе, что вам нужно сделать выборку всех записей, которые принадлежат некоторым категориям. Что вам придется делать? Рыскать по строкам выискивая необходимое - не удобно, затратно, утомительно. А что вы будете делать, если вам придется некоторые темы удалить из категории или перенести ее в другие? Опять рыскать по строкам, сперва выискивая, потом мучительно что-то в строках менять.... Неудобно, затратно, утомительно.
А если будут числа, то просто - SELECT, UDATE, DELETE .... WHERE или еще компактнее.... Быстро, удобно, расслабившись.

Как хотите, но я бы эту тему на вашем месте закрыл, и сначала разобрался бы с базой, изменив принцип хранения (связывания) новостей и категорий, через отдельную таблицу связи. Для этого бы посетил раздел MySQL форума, где подобные вопросы не раз уже рассматривались. Получив там консультацию как лучше поступить в вашем случае, и почему так будет лучше. А внеся изменения в базу, после этого уже думать о выборке для редактирования и, если возникнут вопросы непосредственно РНР, тогда только в этот раздел.

  Ответить  
 
 автор: allforweb   (12.10.2010 в 15:48)   письмо автору
 
   для: sim5   (12.10.2010 в 15:19)
 

Я пока не могу грамотно составить один запрос, но сути все равно не уловил.
Например:
Новость id1 - категория 1,3
Новость id2 - категория 4

Или как еще можно заносить в базу список категорий.
Я так предположил, что массив разбиваю implode а потом строку возвращаю в масстив но уже фугкцией explode. Или это не верный путь?

  Ответить  
 
 автор: sim5   (12.10.2010 в 15:19)   письмо автору
 
   для: allforweb   (12.10.2010 в 15:02)
 

Ну пояснение простое - работать с отдельными числами и удобнее и быстрее, вот и все пояснение. А из этого и выборка, и сортировка будет легче. К тому же, вот у вас выбор:
$rescat = mysql_query("SELECT id, name FROM `category`"); - это категории (числа)
$resnews = mysql_query("SELECT category FROM `news`"); - это темы, вот тут у вас надо полагать и записаны "родители"?
Судя по логике сравнения в цикле, это уже числа, а никак не строка, а если так, то зачем появляется эта строка "1,2,3...", зачем она нужна? Я помню что implode(), но не понимаю для чего?

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

  Ответить  
 
 автор: allforweb   (12.10.2010 в 15:02)   письмо автору
 
   для: sim5   (12.10.2010 в 13:21)
 

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

  Ответить  
 
 автор: sim5   (12.10.2010 в 13:21)   письмо автору
 
   для: allforweb   (12.10.2010 в 12:45)
 

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

  Ответить  
 
 автор: allforweb   (12.10.2010 в 12:45)   письмо автору
 
   для: sim5   (11.10.2010 в 12:43)
 

Все, разобрался с ошибкой, балбес я конечно. Там нужно просто указывать ID новости из которой выбираешь категории.

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

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

  Ответить  
 
 автор: sim5   (11.10.2010 в 12:43)   письмо автору
 
   для: allforweb   (11.10.2010 в 12:16)
 

У вас одна тема может принадлежать нескольким категориям? Если да, то чего же вы хотите, вы же все скопом выводите, сравнивая родителя темы (надо полагать), зачит и получите то, что получаете. Если нет, и темы имеют только одного родителя, то что вы тогда этим пытаетесь получить?

  Ответить  
 
 автор: captain-america   (11.10.2010 в 12:38)   письмо автору
 
   для: allforweb   (11.10.2010 в 12:16)
 

function multicat()
{
$multicat = '';
//Вам надо сначала выбрать все категории, которые принадлежат к новостям и записать это в массив
//делается примерно так
//Делаем запрос
$resnews = mysql_query("SELECT category FROM `news`");
//Обрабатываем результат, записывая его в массив $resnewarr
while ($resrow = @mysql_fetch_assoc($resnews)) {$resnewarr[] = $resrow;}
//Далее делаем запрос по всем категориям
$rescat = mysql_query("SELECT id, name FROM `category`");
while($row = mysql_fetch_assoc($rescat))
{
//Проверяем, содрежится id категории, массиве id категорий-новостей
if(in_array($row['id'],$resnewarr)){
$multicat .='<option value="'. $row['id'] .'" selected>'. $row['name'] .'</option>';
}else{
$multicat .='<option value="'. $row['id'] .'">'. $row['name'] .'</option>';
}
}
return $multicat;
}

//Возможны конечно какие - то ошибки, так как пишу без компилятора))

  Ответить  

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

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

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