Forum Webscript.Ru

Программирование => PHP => Тема начата: it4all от 04 Февраля 2004, 21:34:48

Название: Проблемы с написанием собственного форума
Отправлено: it4all от 04 Февраля 2004, 21:34:48
В принципе суть данной темы описана на форуме PHPCluba,
и если кому не лень можно сходить -http://phpclub.ru/talk/showthread.php?s=&threadid=45647 (http://phpclub.ru/talk/showthread.php?s=&threadid=45647)
Но к моему большому сожалению мои вопросы не всколыхнули общественность того форума (RomikChef ведь один такой на свете).
Ну да ладно.
Итак подскажите пожалуйста,как перенаправить пользователя обратно на страницу ,с которой он зашел слогинится (с сохранением всех параметров,т. е. ид категории, ид форума и темы)
Короче что поставить в $redirect=???
Заранее благодарен.
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 04 Февраля 2004, 21:39:42
записать в хидден поле формы логина сдрес страницы.

еще вопросы есть, или только этот один?
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 04 Февраля 2004, 22:07:45
RomikChef огромное спасибо ,так посто оказалось,что аж стыдно.
Вытащил адрес через $HTTP_REFERER,надеюсь ,что сделал правильно.
Вопросов куча и если нужно вытащу из с другого форума (просто не хотел повторятся), и будут еще по ходу пьесы.
На сегодня все ,у меня тут ночь уже давно и глаза красные.
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 05 Февраля 2004, 11:47:05
нет, ты сделал неправильно.
в переменной HTTP_REFERER содержится не адрес страницы.
и вообще, ни для чего, кроме статистики, ее применять нельзя
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 05 Февраля 2004, 13:03:39
Может подскажешь как правильно ? (я в мануале искал,что может дать адрес но видимо не нашел)
Или хоть намек какой нибудь.
И еще вопросы по поводу редиректа -
На прошлой теме мне прислали такой код
[CODE]/CODE]
Копался в рнрВВ и нашел такую же строку только вместо нуля стоит 3. Очем говорят эти цифры.
И еще , надо ли помимо мета тега выводить все остальные теги присущие странице (html,body и тд), чтобы запись типа "Спасибо за то-то,если не перезагрузится жми туда-то", выводилась во всех браузерах корректно.
Название: Проблемы с написанием собственного форума
Отправлено: NAS от 05 Февраля 2004, 13:16:07
it4all
То что ты спрашиваешь это основы html. Почитай соответствующую литературу. А цифра означает количество секунд до рефреша.
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 05 Февраля 2004, 13:36:09
Цитировать
it4all:
Может подскажешь как правильно

я уже подсказал.
пиать в хидден поле.
что писать - см. phpinfo();

после поста надо делать
header("Location"), а не рефреш.
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 05 Февраля 2004, 17:00:32
Цитировать
RomikChef:
после поста надо делать
header("Location"), а не рефреш.

У меня есть подозрение ,что на моем халявном хостинге,с их баннерами это не сработает.
Еще хотел спросить, можете привести мне в качестве примера один единственный правильный запрос (готовый код,конечно я знаю ,что здесь этого не любят,но при практически полном отсутствии доков,я не могу научится правильно связывать таблицы), структуру таблиц и что выводить я приведу.
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 05 Февраля 2004, 18:39:10
Внимание ! Еще один неправельный способ редиректа:

