ошибка с Header()

Safary

Новичок
ошибка с Header()

использую такую конструкцию для перехода по страницам ?page=news
потом инклудирую pages/news.php
Ну в общем самый распространенный способ, но возник вопрос...

Сейчас делаю регистрацию, получается ?page=register
Index.php инклудирует /pages/register.php
После того как юзверь зарегистрировался, перенаправить его не могу на другую страницу.
Типа Header(location: user_info.php);

Пожалуйста, не стоит меня направлять в Фак, я его читал. Я знаю что ошибка эта происходит из-за того, что надо в начале хеадер и сессии отправлять. Иначе браузер их пустыми отправляет. Но я не пойму как можно из инклуд-файла перенаправить на другую страницу... Ведь мне надо не в index.php писать header(), а именно в register.php :(

Та же проблемма и с сессиями, третий день не знаю как решить, читаю фак, ищу инфу по этому вопросу - везде написано что сессии и хеадер в начале кода надо помещать, а тут никак этого ведь не сделаешь :confused:
==================================================================
И ещё вопрос похожий...
к примеру шапка сайта...
PHP:
<head><title><?=$title ?></title></head>
$title по умолчанию = 'Главная страница'

Потом юзер щелкает на ссылку ?page=news и $title должен поменяться, после того как инклудируется pages/news.php

Вот, очень буду благодарен за помощь. Просьба камнями не бросаться..:rolleyes:
 

Армян

Новичок
плохо читаешь, хеадер надо не в начале скрипта, а до вывода данных
и какая разница иклуденный файл или нет !?!
 

dimagolov

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

Фанат

oncle terrible
Команда форума
делать надо по-человечески, а не "самым распространенным среди ламеров способом".
весь вывод должен начинаться в register.php.
 

Safary

Новичок
Ладно, сейчас попробую кое-что сделать, кое-какие мысли в голову пришли =)
Как получится/не получится отпишусь, спасибо!

-~{}~ 11.12.08 18:46:

*****, а чем такой способ плох? Вроде большинство CMS так сделано...

Давайте я выложу INDEX.PHP, просто у меня вывод там начинается, я не знаю как сделать через страницы - которые инклудируются вывод.. Потому как на каждой странице меню навигации и т.д. придется инклудировать... Может подскажите что-нибудь.
Вот мой index.php :
PHP:
<?
session_start();
require('scripts/sql.php');
$access='ok';

#переход по страницам
$page=$_GET['page'];
$pages=array('main','news','photo','video','mp3','register','test');
if(!in_array($page,$pages)){$page='main';}
$page='pages/'.$page.'.php';

?>

<table width="100%" height="300" border="0" cellpadding="0" cellspacing="0">
  <tr>
    <td width="150" valign="top"><? include('blocks/navigation.php'); ?></td>
    <td align="center" valign="top"><? include($page); ?></td>
    <td width="150" valign="top"><? include('blocks/login.php'); ?></td>
  </tr>
</table>
 

Фанат

oncle terrible
Команда форума
придется инклудировать...
Ах, боже мой, какая проблема. В скрипте две лишних строчки написать.

Вроде большинство CMS так сделано
КАК сделано? в индекс с хтмл-ом инклюдится пхп скрипт?
Я могу предположить, что большинство авторов CMS как и ты, никогда не слышали об шаблонах.
Но равняться надо не на большинство, а на тех, у кого голова не только для того, чтобы в неё есть.
 

Safary

Новичок
не, я просто не пойму как вывод делать после... У меня инклуды в таблице ведь, разве реально по-другому сделать?

-~{}~ 11.12.08 18:54:

Тогда будет другая система форума ведь.. Я хотел сделать вот так:

На главной странице инклудируются меню, контент, шапка, низ, боковое меню, где логин, пароль ну и т.д.

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

Фанат

oncle terrible
Команда форума
Значит, надо выкинуть эту таблицу.
Инклуды, скорее всего, окажутся при этом не нужны, и это, конечно, будет ужасная потеря.

-~{}~ 11.12.08 18:57:

Ну ты же уже сам понял, что "контент, шапка, низ, боковое меню, где логин, пароль ну и т.д." должны "инклудироваться" не "на главной странице", а ТАМ, ГДЕ ОНИ НУЖНЫ.

ПОСЛЕ получения нужной информации.

-~{}~ 11.12.08 19:01:

Для простых хтмл страниц делается модуль pages, который занимается показом простых хтмл страниц.
Не надо думать, что идея сделать индекс с "дизайном" - величайшее достижение человеческого интеллекта со времен атомной бомбы. Тем более, что ты сам столкнулся с проблемами, которые тебе эта структура создает.

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

