|
|
|
| Задача такая. Есть меню и в нем список категорий. При редактировании контента категории к которым принадлежит новость должны быть отмечены 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 – т.е. получаются активными. Может в цикле что-то неправильно сделано. | |
|
|
|
|
|
|
|
для: allforweb
(11.10.2010 в 00:48)
| | Думаете вы неправильно, потому так и выходит. Если вы в цикле будете выводить в браузер "This text", не указывая, что вывод может происходить только по некоторому условию, то вы и получите столько этих сообщений, сколько будет итераций в цикле. | |
|
|
|
|
|
|
|
для: allforweb
(11.10.2010 в 00:48)
| | $resnews['category'] и $rescat['id'] - это ваша вся выборка из запроса.
А вам надо сравнивать $row ['id'], вы же определяете $row = mysql_fetch_assoc($rescat),
так же надо сделать и для случая с $resnews | |
|
|
|
|
|
|
|
для: captain-america
(11.10.2010 в 09:40)
| | И что? Здесь пытаются категории и их содержимое поместить в один список. А надо либо раздельные списки, либо уж если разбивать содержимое в одном списке, группируя их, то для этого есть тег OPTGROUP. А если так хочется в одном списке и то, и другое, да с возможностью выбора, то делать отступы перед текстами опшенов содержимого, а не отмечать опшены, чего и получается у автора. | |
|
|
|
|
|
|
|
для: sim5
(11.10.2010 в 10:15)
| | извеняюся.с функциями некогда непахал
как потом ету функцию вызвать в нужном месте если она в файле функции лежит?
чисто интересно) | |
|
|
|
|
|
|
|
для: TavRoX
(11.10.2010 в 11:14)
| | Даже не пахали? А стандартые РНР-функции вы как "пашете", вызываете? | |
|
|
|
|
|
|
|
для: sim5
(11.10.2010 в 11:22)
| | ну я незнаю может у функций какойто другой метод вызова
ну я так полагаю что через echo | |
|
|
|
|
|
|
|
для: TavRoX
(11.10.2010 в 11:23)
| | Даже и затрудняюсь как ответить. Функция вызывается по имени, с передачей аргументов (если имеет), и это вы делали, и не раз, вызывая стандартные функции РНР.
Вы для чего плодите вопросы на форуме с завидным постоянством и массовостью? Может вам лучше сеть за серьезное изучение для начала? | |
|
|
|
|
|
|
|
для: sim5
(11.10.2010 в 11:30)
| | да вот щас время освободится начну изучать с самого начала чтобы вспомнить что забыл, и чтобы выучить то что незнал или непонял.
но вообщем я понял как вызывать. небудем тему засорять. потом погляжу в книжке какойнибудь | |
|
|
|
|
|
|
|
для: sim5
(11.10.2010 в 10:15)
| | Я указал на конкретную ошибку в коде, а что он хочет получить в итоге я пока не вдумывался) | |
|
|
|
|
|
|
|
для: 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;
}
|
| |
|
|
|
|
|
|
|
для: 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;
}
//Возможны конечно какие - то ошибки, так как пишу без компилятора)) | |
|
|
|
|
|
|
|
для: allforweb
(11.10.2010 в 12:16)
| | У вас одна тема может принадлежать нескольким категориям? Если да, то чего же вы хотите, вы же все скопом выводите, сравнивая родителя темы (надо полагать), зачит и получите то, что получаете. Если нет, и темы имеют только одного родителя, то что вы тогда этим пытаетесь получить? | |
|
|
|
|
|
|
|
для: sim5
(11.10.2010 в 12:43)
| | Все, разобрался с ошибкой, балбес я конечно. Там нужно просто указывать ID новости из которой выбираешь категории.
Но вот у меня теперь еще одна проблема выскочила.
Я сделал мультивыбор категорий при добавлении и массив преобразую через impode в строку. Получается 1,2 запись в базу. А как же теперь для редактирования сделать возврат. Мне же нужно получить снова эти строки как массив и уже не просто обрабатывать переменную с номером категории, а обрабатывать вложенный массив.
Например:
Новость ID 1 принадлежит category 1,2 (эту строку же в массив нужно занести и обработка опять не сработает) | |
|
|
|
|
|
|
|
для: allforweb
(12.10.2010 в 12:45)
| | Если я вас правильно понял, то родители (id), которым принадлежат темы, это не число в базе, а строка через запятую? Если так, то лучше сразу отказаться от этого, и проблем не будет. | |
|
|
|
|
|
|
|
для: sim5
(12.10.2010 в 13:21)
| | А можно пояснить почему? На некоторых движках так делается. И какая лучшая альтернатива? | |
|
|
|
|
|
|
|
для: 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(), но не понимаю для чего?
Кстати, лучше выбирать одним запросом категории и темы ей принадлежащие, нежели делать два раздельных запроса. | |
|
|
|
|
|
|
|
для: sim5
(12.10.2010 в 15:19)
| | Я пока не могу грамотно составить один запрос, но сути все равно не уловил.
Например:
Новость id1 - категория 1,3
Новость id2 - категория 4
Или как еще можно заносить в базу список категорий.
Я так предположил, что массив разбиваю implode а потом строку возвращаю в масстив но уже фугкцией explode. Или это не верный путь? | |
|
|
|
|
|
|
|
для: allforweb
(12.10.2010 в 15:48)
| | Вот представьте себе, что вам нужно сделать выборку всех записей, которые принадлежат некоторым категориям. Что вам придется делать? Рыскать по строкам выискивая необходимое - не удобно, затратно, утомительно. А что вы будете делать, если вам придется некоторые темы удалить из категории или перенести ее в другие? Опять рыскать по строкам, сперва выискивая, потом мучительно что-то в строках менять.... Неудобно, затратно, утомительно.
А если будут числа, то просто - SELECT, UDATE, DELETE .... WHERE или еще компактнее.... Быстро, удобно, расслабившись.
Как хотите, но я бы эту тему на вашем месте закрыл, и сначала разобрался бы с базой, изменив принцип хранения (связывания) новостей и категорий, через отдельную таблицу связи. Для этого бы посетил раздел MySQL форума, где подобные вопросы не раз уже рассматривались. Получив там консультацию как лучше поступить в вашем случае, и почему так будет лучше. А внеся изменения в базу, после этого уже думать о выборке для редактирования и, если возникнут вопросы непосредственно РНР, тогда только в этот раздел. | |
|
|
|
|
|
|
|
для: sim5
(12.10.2010 в 16:08)
| | Нет, я все равно не пойму. У меня получаются такие же цифры. Я их вывожу без проблем в строку, потом строку в массив. И могу с ними работать. Я просто не могу вывести цикл который бы сравнивал бы не два массива, а массив и массив с вложенным массивом. | |
|
|
|
|
|
|
|
для: allforweb
(12.10.2010 в 22:16)
| | Как же нет проблем, если они у вас уже есть. Даже не совсем понимая, что конкретно вам нужно в результате сравнения, уверенно могу сказать - будь у вас не строка в базе, а числовые значения, это самое сравнение можно было сделать еще в процессе выборки данных из базы.
Можно держать в базе строку значений через запятую, конечно, нет проблем получения такой строки из базы и из нее массива, и вывода его. Но такое хранение может быть оправдано для данных, которые никак не являются определяющими в таких операциях с базой как выборка, обновление, удаление. А вы взяли и саму сердцевину, то что определяет связи между объектами, впихнули в строку, и маяться от такого решения вы еще будете, и не раз, это гарантированно, и лишняя неоправданная нагрузка на базу в запросах вам обеспечена.
Чтоже вы тут тогда пытались сравнивать:
if ($resnews['category'] == $rescat['id'])
| если таблица news содержит строки, а значение категорий это число? ID категории с ID новости? Нет смысла, а строку с числом глупо. И где же удобство и отсутствие проблем? Дело хозяйское, поступайте как знаете, но поступаете вы в корне не верно, таким образом определив основную связь данных.
Понятие сравнить массивы несколько "резиновое", нужно не так вопрос задавать, а что вы хотите получить (знать) в результате сравнения. А вообще сравнивать массивы удобно функциями пересечения массивов. | |
|
|
|