Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2010, 10:49   #11
Nikolai_
Пользователь
 
Регистрация: 27.08.2010
Сообщений: 16
По умолчанию

Спасибо, Andkorol, всё доступно объяснили. А что насчет кода для вставки категогорий, который я через сообщение выше привел? Пойдет ли? Или можно было проще сделать?
Nikolai_ вне форума Ответить с цитированием
Старый 16.11.2010, 11:05   #12
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Ну - я не люблю повторов кода,потому формирование строки запроса я бы сделал через цикл(там где у вас отдельно проверяется каждый элемент массива $category).
примерно так:
PHP код:
$count_category count($category);
if(
$count_category 0)
{
    
$query_2 "INSERT INTO `article_categories` (`article_id`, `category_id`) VALUES ";
    for(
$i 0$i $count_category$i++){
        
$query_2 .= "('$article_id', '$category[$i]')";
        if(
$i != ($count_category 1)){
            
$query_2 .= ', ';  // если это не последний элемент массива
        
}
    }
    
mysql_query($query_2);

Ну а перед этим - проверить сам массив,чтобы небыло пустых значений.
Преимущество - независимость от количества категорий для одной статьи(когда-нибудь их вполне может оказаться больше 5-ти).
"Гибкость и масштабируемость" - помните..?

PS: чуть поправил код - теперь запрос формируется и выполняется,только если есть что добавлять в БД - что логично. :-)

Последний раз редактировалось Andkorol; 16.11.2010 в 11:15. Причина: Change query
Andkorol вне форума Ответить с цитированием
Старый 16.11.2010, 17:13   #13
Nikolai_
Пользователь
 
Регистрация: 27.08.2010
Сообщений: 16
По умолчанию

Спасибо за пример, Andkorol! Вставил его в свое приложение, только добавил перед ним строку $id_article = mysql_insert_id();

Ну, эта часть задачи решена. Теперь думал над тем как:
1) выводить категории к конкретной статье для редактирования,
2) перезаписывать список категорий конкретного топонима.
Придумал только вот что (см. ниже). Прошу оценить – нормальное ли решение или его можно как-то упростить?
И еще – 3) нужно ли создавать поле id(auto_increment) в таблице articles_categories (куда будут записываться id статей и категорий)?

Вот что придумал - оцените.

Вывод статьи и ее категорий для редактирования:
PHP код:
 // вывод в форму для редактирования названия статьи, текста, автора
$query mysql_query("SELECT * FROM articles WHERE id_article='$id_article';");
while(
$q mysql_fetch_array($query)){
    
// поля "Название", "Текст", "Автор" формы для редактирования
}

// вывод в форму для редактирования id категорий через запятую
$query_2 mysql_query("SELECT id_category FROM articles_categories WHERE id_article='id_article';");
$array = array();
while(
$q mysql_fetch_array($query_2)){
    
$array[] = $q['id_category'];
}
sort($array);
$category implode(","$array);
echo 
"<input type=\"text\" name=\"category\" value=\"".$category."\">"// поле "Категории" формы для редактирования 
обновление статьи и ее категорий
PHP код:
// обновление названия, текста и автора статьи
mysql_query("UPDATE articles SET name='$name', text='$text', author='$author' WHERE id_article='$id_article';");

// удаление старых категорий статьи
mysql_query("DELETE FROM articles_categories WHERE id_article='$id_article';");