Нормальная структура выглядит примерно так:
if(POST) {
проверка
запись
локейшен
}
получение данных
инклюд шаблона

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

Safary

Новичок
Я не очень понимаю всеравно...
Есть структура такая:

index.php

папка PAGES - в ней: register.php, news.php, login.php, main.php и т.д.

Тоесть к каждому файлу из папки PAGES приписывать инклуд шапки, меню, низа и т.д.?
Тогда и сайт медленее будет работать, каждый раз будет перезагружаться меню, шапка, низ...
Или я не так опять понял? Блин, вот я вокруг да около хожу помоему, а понять такой простой вещи не могу...

-~{}~ 11.12.08 19:06:

А, всё понял! Спасибо *****!
Просто сообщение раньше запостил, чем твое добавление увидел =)

-~{}~ 11.12.08 19:07:

Странно, почему твой ник звездочками кодирует.. Я матом не ругался...
 

Фанат

oncle terrible
Команда форума
Тогда и сайт медленее будет работать, каждый раз будет перезагружаться меню, шапка, низ...
жесть.
вот так объясняешь человеку вещь примитивную, но осмысленную, типа квадратных уравнений.
и тут от небе выдает = "но ведь два в квадрате будет 200!"
бегом читать http://phpfaq.ru/na_tanke

-~{}~ 11.12.08 19:11:

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

-~{}~ 11.12.08 19:12:

Safary, про сессии, с таким пещерным представлением о работе веб приложений, спрашивать бесполезно.
После того, как прочтешь и усвоишь материал по ссылке, можешь прочитать http://phpfaq.ru/sessions#use
 

Safary

Новичок
*****
Слушай, огромное спасибо! Ты мне очень помог, я про то что ты обьяснил структуру вывода шаблона, я этой простой вещи не понимал, пытался разобрать DinamikCMS, но не понимал ничерта, сейчас смотрю, теперь всё понятно, теперь смогу её разбирать, огромное просто спасибо!!!
 

Safary

Новичок
Опять не вдуплю...

Сделал ядро СиЭмЭски. Чтоб сначала собиралась инфа, потом выводился контент. Есть ссылка ?page=reg
Тоесть структура INDEX.PHP такая:

PHP:
ЕСЛИ СТРАНИЦА В МАССИВЕ{
$page='pages/'.$page.'.php';
include('themes/'.$theme.'.php');
}else{
include('pages/404.php');
}
В шаблоне, который - $theme индклудируется файл register.php
Уже полностью написал регистрацию, внесение в базу и опять запоролся на header().

Структура register.php:
PHP:
ЕСЛИ ПУСТОЙ $_POST
{
# проверка на ошибки
# если ошибок нет
## создание переменных
## обработка данных
## внесение в базу
## РЕДИРЕКТ
Блин... Форма регистрации у меня выводится по шаблону тоже, но она выводится в шаблоне страницы. Я туплю...

Где тогда прописывать if($_POST[]) ?
Не в index.php же?
Получается форму регистрации на index.php надо перенаправлять? так будет правильно?

-~{}~ 12.12.08 21:38:

Точнее немного не так обьяснил. В шаблоне $theme - разумеется - это default.php - шаблон дизайна. А в шаблоне дизайна ещё один инклуд - инклуд страницы register.php

Просто обьясните саму систему. Есть register.php. Action - у меня стоит пустой, тоесть на register.php

А из register.php уже не сделать Редирект, потому как он инклудируется в шаблоне default.php, который выводит дизайн страницы.

Обработку данных в index.php надо прописывать получается? вот помоему больше никак...

-~{}~ 12.12.08 21:39:

разумеется из register.php ещё один шаблон - шаблон формы инклудируется, reg_template.php

-~{}~ 12.12.08 21:41:

Я хочу понять как в нормальных CMS делаются такие вещи... Плиз обьясните именно саму структуру. если в index.php прописывать обработку данных из формы и саму регистрацию надо и больше никак не сделать - то просто напишите - index.php и всё, чтоб много не писать. Если нет - то обьясните как такая вещь в нормальных CMS реализуется =)

-~{}~ 12.12.08 21:43:

тоесть будет форма регистрации.
PHP:
<form action='index.php'>
и в индекс.пхп будет вся обработка переменных $name, $login, $pass ? вроде это не правильно..
 

dimagolov

Новичок
еще раз и медленно.

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

Safary

Новичок
а что за контроллер? сорри за ламерство...

-~{}~ 12.12.08 22:20:

