Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: переменная передаётся через сессию со второго раза
 
 автор: Port_Artur   (01.04.2010 в 18:41)   письмо автору
 
 

Почему с 1-го раза capcha.php не отображает в форме цифры на картинке, только если открываю форму во второй раз. Я же запускаю сессии и там и там, почему тогда в 1-й раз переменная $_SESSION['capcha'] не отображается на картинке - только со второго раза?


<?
echo "Введите ваши данные!";
 
session_start();

$_SESSION['capcha'] = mt_rand(100000,999999);

echo 
'<form name="addNewUser" action="newuser.php " method="POST" enctype="multipart/form-data">';
echo 
'<table border="0" cellpadding="0" cellspacing="0">';


echo
'    <TR>
      <TD WIDTH="40%" height="30" ALIGN="Left" class="input" >Контрольный код<br><img src="capcha/capcha.php"></TD>
      <TD WIDTH="60%" height="30" ALIGN="Left"><INPUT TYPE="TEXT"  NAME="capcha" SIZE="60" MAXLENGTH="100"></TD>
    </TR>'
;

echo 
'<tr>';
echo 
'<td colspan="2"><input type="submit" name="submitForm" value="Зарегистрировать" class="bt1"/>';
echo 
'</tr>';

echo 
'</table>';
echo 
'<form>';

?>


capcha.php:
<?php
//Запускаем сессию
session_start();
//Создаем изображение
$im=imagecreatefromjpeg("capcha.jpg");
//Генерируем цвет надписи
$color=imagecolorallocate($im,0,0,0);
//Формируем надпись, используя шрифт
imagettftext($im240330$color"/public_html/capcha/corona.ttf"$_SESSION['capcha']);
//Указываем тип содержимого
header("Content-type: image/jpeg");
//Создаем и выводим изображение
imagejpeg($im);
//Разрушаем изображение
imagedestroy($im);
?>

  Ответить  
 
 автор: sim5   (01.04.2010 в 18:48)   письмо автору
 
   для: Port_Artur   (01.04.2010 в 18:41)
 

Я вам уже говорил, что формированием числа для каптчи и помещением его в сессию должен заниматься скрипт готовящий каптчу! А вы опять что творите?

  Ответить  
 
 автор: Port_Artur   (01.04.2010 в 18:58)   письмо автору
 
   для: sim5   (01.04.2010 в 18:48)
 

Точно вспомнил. Спасибо что ещё раз напомнили.

Но всё же , переменную я же занёс в сессию, почему в capcha.php её вроде как не видно? для особо одарённых объясните пожалуйста, а то я что-то никак не пойму.

  Ответить  
 
 автор: sim5   (01.04.2010 в 19:28)   письмо автору
 
   для: Port_Artur   (01.04.2010 в 18:58)
 

Для одаренных: enctype="multipart/form-data" - это для чего? Или форма для загрузки?
set.php - запустить
<?
session_start
();
$_SESSION['as'] = 13;
?>
<img src="get.php" />

get.php - результат
<?
session_start
();
$im imagecreate(80,30);
$back imagecolorallocate($im000);
$col imagecolorallocate($im255255255);
imagestring ($im5205$_SESSION['as'], $col);
header ("Content-type: image/jpeg");
imagejpeg($im);
?>

Проблем нет.

  Ответить  
 
 автор: Port_Artur   (01.04.2010 в 23:19)   письмо автору
 
   для: sim5   (01.04.2010 в 19:28)
 

....
header( 'Location: login.php' );
die();}
....

В этом случае переменная сесcии должна передаваться в login.php или нет?
У меня почему-то не передаётся! Почему. Запускаю сессию везде.

Где вообще можно нормально почитать когда можно передать переменную через сессию, а когда нельзя?

  Ответить  
 
 автор: sim5   (02.04.2010 в 03:50)   письмо автору
 
   для: Port_Artur   (01.04.2010 в 23:19)
 

Сессия (ее переменные) ни куда не передается. Сессия, это файл на диске, и если в login.php сессия стартуется, то доступ к ней будет.
Нельзя передать ничего через сессию только в том случае, если механизм сессии отключен, в остальном ни чем не возобраняется.

  Ответить  
 
 автор: Port_Artur   (02.04.2010 в 08:42)   письмо автору
 
   для: sim5   (02.04.2010 в 03:50)
 

На странице http://www.softtime.ru/bookphp/gl8_1.php

пропущено слово "можно":

Т. о. необходим метод, при помощи которого можно было бы отслеживать информацию о пользователе в течение одного сеанса связи с Web-сайтов.

  Ответить  
 
 автор: sim5   (02.04.2010 в 09:13)   письмо автору
 
   для: Port_Artur   (02.04.2010 в 08:42)
 

Что вы подразумеваете под "методом"?

  Ответить  
 
 автор: Port_Artur   (02.04.2010 в 10:52)   письмо автору
 
   для: sim5   (02.04.2010 в 09:13)
 

