session_start() в заголовке всех страниц + 2 раз еще на одной странице. Моё решение.?

Гриша К.

Новичок
session_start() в заголовке всех страниц + 2 раз еще на одной странице. Моё решение.?

Здравствуйте.

Вот такой пример, авторизации пользователя, и запуска сессий.

Есть файл к примеру 'header.php', в котором есть строка:
if (isset($_REQUEST[session_name()])) session_start();

Этот файл я затем вставляю в начало всех остальных файлов использую include(header.php);

-----------------
Авторизация
-----------------
Когда пользователь вводит имя пользователя и логин, и нажимает кнопку "Войти", он попадает на страницу к примеру 'member.php'

Вот примерный ее код ('member.php'):
PHP:
<?php
include(header.php);

session_start();

if ($username && $passwd) {
        if (login($username, $passwd)) {
               $_SESSION['valid_user'] = $username;
       }
}

?>
Из приведенного кода получается, что когда пользователь попадает на эту страницу, для него стартует сессия, если введенные им данные верны, то переменной сеанса $_SESSION['valid_user'] я присваиваю его имя.
Когда например пользователь заходит, на другую страницу,
так как в заголовке страницы стоит такое условие
if (isset($_REQUEST[session_name()])) session_start();, то стартует сессия.
А теперь, если пользователь после авторизации заходит опять на страницу 'member.php', получается session_start() у меня выполняется два раза, я конечно вижу что все работает, но как -то это не корректно.

Я решил на странице 'member.php', стартовать сессию только в том случае, если $_REQUEST[session_name()]) пустая, добавив на страницу условие
if (!isset($_REQUEST[session_name()])) session_start();

В итоге страница 'member.php' у меня получается такая
PHP:
<?php
include(header.php);

if ($username && $passwd) {
        if (login($username, $passwd)) {
               //Вот сюда я решил поставить это условие
               if (!isset($_REQUEST[session_name()])) session_start();
               $_SESSION['valid_user'] = $username;
       }
}

?>
Я посмотрел, что все работает, у условие действительно выполняется, когда нужно, но незнаю нормально ли это.
Допустим ли такой вариант.


-------------------------------------
Я еще также попробовал делать так, на одной странице:
session_start();
echo $_REQUEST[session_name()].' ';
session_start();
echo $_REQUEST[session_name()].' ';
session_start();
echo $_REQUEST[session_name()];

Результат один и тотже:
9a4ecd4244b5e46fc0fdb13792f926c8 9a4ecd4244b5e46fc0fdb13792f926c8 9a4ecd4244b5e46fc0fdb13792f926c8

Вот подумал, что если на одной странице session_start() вызывается 2 раза, то это допустимо что ли?
 

vadim

Guest
надо читать мануал, там чёрным по белому написано, что если сессия запускается несколько раз, то производится только один запуск, а все остальные запуски просто игнорируются
 

Гриша К.

Новичок
vadim, спасибо, а то я столько с этим мучался.
Замечу, что сколько мне уже пишуь на форуме, про то что нужно читать манула, я всегда думаю, что же под ним имеется ввиду конкретно, может быть к примеру эта страница http://ru.php.net/manual/ru/function.session-start.php - она на английском, и там я не смог ничего узнать про повторное использование session_start();
В своей книге я щас еще раз почитал про сессии этого тоже не вычитал (Разработка Web-приложений с помощью PHP и MySQL - Люк Веллинг, Лора Томсон).
Негде было это прочитать.

И вот еще почитал щас раздел про сессии PHP настольная книга программиста - Александр Мазуркевич, Дмитрий Еловой.

Вы какой мануал имеете ввиду, если php.net, то с ним у меня проблемы из-за не знания английского.

-~{}~ 09.03.06 00:21:

===============================
Вот еще задам один вопрос по сессиям.
Для выхода пользователя, я использую такой вариант:
PHP:
	@$old_user = $_SESSION['valid_user'];  

	unset($_SESSION);
	$result_dest = session_destroy();
               //дальше там проверка условий и т.д.
Так вот здесь, если для пользователя сессия не запускалась и он попадет на эту страницу, то выдается ошибка:
Warning: session_destroy() [function.session-destroy]: Trying to destroy uninitialized session in e:\...\ on line 15 ($result_dest = session_destroy();)

Ну наверное здесь имеется ввиду, что PHSESSID пустая, просто пример я взял полностью из книги и думал, что все будет работать без ошибок.
Я сделал так:
PHP:
	@$old_user = $_SESSION['valid_user'];  

	unset($_SESSION);
	$result_dest = (isset($_REQUEST[session_name()]))  ? session_destroy() : '';
               //дальше там проверка условий и т.д.
Это правильный вариант?

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

Гриша К.

Новичок
SelenIT, спасибо. По поводу самого последнего варианта, значит все нормально. Так можно использовать?
 

baev

‹°°¬•
Команда форума
у меня проблемы из-за не знания английского.
Вам уже писали — учите английский.
Чем раньше начнёте, тем легче он будет даваться.

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

Andreika

"PHP for nubies" reader
чета какие-то экстримальные сессии

if (isset($_REQUEST[session_name()])) session_start();
эт чтобы сервер не нагружать лишним стартом сессии?

unset($_SESSION);
$result_dest = (isset($_REQUEST[session_name()])) ? session_destroy() : '';

а это наверное, чтобы враг сессии из памяти сервера не выкрал?
 

Гриша К.

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


Andreika, видели бы вы мои коды сегодня, что я там творил с сессиями, там жесть настоящая была. : )

if (isset($_REQUEST[session_name()])) session_start();
Вот это для того, чтобы сессии загружать только для зарегестрированных пользователей. По поводу перегрузки сервера я не знаю, если это помогает, то вообще хорошо.
А основная цель, чтобы поисковик не попадал на сессии.
Пример взял отсюда: http://phpfaq.ru/sessions

unset($_SESSION);
$result_dest = (isset($_REQUEST[session_name()])) ? session_destroy() : '';

Здесь накрутил немного, в книге то перед началом кода стояла session_start(), а я ее убрал и думал все почему ошибка, потом догадался что причина в отсутствии идентификатора сессии, и решил сделать так и только потом, поставил session_start(). Но щас понимаю, что так тоже можно было оставлять.
 
Сверху