Просто у меня шаблон дизайна один... там меню, шапка, лого =)))
Получается что надо делать второй шаблон для регистрации и кабинета пользователя?
Это ведь глупо, будет точно такой-же шаблон, просто контент в нем разный.
Я бы хотел чтоб шаблон дизайна всегда был один, а в нем посередине менялась страница.

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

-~{}~ 12.12.08 22:33:

нет, просто обьясните мне дураку... Простым русским языком =)
Вот есть index.php
есть шаблон дизайна
есть шаблон регистрации
есть обработчик шаблона регистрации

что и как сдесь делать?
Тоесть обьясните на примере структуру.. Вот типа моего примера, мой пример сейчас такой:

INDEX.PHP инклудирует ШАБЛОН ДИЗАЙНА
ШАБЛОН ДИЗАЙНА инклудирует REGISTER.PHP
REGISTER.PHP ПОСЫЛАЕТ ДАННЫЕ REGISTER.PHP
REGISTER.PHP обрабатывает их и если всё верно перенаправляет на USER_PAGE.PHP

У меня всё напутано, мне самому не нравится, но как сделать нормально я не пойму...
 

dimagolov

Новичок
перечитай все, что написали раньше тебе, повторяться нету смысла.

контроллер это код, который смотрит параметры (GET, POST) и решает что же надо вывести на странице. В итоге подключает нужные шаблоны, выводит их или наоборот делает некие действия.
 

Safary

Новичок
контроллер же только 1 может быть, значит у меня это INDEX.PHP
Он как раз должен обрабатывать данные из формы регистрации как я понял.

тоесть если INDEX.PHP пришел $_POST['new_reg']; то включается обработчик. всё ли верно?

P.S. Во я доставучий :D

-~{}~ 12.12.08 22:43:

Автор оригинала: *****
делать надо по-человечески, а не "самым распространенным среди ламеров способом".
весь вывод должен начинаться в register.php.
Вот перечитал, вот тут запутался...
Мне ведь надо чтобы шаблон выводил REGISTER.PHP
А если в REGISTER.PHP будет меню, шапка и т.д. - это ведь неудобно будет!

-~{}~ 12.12.08 23:09:

Вот перечитываю это и врубиться не могу всеравно!

Автор оригинала: dimagolov
другое дело обработка post-запросов, которые требуют после себя переадресацию. их (запросы) можно вообще в отдельных обработчик слать, так как очевидно, что никакой вывод делаться не будет, а будет изменяться данные на сервере и возвращаться переадресация на страницу с результатом обработки. можно и не в отдельный, но в любом случае контроллер обязан запрос обработать послать редирект и умереть без какого-либо вывода.
ТОЕСТЬ!
из REGISTER.PHP данные с переменными посылаются на OBRABOTCHIK.PHP и этот обработчик добавляет данные в базу, устанавливает сессию и пересылает на страницу USER_PAGE.PHP ?

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

Вот именно то что я хочу - чтобы REGISTER.PHP показывала форму регистрации, пересылала переменные в саму в себя, обрабатывала их и если всё правильно - перенаправляла на страницу USER_PAGE.PHP

Вы ж сами тупите, говорите: а зачем после вывода пересылать куда-то, сразу без вывода и пересылать.
Вы че! С пустой страницы чтоли пересылать? :D Нафига!
Вот нафига с пустой страницы юзера пересылать на полную страницу!:mad:
Ясное дело что на странице форма регистрации отображается, юзер её заполнил блина и после этого пересылать если всё верно у него.
Блин я хоть и 5-ую ночь не сплю и не буду спать пока CMS не сделаю, но и то так не туплю как вы. Бедняжки, вы наверное месяцами не спите, чтобы так тупить :D

-~{}~ 12.12.08 23:11:

Вот даже на вашем форуме после добавления сообщения делается вывод: ВАШЕ СООБЩЕНИЕ ДОБАВЛЕНО, ЩАС ВАС ПЕРЕАДРЕСУЮТ!
Это ведь делается с помощью ob_start() ?

Почему ob_start() считается непригодной функцией тогда?

И нафига обработчик отдельно делать? если его можно в этой же странице сделать? Вот не пойму я, обьясните...

-~{}~ 12.12.08 23:25:

блин ну обьясните!
register.php не может быть обработчиком данных чтоли?
ну как тогда сделать? обьясните структуру!
Как до вывода обработать?
 

dimagolov

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

переадресация это
PHP:
header("Location: /anotherpage.php");
die();
это надо делать после получения любого POST запроса от клиента, чтобы клиент получив ответ не нажал Refresh и не заслал данные еще раз и сервер их повторно не обработал.

То, что делает форум (через META refresh) имеет чисто эстетическое значение.
 
Сверху