в этом предложении

Т. о. необходим метод, при помощи которого можно было бы отслеживать информацию о пользователе в течение одного сеанса связи с Web-сайтов.


на указанной странице http://www.softtime.ru/bookphp/gl8_1.php пропущено слово можно

Это ваш сайт и у вас там типа ошибка

  Ответить  
 
 автор: tvv123456   (02.04.2010 в 11:06)   письмо автору
 
   для: Port_Artur   (02.04.2010 в 10:52)
 

Кстати на этой же страничке второй абзац сверху вторая строка:
необходимо сохранять информацию о пользователях на протяжении нескольких станиц - очепятка

  Ответить  
 
 автор: sim5   (02.04.2010 в 11:12)   письмо автору
 
   для: Port_Artur   (02.04.2010 в 10:52)
 

Это не мой сайт, вы заблуждаетесь.

  Ответить  
 
 автор: Port_Artur   (02.04.2010 в 11:38)   письмо автору
 
   для: sim5   (02.04.2010 в 11:12)
 

Давайте вернёмся к моему первому сообщению в данной теме.

Вы писали что созданная переменная хранится в файле на сервере и я могу к ней потом обращаться.
Вот мы создаём переменную $_Session[capcha]. Отображаемая картинка формируется файлом capcha.php, который выполняется на том же самом сервере, а значит у этого файла также есть доступ к переменным сессии, я же стартую session_start(); в capcha.php, или всё же нет. Я вот этот момент никак не могу уяснить. Ну да картинка отображается в Форме. Ну и что из этого. картинка то ведь формируется скриптом на сервере а не на стороне клиента. Если доступ есть, то почему нам обязательно нужно создавать число для капчи именно в capcha.php.

и ENCTYPE - это же для отправления данных через форму. А мы картинку получаем.

Вы извините что я тут много расписал просто понять не могу. Может кто объяснит?

  Ответить  
 
 автор: sim5   (02.04.2010 в 12:02)   письмо автору
 
   для: Port_Artur   (02.04.2010 в 11:38)
 

Ну спасибо за снисходительность.

Во-первых - не $_Session[capcha], а $_SESSION['capcha'].
Во-вторых - доступ к переменным сессии будут иметь все файлы одного владельца инициализирующие сессию.
В третих - если вы нацарапаете на своей капче так, что пользователь не поймет и попросить ее обновить, тогда что, кто в этом случае будет формировать код?
В четвертых - ENCTYPE не для отправления данных через форму, а для указания типа данных.

  Ответить  
 
 автор: Port_Artur   (02.04.2010 в 13:00)   письмо автору
 
   для: sim5   (02.04.2010 в 12:02)
 

А при использовании include переменные передаются, а то у меня отказывается передаваться переменная.


<?php include 'left.php'?>

  Ответить  
 
 автор: sim5   (02.04.2010 в 13:03)   письмо автору
 
   для: Port_Artur   (02.04.2010 в 13:00)
 

Какие переменные и откуда?

  Ответить  
 
 автор: Port_Artur   (02.04.2010 в 13:06)   письмо автору
 
   для: Port_Artur   (02.04.2010 в 13:00)
 

Почему-то пременная $_SESSION['cap'] из log.php не передаётся в файл login.php

log.php
<?
       session_start
();



  
$_SESSION['cap'] = mt_rand(100000,999999);

header'Location: login.php' );
die();
}




login.php
<?
 session_start
();

 
$ses=$_SESSION['cap'];

...

echo 
'<tr>';
echo 
'<td align="left"><strong>Домашняя страничка:</strong></td>';
echo 
'<td align="left"><input type="text" name="url" maxlength="60" value="'.$ses.'" class="in1"/></td>';
....

  Ответить  
 
 автор: sim5   (02.04.2010 в 13:14)   письмо автору
 
   для: Port_Artur   (02.04.2010 в 13:06)
 

Вам сколько раз повторять - сессия, и ее переменные, никуда не передаютя. Это физически не возможно, сессия это файл на винчестере, обычно по умолчанию в папке temp, а все переменные в ней хранятся в сериализованном виде. Как записывать в сессию, как получать из нее вам уже говорилось, что еще не понятного?

Вы вообще представляете для чего нужна каптча?

  Ответить  
 
 автор: Port_Artur   (02.04.2010 в 13:19)   письмо автору
 
   для: sim5   (02.04.2010 в 13:14)
 

Хорошо, если я создаю переменную в файле log.php, почему я не могу её потом извлечь из сесии в файле login.php.

Капча мне нужна для защиты от спамерских программ (типа хрумера).

  Ответить  
 
 автор: sim5   (02.04.2010 в 13:31)   письмо автору
 
   для: Port_Artur   (02.04.2010 в 13:19)
 

А у вас сам механизм сесси включен?

