2012-03-09 9 views
2

это может быть вопрос без ответа, но ...PHP: хранить переменные/функции/session_start в одном файле include?

В классическом ASP у меня был прекрасный файл с надписью в верхней части каждой страницы. Мало того, что у него есть основной шаблон html для верхней части страницы для каждой страницы на сайте ... в нем также были ключевые переменные, такие как строка подключения dbase, полезные функции и различные переменные, которые в случае изменения распространялись бы через весь сайт. Я просто должен был включить его в верхнюю часть каждой страницы сайта, и он дал мне единообразный вид и доступ ко всем вещам. Лучшая часть ... ASP позволяет мне делать перенаправления ниже после того, как html был отправлен в верхний файл include, например, после успешного входа в систему, отправки формы или другого действия пользователя.

Теперь я изучаю PHP (все еще нуб). Кажется, нет простого способа сделать переадресацию после отправки html с ошибкой header.php. И некоторые вещи, которые вы хотите на каждой странице, например session_start(), должны появиться перед любым html. Поэтому я мог бы включить html-free в начало каждой страницы с общими функциями, строками и вызовами, такими как session_start в начале. Но, похоже, нет простого способа сохранить красивый html-шаблон для верхнего, если я хочу сделать перенаправление на основе определенных условий ниже, то есть успешного входа в систему. Я бы поставил код перед html и бросил все это в файл top-include, если не для проблемы с перенаправлением.

Есть ли наилучшая практика для сохранения начала сеанса в первой строке каждой страницы и использования другого кода с использованием общего шаблона html и сохранения способности делать переадресации.

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

Спасибо за любые предложения по передовой практике от опытных рук PHP.

+5

Похоже, ваш сайт достиг точки, в которой у вас много кода презентации (HTML), смешанного с вашей бизнес-логикой (PHP). Хотя ваши проблемы, безусловно, разрешимы без большой боли (хотя мы не можем вам помочь, не видя ваш фактический код), вы должны рассмотреть возможность разделения бизнес-логики на организованные классы и только наличие HTML в файлах «view» или «template». Это называется [разделение проблем] (http://en.wikipedia.org/wiki/Separation_of_concerns) и является очень распространенной передовой практикой. –

ответ

0

Для проблемы session_start в другом месте на доске я нашел два предложения, чтобы проверить, запущен ли сеанс, чтобы избежать ошибки msg при запуске, когда сеанс уже существует. Первый -

if (session_id() === "") { 
    session_start(); 
} 

однако он возвращает ошибку, ожидая [вместо {. Второй способ

if(empty($_SESSION)) 
    session_start(); 

не выдает ошибку, но возвращает 0, если пустой. Поэтому мой план состоит в том, чтобы включить session_start в начале заголовка, но при условии, что он с тестом для проверки сеанса еще не запущен ... затем введите код регистрации, который перенаправляется на страницу входа, если вы уже не вошли в систему, или это страницу соединения. Затем я поставлю переменную, равную html для верхней части страницы. Затем эта переменная может быть эхом в любом файле, который включает заголовок, чтобы начать вывод. Таким образом, я думаю, я отделил html от логики на страницах, чтобы разрешить переадресацию в логике. Для страниц сайта они включают заголовок. THEN каждая страница может выполнять логику и создавать msg. Затем этот msg может быть эхом после повторения верхнего html. Результат: заголовок включает session_start в начале, универсальный лог-файл для управления доступом через сайт и верхний html-шаблон. Страницы выполняют свою собственную логику и могут делать перенаправления. Наконец, они выводят эхо. Посмотрите, если это сработает.

+0

ОК, извините, что продолжайте публиковать. Кажется, существуют разные мнения, если вы можете проверить статус session_start перед его вызовом. Некоторые говорят, что если (! Isset ($ _ SESSION)) { session_start(); }. Я привел еще два примера. Другие говорят, что вы не можете проверить сеанс, пока не назовете session_start(). Я хочу сделать чек, чтобы не случайно начинать сеансы в верхней части сессий. Кто-нибудь имеет окончательный ответ? Спасибо! – user1260310

+0

Как последнее замечание о том, что я сделал для всех, кто сталкивался с этим, я создал один файл кода php, чтобы вставлять верхнюю часть каждой страницы без каких-либо исключений или возвратов, поскольку они остановят перенаправление. В этом файле я хранил верхний html в переменной, используя очень полезные heredocs wh .. Некоторым людям это не нравится, но это сработало как прелесть для меня. Затем я вызывал эту переменную, когда это необходимо для запуска вывода страницы после перенаправления. Не похоже на передовую практику, но приводит к разумно хорошо структурированному коду. Без сомнения, классы и объекты лучше, но это будет делать за это время. – user1260310

0

Невозможность отправки заголовков после отправки контента является ограничением протокола HTTP. ASP использует автоматическую буферизацию вывода, но PHP по умолчанию отправляет контент сразу после его вывода. Вы можете включить буферизацию вывода в PHP, читайте здесь: http://php.net/manual/en/book.outcontrol.php

Однако вы обязательно должны посмотреть в MVC.Это стандартная модель для создания веб-приложений в ASP, а также PHP (и многих других): http://en.m.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

Смежные вопросы