Автор Тема: Проблемы с написанием собственного форума  (Прочитано 15184 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн it4all

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.it4all.h10.ru
Проблемы с написанием собственного форума
« Ответ #15 : 06 Февраля 2004, 16:40:25 »
Вообще я сам накалякал следующее,но не правильно,тут кол-во тем и кол-во сообщений выдает одинаковое-
"SELECT f.forum_id,f.cat_id,f.forum_title,f.forum_description,
COUNT(t.topic_id) AS tid,COUNT(p.post_id) AS pid,MAX(p.post_time) AS pt FROM  forums f,topics t,posts p
WHERE f.cat_id=\'$line[cat_id]\' AND t.forum_id = f.forum_id AND p.topic_id = t.topic_id GROUP BY t.forum_id"
У меня уже два запроса на старнице,один только по категориям,и во вложенном цикле этот запрос.
Первый запрос сделал для того,чтобы не тащить данные категорий по всем строкам.

Оффлайн it4all

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.it4all.h10.ru
Проблемы с написанием собственного форума
« Ответ #16 : 07 Февраля 2004, 17:56:34 »
Цитировать
RomikChef:
а зачем по ссылке передавать категорию?

Ты как всегда прав незачем

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Проблемы с написанием собственного форума
« Ответ #17 : 07 Февраля 2004, 18:30:49 »
лично я бы сделал два вложенных цикла и во втором еще запрос
одним запросом вытащить категории, форумы и последние сообщения, имхо - нереально.

Оффлайн it4all

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.it4all.h10.ru
Проблемы с написанием собственного форума
« Ответ #18 : 07 Февраля 2004, 20:36:00 »
Я начал репку чесать по поводу сложных запросов,начитавшись статей (detail) и форумов про неоптимизированные запросы и как они могут нарузить сервер БД.
Если делать с вложенными циклами то получается конкретно чайниковский код.
Более того ,токма что очистил все таблицы в локальной БД и выяснилось,что на главной запрос не выводит ничего,кроме категорий ,как заставить его писать нули если данные в других таблицах отсутствуют?

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Проблемы с написанием собственного форума
« Ответ #19 : 07 Февраля 2004, 21:23:18 »
left outer join
сложный запрос сдлеать неоптимизированным в сто раз проще чем простой.
если кроме чайниковского способа нету другого, то у тебя небольшой выбор, мой дружок.

бояться надо не статей, которых ты не понял, а реальных тормозов.

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

Оффлайн it4all

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.it4all.h10.ru
Проблемы с написанием собственного форума
« Ответ #20 : 08 Февраля 2004, 12:04:23 »
Цитировать
RomikChef:
умный человек не боится чайниковского метода, если он оптимальнее, а чайник будет кряхтеть пердеть но тужиться выглядеть умным, а в результате получит противоположный результат

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

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Проблемы с написанием собственного форума
« Ответ #21 : 08 Февраля 2004, 12:16:15 »
вместо
FROM forums f,topics t WHERE WHERE f.cat_id=\'$line[cat_id]\' AND t.forum_id = f.forum_id
надо написать
FROM forums f LEFT OUTER JOIN topics t ON t.forum_id = f.forum_id
WHERE f.cat_id=\'$line[cat_id]\'

Оффлайн it4all

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.it4all.h10.ru
Проблемы с написанием собственного форума
« Ответ #22 : 08 Февраля 2004, 17:22:29 »
RomikChef
Я стобой полностью согласен,ибо до чтения твоего сообщения накряхтел следующее -
SELECT *,COUNT(t.topic_id) AS tid,COUNT(p.post_id) AS pid,MAX(p.post_time) AS ptime FROM forums f
LEFT JOIN topics t ON f
.forum_id t.forum_id 
LEFT JOIN posts p ON p
.topic_id t.topic_id WHERE f.cat_id=\'$line[cat_id]\' GROUP BY f.forum_id

Токма выдает ошибку  - Undefined index: ptime in ....,
и на странице дает мне время Юникс.
Может это не срабатывает MAX(p.post_time) если поле пустое,
может го надо сделать DEFAULT 0.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Проблемы с написанием собственного форума
« Ответ #23 : 08 Февраля 2004, 18:19:34 »
я не думаю, что в этом дело.
какой еще дефолт в 0? зачем? оно пустым не может быть

Оффлайн it4all

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.it4all.h10.ru
Проблемы с написанием собственного форума
« Ответ #24 : 08 Февраля 2004, 20:32:06 »
Я еще не проверял,но возможно ета ошибка возникает в ситуации когда постов на форуме еще небыло (я очистил все таблицы),
в таком случае я сделал проверку на пустоту прерменной.
Если она пустая то выводится сообщение "Нет записей".

Я где то тут(на форуме) читал,что MAX() не возвращает результатов при отсутствии записей в столбце.

А так вообще запрос нормальный?

Оффлайн it4all

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.it4all.h10.ru
Проблемы с написанием собственного форума
« Ответ #25 : 09 Февраля 2004, 13:45:08 »
Помогите найти ошибку-
Если делаю так -
SELECT *,COUNT(t.topic_id) AS tid FROM forums f
LEFT JOIN topics t ON f
.forum_id t.forum_id WHERE f.cat_id=\'$line[cat_id]\' GROUP BY f.forum_id

то tid выдает правильно,но если присоединить таблицу постов -
SELECT *,COUNT(t.topic_id) AS tid,COUNT(p.post_id) AS pid,MAX(p.post_time) AS ptime FROM forums f
LEFT JOIN topics t ON f
.forum_id t.forum_id 
LEFT JOIN posts p ON p
.topic_id t.topic_id WHERE f.cat_id=\'$line[cat_id]\' GROUP BY f.forum_id


то tid и pid оказываются равными

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Проблемы с написанием собственного форума
« Ответ #26 : 09 Февраля 2004, 13:52:27 »
переехали в базы данных
http://forums.webscript.ru/showthread.php?s=&threadid=15725

Оффлайн it4all

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.it4all.h10.ru
Проблемы с написанием собственного форума
« Ответ #27 : 10 Февраля 2004, 21:37:13 »
Слушай Banisher ,я смотрю тебя интересуют несколько другие вопросы,а как насчет моих проблем,у тебя их нет.
Тады делись-ка давай. Как у тебя с запросами и вообще.

Оффлайн it4all

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.it4all.h10.ru
Проблемы с написанием собственного форума
« Ответ #28 : 12 Февраля 2004, 21:28:48 »
RomikChef Мне нужно твое мнение насчет такого набора данных перед внесением в базу (многие я взял по адресу,который ты давал какойто леди "Пример обработки формы" кажется).

$name str_replace("\'"""$name); 
$email str_replace("\'"""$email);
$home str_replace("\'"""$home);
$message=str_replace ("\'","",$message);
$message=strip_tags($message,"<a></a>");//удаляем все теги html
$message=nl2br($message);//разбиваем сообщение на строки,так как ввел их пользователь
$rank intval($rank);//приведение значения к целому числу 


  
$err=""// переменная принимающая значения сообщений об ошибках
  
if (strlen($name) > 30$err="Длина имени не может превышать 30 символов
"

  if (
strlen($email) > 50$err="емейл длинноват...
"

  if (!
preg_match("/^\\w+([\\.\\w]+)*\\w@\\w((\\.\\w)*\\w+)*\\.\\w{2,3}$/"$email)) $err="Вы неправильно ввели свой e-mail
"
;
  if (
strlen($message) > 1000$err="Длина отзыва не может превышать 1000 символов
"

  if (empty(
$message)) $err="Зачем вводить пустую запись?"
  if (
preg_match("/[0-9a-zA-Zа-яА-ЯЁё]{30,}/",$message,$matches)) { 
    
$err="В отзыве присутствует слишком длинное слово $matches[0] Cократите или разбейте его, пожалуйста.
"

Оффлайн it4all

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.it4all.h10.ru
Проблемы с написанием собственного форума
« Ответ #29 : 15 Февраля 2004, 18:20:30 »
опрс о обработке данных (форма создания тем и ответов).

Перед внесением данных в базу
strlen() == 0 или > 3000 символов
поле заголовка  - strip_tags() и addslashes()
поле сообщения
$message = htmlspecialchars($message);
$message = addslashes($message);//интересная фича здесь все равно добавляются слеши перед quot
$message = nl2br($message);

Перед выводом
$text = stripslashes($text);
$text = str_replace("{b}", "", $text);
$text = str_replace("{/b}", "
", $text);
$text = str_replace("{QUOTE}", "<div> ", $text);
$text = str_replace("{/QUOTE}", "</div>", $text);
$text = str_replace("{PHP}", "
", $text);
$text = str_replace("{/PHP}", "
", $text);
кроме этого замена с помощью регулярных выражений спец сиволов email и http://
--------------------------------------------------------------------------------
Вроде все получается но настораживает одно,в коде phpBB и скорее всего и Булетня тоже
проверке данных и  обработке спец символов уделено намного больше кода.
Вопрос - чего еще нужно сюда добавить?
« Последнее редактирование: 15 Февраля 2004, 18:28:00 от it4all »

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28