[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблемы с сессиями в PHP 5
SirusVirus
Здравствуйте! У меня такая проблема - движок (интересующая нас часть) состоит из одного главного файла, который при отдельных значениях id, инклудит соответствующий .php файл и показывает результат. И так в первом файле который должен инклудится первым (id=1), запускаю сессию session_start(), потом $sid1=session_id(), и последнюю в скрытом текстовом поле передаю по post и жму далее, страница обновляется, снова начинает работать главный файл и на этот раз он инклудит второй файл соответственно (id=2), тут снова запускаю сессию session_start(), потом $sid2=session_id() и последнюю сравниваю с тем, что получил по post - ПРОБЛЕМА в том, что всегда эти две идентификатора сесиий не ровны!! Как это вообще может произойти?!

P.S. session.auto-start=0 проблема не в этом, всегда вывожу значения идентификаторов и вижу, что на каждой странице разные значения, причем по post-у все передается ОК (проверял).

У кого какие идеи на этот счет, куда копать? Пожалуйста помогите понять эту "магию" (другого слово не нахожу для этой проблемы sad.gif ).



Спустя 6 часов, 32 минуты, 42 секунды (29.10.2009 - 08:33) Michael написал(а):
Цитата (SirusVirus @ 28.10.2009 - 23:01)
и последнюю в скрытом текстовом поле передаю по post и жму далее,

Покажи код, как передаешь.

Спустя 3 часа, 4 минуты, 48 секунд (29.10.2009 - 11:38) SirusVirus написал(а):
Смысл этой проверки в том, чтобы во первых будет ясно, проходил ли пользователь первую страничку регистрации, или набил в адресе ссылку и попал на ШАГ 2, и во-вторых хочу создать защиту от заполнения формы с чужого хоста!!
HTML
<?php
session_start();
$sid = session_id();
?>
<p class="style32"><form method="post" action="index.php?cat=register&sub_cat=register&id=2">
                        <fieldset name="Site_Rules">
                        <legend class="style34">Соглашения</legend>
                        <div class="style34">
                                        <br />
                        <div name="siterules">Идет текст бла-бла.....</div><br />
<input name="Rules_Accept_Checkbox" type="checkbox" value="1" />
<span class="style32">Прочитал и готов выполнить все данное соглашение<br /
<input name="sid" type="hidden" value="<?php echo $sid; ?>" />
<input name="agree" type="submit" value="Далее" /></span></div></fieldset></form></p>

вторая страница, где уже идет проверка
PHP
<?php
session_start
();
$sid = session_id();
echo $_POST['sid']. "<br />";
echo $sid;

if ($_POST['sid'] != $sid)
{
    echo <<<TEXT
<p><strong>Запрос остановлен: причины</strong></p>
        <p>1. Вы пытаетесь начать регистрацию не с первой страницы</p>
        <p>2. Вы пытаетесь заполнить данные с другого хоста</p>
    <p>Пожалуйста начните регистрацию с главной страницы, или свяжитесь с администратором</p>
TEXT;
    die ();
}
<
form method="post" action=..>... Дальше просто идет простая форма....</form>

Спустя 21 минута, 6 секунд (29.10.2009 - 11:59) Michael написал(а):
Я думаю из моего следующего кода поймешь, что не так.
Тоже вставляю скрытое поле:
PHP
$this->withoutCookie '';
if (
SID
{
     
$this->withoutCookie '<input type="hidden" name="PHPSESSID" value="' session_id() . '">';
}

Спустя 11 часов, 2 минуты, 29 секунд (29.10.2009 - 23:02) SirusVirus написал(а):
value="' . session_id() . '" так я не смогу делать, ведь у меня html-форма, а не присвоение значения переменной! Это у вас обыкновенный кусок php кода - есть класс в котором есть функция проверяющая доступны ли cookie, если нет, то дает добро сессиям для управления пользователями.

P.S. Я вот сделал пример из двух файлов с передачей и сравнением двух значений session_id(), выяснилось, что все работает, и даже при обновлении этих 2-х страниц значения не меняются, а у меня в движке значения session_id() меняются даже при обновлении страницы, там по цепочке инклудятся 3 файла - я думая, что проблема именно в этом, хотя не понимаю конечно как это может быть связано!
P.S. Маленький вопрос - session_start() нужно обязательно делать в самом начале вообще всего кода??? То есть, если у меня есть index.php и он инклудит page1.php, то для работы сессий надо в index.php в самом начале session_start() сделать? А если это делать в page1.php то будет не правильно?

Спустя 2 часа, 14 минут, 35 секунд (30.10.2009 - 01:16) SirusVirus написал(а):
УРА!! Так рад! Все таки эту проблему тоже решил!! В общем хочу тут пояснить все, может кто то тоже наступит на эти грабли и в Гугле наткнется на мой пост! Проблему решил так: вот этот кусок поставил на самом верху главного (и первого) файла, который работает при входе на сайт
PHP
session_start();


Тут сразу возникнут восклицания - парень, почему ты тогда не додумался ohmy.gif ??
Дело было в том (кроме того, что я новичок biggrin.gif ), что я думал, что если с самого начала сделаю session_start, то потом после попадания на другую страничку, там уже не смогу снова сделать session_start (потому что у меня главный index.php файл, о котором тут много говорил, он общий, это он думает и решает что инклудить и все такое, остальные работают одноразно), думал что будет какой то конфликт... Но я ошибся, с самого начала логика была не правильная, а именно ЗАПОМНИТЕ - если у вас похожая конструкция работы сайта, и вы хотите использовать сессии, то в первом (главном обработчике - как у меня), в самом верху ставьте session_start, пусть он начинает сессию, и не беспокойтесь, потом в других файлах вы без проблем сможете вызывать эту же функцию столько, сколько захотите wink.gif
P.S. В логах у меня были такие строчки
Warning: Cannot send session cookie - headers already sent
Warning: Cannot send session cache limiter - headers already sent
Логическое объяснение и решение этого всего (и не только) можете найти вот тут Решение

Спустя 8 часов, 48 минут, 44 секунды (30.10.2009 - 10:05) Michael написал(а):
Я имел ввиду, то что ты пишешь
HTML
<input name="sid" type="hidden" value="<?php echo $sid; ?>" />

Когда надо:
HTML
<input name="PHPSESSID" type="hidden" value="<?php echo $sid; ?>" />

- это надо вставлять, чтобы при отключенных куках сессия передавалась.
А session_start() полюбому надо вызывать где-то вначале (до вывода html ), т.к. она формирует куки с PHPSESSID для отправки клиенту.

Спустя 30 минут, 42 секунды (30.10.2009 - 10:36) SirusVirus написал(а):
Цитата (Michael @ 30.10.2009 - 07:05)
HTML
<input name="PHPSESSID" type="hidden" value="<?php echo $sid; ?>" />

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

У меня в книжке написано, что сессии могут сохранятся как временный файл, или как cookie. Так какой же из этих методов по-дефолту работает?
Если я правильно понял, вставляя в имя PHPSESSID, я смогу передать по POST SID даже если куки будут отключены? Или вы имели ввиду $_SESSION?

Спустя 35 минут, 7 секунд (30.10.2009 - 11:11) Michael написал(а):
1. Куки включены у пользователя
session_start() при первом запуске формирует куку и отдает ее браузеру пользователя.
Когда пользователь запрашивает новую страницу его кука(сохраненная в браузере) "летит" на сервер, где session_start() ее и находит.

2. Куки отключены у пользователя
session_start() формирует константу SID и её (или session_id()) надо вручную
в php добавить в формы и в ссылки, чтобы при возврате пользователя
session_start() смогла найти идентификатор сессии в $_GET или $_POST

Есть правда настройка php.ini чтобы автоматом добавлялись SID во все URI,
но я не юзал. Может session.auto_start ? Правда выходит "некрасивый" адрес
если навигация с помощью форм.

Спустя 14 часов, 30 минут, 37 секунд (31.10.2009 - 01:41) SirusVirus написал(а):
Большое спасибо за помощь!

Спустя 1 месяц, 24 дня, 7 часов, 38 минут, 36 секунд (25.12.2009 - 09:20) eagilik написал(а):
Открыл сессию с именем 'VLV', для проверки вывел имя сессии и зарегистрировал переменную MSS
___________________________________________________________________

<?php
session_start();
?>
<?php
session_name( 'VLV' );
print session_name()."<br>";
$MSS = "NNNN";
session_register( "MSS" );
echo "\$MSS = $MSS<BR>";
?>
<br />
<a href="session.php"> !!!! </a><br />
____________________________________________________________________________________________________

браузер пишет

VLV
$MSS = NNNN

!!!!

______________________________________________________________________________________________________

на другой странице под ссылкой !!!! вызвал сессию 'VLV' и стартовал ее, затем вывел переменную MSS

__________________________________________

<?php
session_start();
print session_name()."<br>";
print ( $MSS );
if ( !empty ( $_SESSION[ "MSS" ] ) )
echo "YES";
else
echo "NO";
?>

____________________________________________________

на первой странице
нажимаю на !!!!

ответ браузера
______________________________________________________________________________________________________

VLV

Notice: Undefined variable: MSS in C:\Apache2.2\htdocs\session.php on line 7
NO

______________________________________________________________________________________________________

пожалуста помогите

Спустя 6 минут, 38 секунд (25.12.2009 - 09:27) eagilik написал(а):
Может у меня ошибка где?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.