Хостинг. Хранение проверочного кода в файле сессии

OMTC
8 років
0

Вот простой скрипт:

<?php
session_start();
$cod = rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
echo '<!DOCTYPE HTML><html><head></head><body><center><br><br>';
echo 'new cod - '.$cod;

echo '<hr><br>session cod - '.$_SESSION['cod'];
echo '<br>POST cod - '.$_POST['cod'];

echo '<br><br><form method="post" action="">';
echo '<input id="cod" type="text" name="cod" size="5" maxlength="5">';
echo '<input value="post" type="submit">';
echo '</form>';


echo '</body></html>';
$_SESSION['cod'] = $cod;
?>


По идее ( и на моих серверах именно так ) все правильно. Стартуем сессию, генерируем код, показываем на форме, сохраняем код в сессионном файле.
На клиенте должны видеть два одинаковых кода: пришедший по ПОСТ и ранее сохраненный в сессии.
А тут вижу совсем другую картину, код в сессии тот же, что и отображаемый на странице, и естесстно пришедший код с формы клиента не совпадает с кодом, хранящимся в сессии. Вроде как переменную $cod пихаю в сессию вначале, до вывода на клиента, а не в конце.
Такое впечатление, что сначала отрабатываются все операции с сессией, а потом инфа отдается клиену.
Как решать такую проблему? Такое только у меня?

OMTC
8 років
0

Попробовал вместо сессии сохранять код просто в файл - все работает.
Что за трабла?????
Ведь при таком раскладе капчи здесь ваще работать не будут, или формирование кода и его проверку нада в разных скриптах делать ( по разным страницам )?

OMTC
8 років
1

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

Ну вроде все, тема закрыта
Приятно было с собой пообщаться :)
Если еще встречу свой пост, обязательно отвечу.

rudenko
8 років
3

У Вас каждый раз код должен быть разный так как с точки зрения PHP код выглядит так:

session_start();
$cod = rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
$_SESSION['cod'] = $cod;


или даже так:

session_start();
$_SESSION['cod'] = rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);


Какое бы значение в $_POST вы не передавали оно не присваивается переменной $cod.

OMTC
8 років
-3

Я чет совсем в шоке, в первом посту не тот код, который я выставлял!!!!!!! Че за бред и кто это делает?
А главное - зачем? Походу былоб не плохо админам на это дело обратить внимание!!!!!!
Вот код, который я выставлял:
========================================================================

<?php
session_start();
$cod = rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
echo '<!DOCTYPE HTML><html><head></head><body><center><br><br>';
echo 'new cod - '.$cod;

echo '<hr><br>session cod - '.$_SESSION['cod'];
echo '<br>POST cod - '.$_POST['cod'];

echo '<br><br><form method="post" action="">';
echo '<input id="cod" type="text" name="cod" size="5" maxlength="5">';
echo '<input value="post" type="submit">';
echo '</form>';


echo '</body></html>';
$_SESSION['cod'] = $cod;
?>

=========================================================================
И с алгоритмом все в поряде, сгенерированный $cod попадает в файл сессии после того, как
ушел клиенту в браузер. Попадание посланного по ПОСТ кода в $cod не предусматривается, это просто тест, который показывает что и в каких переменных находится на момент сравнения.
Сравнение ( проверка кода в сессии и пришедшего с формы ) подразумевается сразу после старта сессии.
Работу этого кода можно лицезреть тут test.omtc.com.ua/test/
вписываем в очко new cod - и лицезреем переменные на момент сравнения.
Может какой глюк был с серверами, ктож признается :)
А может действительно дело в буферизации было :( (хотя мозг эту зависимость отвергает)

P.S. У меня небывает неработающего кода! :)

OMTC
8 років
0

Ну ты глянь, просто чудеса, и код в первом посту уже стал нормальным :)

seryoga89
8 років
1

А дело очень даже может быть в буферизации.

Без буферизации вывода каждая команда echo выводит в браузер данные сразу как только встречается в коде, т.е. строка

echo '<hr><br>session cod - '.$_SESSION['cod'];

выведет код сгенерированный при прошлой загрузке страницы.

Если же буферизация включена, то все вызовы echo будут проигнорированы до тех пор пока скрипт не закончит свою работу. Таким образом
$_SESSION['cod'] = $cod;

будет выполнен раньше, чем произойдет echo, а когда дело дойдет до вывода на экран, то код
echo '<hr><br>session cod - '.$_SESSION['cod'];

выведет уже новое значение кода.

Обратите внимание, при включении буферизации теоретически new cod и session cod на странице будут равны.

OMTC
8 років
0

Ну... Короче - нада проверить. Щас опять включу буферизацию и через часик посмотрим че выйдет.

seryoga89 - спасибо.

OMTC
8 років
0

Аннетс!!! Буферизация тута и непричемсь! С ней тоже все работает.

Rock-N-Roll
8 років
0

Как решать такую проблему? © admin248
вот несколько раз перечитал, а сути вопроса так и не понял. Что Вы пытаетесь сделать?

OMTC
8 років
0

Суть вопроса ( проблемы ) изложена в первом посту: по скрипту сохранение данных в переменных сессии производилось в конце выполнения скрипта, а получалось так, что сначала отрабатывались все функции, связанные с сессией, а потом все, что связаны с выводом в поток клиенту, не зависимо от расположения в скрипте. Проблема исчезла без объяснений.

Rock-N-Roll
8 років
1

Проблема исчезла без объяснений © admin248
ну так не бывает...

Просто нужно хлопнуть димедрольчика и хорошо выспаца :)

Тема закрита.