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

Форум PHP

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

 

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

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

тема: Мультивыбор Select при выборке из БД через цикл
 
 автор: allforweb   (11.10.2010 в 00:48)   письмо автору
 
 

Задача такая. Есть меню и в нем список категорий. При редактировании контента категории к которым принадлежит новость должны быть отмечены 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 – т.е. получаются активными. Может в цикле что-то неправильно сделано.

  Ответить  
 
 автор: sim5   (11.10.2010 в 04:44)   письмо автору
 
   для: allforweb   (11.10.2010 в 00:48)
 

Думаете вы неправильно, потому так и выходит. Если вы в цикле будете выводить в браузер "This text", не указывая, что вывод может происходить только по некоторому условию, то вы и получите столько этих сообщений, сколько будет итераций в цикле.

  Ответить  
 
 автор: captain-america   (11.10.2010 в 09:40)   письмо автору
 
   для: allforweb   (11.10.2010 в 00:48)
 

$resnews['category'] и $rescat['id'] - это ваша вся выборка из запроса.
А вам надо сравнивать $row ['id'], вы же определяете $row = mysql_fetch_assoc($rescat),
так же надо сделать и для случая с $resnews

  Ответить  
 
 автор: sim5   (11.10.2010 в 10:15)   письмо автору
 
   для: captain-america   (11.10.2010 в 09:40)
 

И что? Здесь пытаются категории и их содержимое поместить в один список. А надо либо раздельные списки, либо уж если разбивать содержимое в одном списке, группируя их, то для этого есть тег OPTGROUP. А если так хочется в одном списке и то, и другое, да с возможностью выбора, то делать отступы перед текстами опшенов содержимого, а не отмечать опшены, чего и получается у автора.

  Ответить  
 
 автор: TavRoX   (11.10.2010 в 11:14)   письмо автору
 
   для: sim5   (11.10.2010 в 10:15)
 

извеняюся.с функциями некогда непахал
как потом ету функцию вызвать в нужном месте если она в файле функции лежит?
чисто интересно)

  Ответить  
 
 автор: sim5   (11.10.2010 в 11:22)   письмо автору
 
   для: TavRoX   (11.10.2010 в 11:14)
 

Даже не пахали? А стандартые РНР-функции вы как "пашете", вызываете?

  Ответить  
 
 автор: TavRoX   (11.10.2010 в 11:23)   письмо автору
 
   для: sim5   (11.10.2010 в 11:22)
 

ну я незнаю может у функций какойто другой метод вызова
ну я так полагаю что через echo

  Ответить  
 
 автор: sim5   (11.10.2010 в 11:30)   письмо автору
 
   для: TavRoX   (11.10.2010 в 11:23)
 

Даже и затрудняюсь как ответить. Функция вызывается по имени, с передачей аргументов (если имеет), и это вы делали, и не раз, вызывая стандартные функции РНР.
Вы для чего плодите вопросы на форуме с завидным постоянством и массовостью? Может вам лучше сеть за серьезное изучение для начала?

  Ответить  
 
 автор: TavRoX   (11.10.2010 в 11:33)   письмо автору
 
   для: sim5   (11.10.2010 в 11:30)
 

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

  Ответить  
 
 автор: captain-america   (11.10.2010 в 12:25)   письмо автору
 
   для: sim5   (11.10.2010 в 10:15)
 

Я указал на конкретную ошибку в коде, а что он хочет получить в итоге я пока не вдумывался)

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

Спасибо, ошибку понят. Ну вот такой код тоже не сработал:

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']) 
               {
                   $multicat .='<option value="'. $row['id'] .'" selected>'. $row['name'] .'</option>';
                   }

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

  Ответить  
 
 автор: 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;
}

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

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

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

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

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

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

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

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

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

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

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

  Ответить  
 
 автор: 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:48)   письмо автору
 
   для: sim5   (12.10.2010 в 15:19)
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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