// запись новых категорий статьи
$category explode(","$category);
$count_category count($category);
if(
$count_category 0){
    
$query_2 "INSERT INTO `articles_categories` VALUES ";
    for(
$i 0$i $count_category$i++){
        
$query_2 .= "('$id_article', '$category[$i]')";
        if(
$i != ($count_category 1)){
            
$query_2 .= ', ';
        } 
// если это не последний элемент массива
    
}
    
mysql_query($query_2); // вставка в табл. категорий


Последний раз редактировалось Nikolai_; 16.11.2010 в 17:55.
Nikolai_ вне форума Ответить с цитированием
Старый 16.11.2010, 23:28   #14
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Вот что придумал - оцените.
Честно скажу - такого решения я не ожидал....

Я имею ввиду то, как вы вообще себе представляете ваш процесс присваивания/редактирования/удаления категорий....

Вот вы сами подумайте - у вас более 100 различных категорий статей.
Ваше решение состоит в том,чтобы просто вывести в текстовом поле строкой ID категорий к конкретной статье,типа вот так:
2,3,5,87,56,47
и прямо в этом поле добавить/заменить/удалить нужные ID ...

Я может чего-то и не понимаю до конца,но - вы что,на память помните,какой ID к какой категории относится???
И,если вы делаете проект на заказ - Заказчик тоже должен наизусть это знать,или с листика читать?

Когда я говорил об удобстве редактирования категорий к статьям - я имел ввиду удобный интерфейс для этого.
А именно,на странице редактирования статей:
1.Выбираем запросом из БД все категории,относящиеся к данной статье.
2.Выбираем из БД массив-список всех имеющихся разновидностей категорий.
3.Соответственно количеству присвоенных категорий - делаем столько же списков(select-ов),в каждом из которых должна быть отмечена атрибутом SELECTED уже выбранная очередная категория для этой статьи.Также делаем для каждой имеющейся категории поле типа HIDDEN, в которое прописываем текущий ID категории - потом понадобится для сравнения.
Select-ы должны иметь также в списке значение для удаления - чтобы можно было просто удалить ненужные категории(также можно удаление реализовать при помощи checkbox-ов).
4.Дополнительно,при помощи JavaScript делаем возможность добавлять дополнительные списки(select-ы) - чтобы добавлять новые категории.
5.Изменяем/добавляем новые категории для статьи(или помечаем "удалить").
6.Сабмит формы.

Обработчик формы должен:
1.Получить данные из select-ов.
2.Сверить эти данные с соответствующими значениями HIDDEN-полей.
3.Если данные в каких-либо полях изменились - заменить в БД значения только для этих полей:
Цитата:
UPDATE `article_categories` SET `category_id` = '$new_category_id'
WHERE `article_id` = '$article_id' AND `category_id` = '$old_category_id'
4.Если нужно - удалить ненужные записи(имеющие значение для удаления(п.3)).

Вот примерно так должно быть - наглядно,удобно,опять же независимо от кол-ва категорий,и никаких лишних действий.
Andkorol вне форума Ответить с цитированием
Старый 17.11.2010, 10:04   #15
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Поздравляю!
Вы написали очень хороший здоровый программный код, вместо, того что бы просто использовать тип поля ENUM.
Очередная починка электроники при помощи топора.
Виталий Желтяков вне форума Ответить с цитированием
Старый 17.11.2010, 10:18   #16
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Виталий Желтяков Посмотреть сообщение
Поздравляю!
Вы написали очень хороший здоровый программный код, вместо, того что бы просто использовать тип поля ENUM.
Очередная починка электроники при помощи топора.
Вам известно значение слова "флуд"?

На ваше предложение насчёт ENUM достаточно веско(хоть и вопросом) ответили здесь.

PS : обратите внимание на первый пост:
Цитата:
Всего же типов категорий более 100.
Вы предлагаете для каждой статьи создавать несколько полей ENUM ,каждое из которых будет содержать более 100 вариантов значений...????
Браво - это просто супер решение!!!

Вдогонку вам вопрос - что делать пользователю,если количество категорий изменится(увеличится/уменьшится)?
Лезть в Базу и править структуру таблицы,добавляя значения в ENUM???

Последний раз редактировалось Andkorol; 17.11.2010 в 10:33. Причина: PS
Andkorol вне форума Ответить с цитированием
Старый 17.11.2010, 13:27   #17
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Цитата:
Вам известно значение слова "флуд"?
А вам известно слово "быдлокодерство"?
Цитата:
Вы предлагаете для каждой статьи создавать несколько полей ENUM ,каждое из которых будет содержать более 100 вариантов значений...????
Да, предлагаю.
Цитата:
Вдогонку вам вопрос - что делать пользователю,если количество категорий изменится(увеличится/уменьшится)?
Лезть в Базу и править структуру таблицы,добавляя значения в ENUM???
Написать системную функцию которая меняла бы структуру.

В чем преимущество использования ENUM:
- Значительно меньше кода,
- Надо делать 1 простой запрос (!),
- Никаких проблем с select-ми на форме;
- Использование статической таблицы вместо динамической (!).

По поводу предыдущего варианта:
Вдогонку вам вопрос - что делать пользователю,если количество статей дойдёт до нескольких тысяч? Ждать несколько секунд пока сформируется страница?
Виталий Желтяков вне форума Ответить с цитированием
Старый 17.11.2010, 13:41   #18
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

Код:
Вдогонку вам вопрос - что делать пользователю,если количество статей дойдёт до нескольких тысяч? Ждать несколько секунд пока сформируется страница?
Вы издеваетесь ? ) Сервер же не на пеньке 133-ем стоит.

Цитата:
В чем преимущество использования ENUM:
В чем преимущество использования ENUM:
- Значительно меньше кода,
Для вас то количестве кода что привел Androkol - это много ?!
Цитата:
- Надо делать 1 простой запрос (!),
Который будет дольше выполнятся

Цитата:
- Использование статической таблицы вместо динамической (!).
Поясните пожалуйста , что для вас статическая и динамическая таблица ?

P.S. Все программисты с которыми я когда либо общался решают проблему связей "много к много" способом который описал Androkol
ssdm вне форума Ответить с цитированием
Старый 17.11.2010, 14:03   #19
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Цитата:
Вы издеваетесь ? ) Сервер же не на пеньке 133-ем стоит.
Лично Я видал и такие серваки в крупных компаниях.
А вот Вы, ssdm, занаете что такое пиковая нагрузка?
Цитата:
Для вас то количестве кода что привел Androkol - это много ?!
А это не весь код. Под капотом много поддерживающего кода (например, вывод select в форме).
Цитата:
Который будет дольше выполнятся
Вы не правы, запрос с ENUM будет выполняться значительно быстрее, даже если будет сотня полей. Можете проверить на xdebug. Тут что самое главное, что запрос 1.
Цитата:
Поясните пожалуйста , что для вас статическая и динамическая таблица ?
Почитайте документацию по MySQL.
Таблица, в которой все поля фиксированного размера является статической. Таблица, в которой хотя бы одно из полей не фиксированного размера (код без ENUM) является динамической. Разница в скорости выборки колеблется от 3 до 10 раз в пользу статических таблиц.
Цитата:
Все программисты с которыми я когда либо общался решают проблему связей "много к много" способом который описал Androkol
И что?
Виталий Желтяков вне форума Ответить с цитированием
Старый 17.11.2010, 14:49   #20
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

Цитата:
Таблица, в которой хотя бы одно из полей не фиксированного размера
Ну так а что мешает поля сделать фиксированного размера ?

Цитата:
И что?
Теперь давайте поподробнее, то есть вы предлагаете сделать таблицу articles такой структуры : id,cat_id_1,cat_id_2,cat_id_3,cat_i d_4,cat_id_5,<any_other_fields> (тут мы учтем что автор указал что одна статья может принадлежать максимум пяти категориям)
Вот приведите мне пример запроса который найдет статьи принадлежащий категории ну например 4 , 6 , 1 ?

Последний раз редактировалось ssdm; 17.11.2010 в 15:05.
ssdm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переход статей timon777777 PHP 9 27.06.2010 23:16