session_start();
session_register(\'sid\',\'redirect\');
$sid = session_id();
$redirect= $REQUEST_URI;

все это приводится на всех страницах,кроме login.php,где всем этим
нужно пользоватся.
ОК или неОК?
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 05 Февраля 2004, 19:20:54
Цитировать
У меня есть подозрение ,что на моем халявном хостинге

а ты проверь.
Цитировать
можете привести мне в качестве примера один единственный правильный запрос

ну попробуй
Цитировать
session_start();
session_register(\'sid\',\'redirect\');
$sid = session_id();
$redirect= $REQUEST_URI;

это что еще за бред сивой кобылы?
из какой помойки вывыкопал session_register и $sid = session_id();?!

что это вообще означает?
при чем здесь редирект?
где в приведенном коде редирект?
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 05 Февраля 2004, 22:41:47
Вот адреса помоек-1.Должна быть тебе хорошо знакома
http://php.spb.ru/php/session.html (http://php.spb.ru/php/session.html)
2.http://providerz.ru/articles/php/sessions.html (http://providerz.ru/articles/php/sessions.html)
А смысл в том ,что зайдя на login.php с любой страницы,можно использовать $redirect,которая хранит полный урл для возврата.
И хидден в этом случае не нужен.
Ну а если это бред,то подскажи,направь, видишь же ,что меня несет не туда.
Я в место phpinfo() вывел полный список GLOBALS и выбрал из них ту,что хранит полный урл со всеми параметрами.Как еще передать все это на login.php ,кроме как передать по ссылке или с помошью сессий я не знаю.
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 06 Февраля 2004, 01:28:07
читай и делай, как здесь
http://phpfaq.ru/sessions

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

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

у меня же форма прямо на странице и в ней - хидден с ее адресом.
очень удобно.
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 06 Февраля 2004, 11:41:12
а зачем по ссылке передавать категорию?

select f.*, count(t.id),max(t.date) from forums f, topics t where t.forum=f.id
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 06 Февраля 2004, 11:42:19
вообще это неправильно
подумаю как исправить
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 06 Февраля 2004, 11:44:50
одним запросом не получится я думаю
да и не надо
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 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 от 07 Февраля 2004, 17:56:34
Цитировать
RomikChef:
а зачем по ссылке передавать категорию?

Ты как всегда прав незачем
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 07 Февраля 2004, 18:30:49
лично я бы сделал два вложенных цикла и во втором еще запрос
одним запросом вытащить категории, форумы и последние сообщения, имхо - нереально.
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 07 Февраля 2004, 20:36:00
Я начал репку чесать по поводу сложных запросов,начитавшись статей (detail) и форумов про неоптимизированные запросы и как они могут нарузить сервер БД.
Если делать с вложенными циклами то получается конкретно чайниковский код.
Более того ,токма что очистил все таблицы в локальной БД и выяснилось,что на главной запрос не выводит ничего,кроме категорий ,как заставить его писать нули если данные в других таблицах отсутствуют?
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 07 Февраля 2004, 21:23:18
left outer join
сложный запрос сдлеать неоптимизированным в сто раз проще чем простой.
если кроме чайниковского способа нету другого, то у тебя небольшой выбор, мой дружок.

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

умный человек не боится чайниковского метода, если он оптимальнее, а чайник будет кряхтеть пердеть но тужиться выглядеть умным, а в результате получит противоположный результат
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 08 Февраля 2004, 12:04:23
Цитировать
RomikChef:
умный человек не боится чайниковского метода, если он оптимальнее, а чайник будет кряхтеть пердеть но тужиться выглядеть умным, а в результате получит противоположный результат

Вот эти слова я распечатаю, возьму в рамочку и повешу над компом.
Но более я бы был благодарен если кто-нибудь привел мне сам запрос (как я и просил),а про жойн я слышал сто раз но почитать про него негде (только что скачал русский ман по мускулу разбитый по главам,может там что нарою).
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 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 от 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.
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 08 Февраля 2004, 18:19:34
я не думаю, что в этом дело.
какой еще дефолт в 0? зачем? оно пустым не может быть
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 08 Февраля 2004, 20:32:06
Я еще не проверял,но возможно ета ошибка возникает в ситуации когда постов на форуме еще небыло (я очистил все таблицы),
в таком случае я сделал проверку на пустоту прерменной.
Если она пустая то выводится сообщение "Нет записей".

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

А так вообще запрос нормальный?
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 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 оказываются равными
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 09 Февраля 2004, 13:52:27
переехали в базы данных
http://forums.webscript.ru/showthread.php?s=&threadid=15725
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 10 Февраля 2004, 21:37:13
Слушай Banisher ,я смотрю тебя интересуют несколько другие вопросы,а как насчет моих проблем,у тебя их нет.
Тады делись-ка давай. Как у тебя с запросами и вообще.
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 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,"");//удаляем все теги 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 от 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 и скорее всего и Булетня тоже
проверке данных и  обработке спец символов уделено намного больше кода.
Вопрос - чего еще нужно сюда добавить?
Название: Проблемы с написанием собственного форума
Отправлено: Xander от 15 Февраля 2004, 22:12:24
it4all
не вижу смысла в проверке мэйла - если человек хочет ввести фигню, он ее введет.
и ограничение на слова длиннее 30 символов по-моему глупое.
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 16 Февраля 2004, 01:03:13
it4all
большинство проверок показывают, то ты не понимаешь их смысла.
а в этому случае я не вижу, что обсуждать.
Название: Проблемы с написанием собственного форума
Отправлено: Xander от 16 Февраля 2004, 02:42:42
...а при виде замены PHP на PRE и QUOTE на DIV вообще плакать хочется.
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 16 Февраля 2004, 16:35:02
Цитировать
Xander
не вижу смысла в проверке мэйла - если человек хочет ввести фигню, он ее введет.
и ограничение на слова длиннее 30 символов по-моему глупое.

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

Цитировать
BanisherЗнак "%" на входе надо заменять спец.символом  или экранировать.А то mysql будет неправильно интерпретировать запрос...

Учту,хотя ни в одной статье я не читал именно про этот символ
Цитировать
RomikChefбольшинство проверок показывают, то ты не понимаешь их смысла.
а в этому случае я не вижу, что обсуждать.

А я ничего обсуждать и не собирался,я вопрос задал.Хотя странно слышать от тебя такое насчет
проверок,кототые ты сам же рекомендовал одной леди (повторяюсь),и взятые мной по вот этому адресу
http://phpclub.ru/talk/showthread.php?s=&threadid=43521
Наверное в этих функциях заложен какойто скрытый смысл,кроме того для которого эти функции предназначены.
Цитировать
Xander...а при виде замены PHP на PRE и QUOTE на DIV вообще плакать хочется.

Экий ты сентимент.Очма странно но другая версия Булетня с РНРКлуба использует тэг для вывода
пхпешного кода в постах,а
 позволяет избавится от форматирования текста.А уж чем ДИВ для цитат не угодил я не знаю.
Собственно поэтому и спрашиваю,отстой это понятно,но аргументы хотелось бы услышать.
Название: Проблемы с написанием собственного форума
Отправлено: Xander от 16 Февраля 2004, 20:06:44
есть специальный тэг Q
и есть тэг CODE (!=PRE)

и их надо переопределять с помощью css
а заменять quote на простой div, даже без указания класса - это тупость и потеря семантики. Ну да ладно.

а если я вижу, что у тебя мэйл открыто публикуется, и не хочу светиться для роботов-сборщиков?
в таком случае адрес fuck@fuck.com пройдет любой регексп, проверяющий емэйл. Ну не знаю, может есть люди, которые увидев такую проверку, введут настоящий мэйл.
Но единственная действенная проверка - это высылка письма с паролем на указанный мэйл.

длинные слова - если слово в 30 символов испортит верстку, то это плохая верстка. Я имел в виду то, что 30 это мало.
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 16 Февраля 2004, 20:29:07
за вранье буду бить по рукам.
в моем примере емейл проверяется только если был введен.
в моем примере вообще нет ничего, даже похожего на первый блок замен!
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 17 Февраля 2004, 18:57:14
Цитировать
Xander:
есть специальный тэг Q
и есть тэг CODE (!=PRE)

Хорошее знание тегов,особенно что CODE!=PRE.
Вот токма именно PRE избавляет от форматирования.
Хотя я понимаю,что лучше нужно было бы написать функцию,которая лучше организует разметку и подсветку синтаксиса кода.Но на первое время сойдет и ПРЕ.
Цитировать
Xander:
заменять quote на простой div, даже без указания класса - это тупость и потеря семантики

Полностью согласен,только откуда ты прознал,что у меня простой ДИВ.
Цитировать
Xander:
а если я вижу, что у тебя мэйл открыто публикуется....
Ну не знаю, может есть люди, которые увидев такую проверку, введут настоящий мэйл.

Как ты это увидел,ты наверно телепат,и как люди увидят эту проверку,хотел бы язнать.Более того эта проверка для того,чтобы пользак не допустил ошибку при вводе майла,не забыл @ к примеру.
Цитировать
Xander:
длинные слова - если слово в 30 символов испортит верстку, то это плохая верстка. Я имел в виду то, что 30 это мало.

Речь не о словах ,а о имени пользователя, так для него в базе рнрВВ предусмотрено только 25 символов.И проверить и выдать сообщение при вводе длинного имени,это скорее не для программы,а для пользователя

Xander
Я вообще не люблю флеймить и огрызатся,но ты вынуждаешь к этому.Еслиб ты к примеру обьяснил почему тег ПРЕ не подойдет,и обяснил как реализовать разметку текста внутри тега КОДЕ,я был бы только благодарен.

RomikChef
Про те посты лучше забыть и убрать их от новичковых глаз.
Я позже спрошу более корректно,а пока такой вопрос ,чего кроме кавычек надо обработать в данных ?
Кстати я хотел задать этот вопрос в phpfaq.ru ,но мое мыло пришло назад,ругается что адреса faq@phpclub.net?subject=FAQ (faq@phpclub.net?subject=FAQ)  нету
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 17 Февраля 2004, 19:07:38
ничего не надо обрабатывать в данных.
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 17 Февраля 2004, 23:05:17
RomikChef я понял,каков вопрос ,таков и ответ.
Я решил тут на книгу разорится -
Профессиональное PHP программирование, 2-е издание
кто-нибудь щупал ее,как стоит того?
Название: Проблемы с написанием собственного форума
Отправлено: Меняздесьдавнонет от 17 Февраля 2004, 23:14:32
щупал, стоит

ты правильно понял про вопрос.
обрабатывать надо только то, что нужно.
Название: Проблемы с написанием собственного форума
Отправлено: it4all от 23 Февраля 2004, 17:06:53
Два дня кряхтел и тужился над регулярными для замены текста внутри спецсимволов на урлы.
Огромное спасибо Yu KKo за статьи.
Накалякал следующее(квадратные скобки заменил для читаемости поста):
$text = preg_replace("!(\\|URL=http://)(w{0,4}\\.?\\w+\\.?\\w*\\.\\w{2,3})(\\])(|\\w\\s|+)(\\[/URL\\])!","\\\\4", $text);

$text = preg_replace("!(\\|URL\\|)(http;//)(w{0,4}\\.?\\w+\\.?\\w*\\.\\w{2,3})(\\|/URL\\|)!","\\\\3", $text);

$text = preg_replace("!(\\|EMAIL=)(\\w+@\\w+\\.\\w{2,3})(\\|)(|\\w\\s|+)(\\|/EMAIL\\|)!","\\\\4", $text);

Наверное криво но работает вроде(укажите плиз на все недоделы).

Вопрос второй что нужно добавить в выражения для отображения ссылок вроде этой (я добавил ".*",но не думаю,что это правильно)
http://www.filesearch.ru/cgi-bin/s?q=mirc5*.exe&w=a&t=f&m=300&o=s&s1=&s2=&d=&p=&p2=