Еще раз - у вас пользователь запросил форму авторизации обратившись к некой странице. На этой странице вы только стартуете сессию, и отдаете форму, в которой помещено изображение каптчи, которое в свою очередь делает запрос к скрипту формирующему каптчу. И уже этот скрипт генерирует код каптчи для изображения, и для записи его в сессию.
Страница проверки формы обрабатывает форму, сверяет введенный пользователем код, с кодом занесенным в сессию скриптом формирующем каптчу.
Если все ОК, то далее устанавливается признак успешного принятия формы, а не гоняется этот код от скрипта к скрипту в открытом виде, как это вы делаете.

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

  Ответить  
 
 автор: Port_Artur   (02.04.2010 в 13:48)   письмо автору
 
   для: sim5   (02.04.2010 в 13:31)
 

Да конечно я не гоняю капчу в открытом виде. Я просто взял куски кода для примера. Я передаю из обработчика сообщение об ошибке и значения полей, если какие-то поля заполнены не правильно. После того как обработчик перебрасывает пользователе обратно на форму регистрации формируется новая капча и записывается в сессию для проверки в обработчике со значением, которое пользователь вводит с картинки.
У меня не получается передать переменную из одного файла .php в другой .php.

И что значит "А у вас сам механизм сесси включен?"
Разве это session_start(); не включает механизм сессии?

  Ответить  
 
 автор: sim5   (02.04.2010 в 14:09)   письмо автору
 
   для: Port_Artur   (02.04.2010 в 13:48)
 

Я в который раз вижу у вас подобную чушь:
log.php<?
session_start();
$_SESSION['cap'] = mt_rand(100000,999999);
.....
поэтому и пишу, что у вас полный бардак, и коли вы это понимаете, пора бы уже и человеческий код приводить, а тем более не писать о передаче кода каптчи через форму другому скрипту.

session_start() - не включает сессю (она разрешается в php.ini, и все ее параметры устанавливаются там же), а стартует сессию, или продлевает существующую.

Если у вас не удается получить значение из сессии, то она либо ввобще не работает у вас, либо прерывается, либо, например, истекло время ее жизни, по умолчанию равное 24 мин.

  Ответить  
 
 автор: Port_Artur   (02.04.2010 в 14:16)   письмо автору
 
   для: sim5   (02.04.2010 в 14:09)
 

session
Session Support     enabled 
Registered save handlers     files user sqlite 
Registered serializer handlers     php php_binary 

Directive    Local Value    Master Value
session.auto_start    Off    Off
session.bug_compat_42    On    On
session.bug_compat_warn    On    On
session.cache_expire    180    180
session.cache_limiter    nocache    nocache
session.cookie_domain    no value    no value
session.cookie_httponly    Off    Off
session.cookie_lifetime    0    0
session.cookie_path    /    /
session.cookie_secure    Off    Off
session.entropy_file    no value    no value
session.entropy_length    0    0
session.gc_divisor    100    100
session.gc_maxlifetime    1440    1440
session.gc_probability    1    1
session.hash_bits_per_character    4    4
session.hash_function    0    0
session.name    PHPSESSID    PHPSESSID
session.referer_check    no value    no value
session.save_handler    files    files
session.save_path    /usr/home/domain/tmp/    /tmp
session.serialize_handler    php    php
session.use_cookies    On    On
session.use_only_cookies    Off    Off
session.use_trans_sid

  Ответить  
 
 автор: sim5   (02.04.2010 в 14:22)   письмо автору
 
   для: Port_Artur   (02.04.2010 в 14:16)
 

Разбирайтесь. Значит она у вас прерывается. Да и заглянуть в нее труда не стоит, вывести текущий id ее тоже, чтобы понять причины.

  Ответить  
 
 автор: Port_Artur   (02.04.2010 в 14:26)   письмо автору
 
   для: sim5   (02.04.2010 в 14:22)
 

А как в неё заглянуть и в каком месте это лучше cделать?

  Ответить  
 
 автор: sim5   (02.04.2010 в 14:30)   письмо автору
 
   для: Port_Artur   (02.04.2010 в 14:26)
 

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

  Ответить  
 
 автор: Port_Artur   (02.04.2010 в 14:48)   письмо автору
 
   для: sim5   (02.04.2010 в 14:30)
 

В капче лежит переменная
capcha|i:237247;

которая записывается туда файлом создающим изображение капчи. В файле обработчике не удаётся записать туда переменную:
<?
       session_start
();

  
$_SESSION['cap'] = mt_rand(100000,999999);

...


В сессии по прежнему 1 переменная.

Почему так происходит?

  Ответить  
 
 автор: sim5   (02.04.2010 в 15:08)   письмо автору
 
   для: Port_Artur   (02.04.2010 в 14:48)
 

В файле обработчике чего? Проверки каптчи? А зачем при проверке каптчи записывать в $_SESSION['cap'] что-то? Обработчик читать ее должен и сравнивать, а записывать значение в эту переменную должен ТОЛЬКО скрипт формирующий каптчу.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования