Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: не совсем понятна работа с сессиями.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
piratexnik
Отправлено: 19 Июня, 2012 - 17:04:07
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июнь 2012  


Помог: 0 раз(а)




Всем добрый вечер!
Я только начинаю пробовать программировать на PHP.
На текущий момент экспериментирую с созданием простой капчи.
вот столкнулся с интересным моментом.
есть код создания изображения на основании переменной и записи ее в сессии.


captcha.php
....
session_start();
imagepng($im);
$_SESSION['captcha'] = $captcha;
....

в index.php
файл подключается таким образом.
<img src = "captcha.php" />
а далее вызывается переменная из сессии
<?
session_start();
echo $_SESSION['captcha'];
session_destroy();
?>
но значение переменной и изображения не совпадает, хотя по идее должно.
Интересно почему так выходит?

ПС. Самое интересное при обновлении страницы код с изображения переходит в выдаваемый текст, а на изображении новый код.
В принципе скрипт работает так, как отправленный код с изображения полученные методом POST как раз будет соответствовать отстающему $_SESSION['captcha']
Буде благодарен тому, кто объяснит природу этого эффекта. Необходимо для дальнейшего понимания работы с сессиями.
 
 Top
NoPaper
Отправлено: 19 Июня, 2012 - 17:27:57
Post Id



Посетитель


Покинул форум
Сообщений всего: 315
Дата рег-ции: Янв. 2012  
Откуда: Минск


Помог: 9 раз(а)




Здравствуй, скажу как я делал капчу на сайте.

На главной странице через <img src... вызывается скрипт капчи, есть поля формы для заполнения в том числе и поле 'cap' для ввода содержимого капчи. Потом все данные отправляются post'ом на скрипт do.php

В скрипте капчи:
PHP:
скопировать код в буфер обмена
  1.   $_SESSION['text']='randomtext';
  2.   imagepng...


В скрипте do.php:
PHP:
скопировать код в буфер обмена
  1.   if($_POST['cap']==$_SESSION['text']){
  2.      //    Капча введена верно
  3.   }

(Добавление)
Все до ужаса просто Улыбка Сначала из скрипта капчи берем картинку, в сессии сохраняем ее значение. Когда обращаемся к обработчику, там проверяем post и session, если они равны, то капча верна. Если нужно могу кинуть готовый скрипт с капчей.
 
 Top
piratexnik
Отправлено: 20 Июня, 2012 - 09:08:39
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июнь 2012  


Помог: 0 раз(а)




Наверно не совсем правильно объяснил.
Капча работает.
Но, я попытался в главном файле сразу за выводом изображения вывести переменную из сессии.
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. echo  $_SESSION['capcha'];
  3.  

И оказалось рисунок выведен, а переменной то еще нет.
Переменная записывается в сессию при обновлении формы или страницы. А в это время создается новый рисунок.
Вот и вызван вопрос. Если рисунок был создан, значит файл капчи выполнен, если выполнен, то где переменная?.
 
 Top
fdr21
Отправлено: 20 Июня, 2012 - 09:56:53
Post Id



Гость


Покинул форум
Сообщений всего: 86
Дата рег-ции: Июнь 2012  


Помог: 5 раз(а)




piratexnik пишет:
Наверно не совсем правильно объяснил.
Капча работает.
Но, я попытался в главном файле сразу за выводом изображения вывести переменную из сессии.
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. echo  $_SESSION['capcha'];
  3.  

И оказалось рисунок выведен, а переменной то еще нет.
Переменная записывается в сессию при обновлении формы или страницы. А в это время создается новый рисунок.
Вот и вызван вопрос. Если рисунок был создан, значит файл капчи выполнен, если выполнен, то где переменная?.


можно взглянуть исходный код файла captcha.php
 
 Top
piratexnik
Отправлено: 20 Июня, 2012 - 10:51:03
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июнь 2012  


Помог: 0 раз(а)




fdr21 пишет:
можно взглянуть исходный код файла captcha.php

да конечно
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?
  3. $letters = 'abdefhknrstyz23456789'; // алфавит
  4.  
  5.  $caplen = rand(4, 6); ; //длина текста
  6.  $width = 120; $height = 40; //ширина и высота картинки
  7.  $font = 'comic.ttf';//шрифт текста
  8.  $fontsize = 14;// размер текста
  9.  
  10.        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");                  
  11.        header("Last-Modified: " . gmdate("D, d M Y H:i:s", 10000) . " GMT");
  12.        header("Cache-Control: no-store, no-cache, must-revalidate");        
  13.        header("Cache-Control: post-check=0, pre-check=0", false);          
  14.        header("Pragma: no-cache");                                          
  15.        header("Content-Type:image/png");
  16.  
  17.  
  18.  $im = imagecreatetruecolor($width, $height); //создаёт новое изображение
  19.  imagesavealpha($im, true); //устанавливает прозрачность изображения
  20.  $bg = imagecolorallocatealpha($im, 0, 0, 0, 127); //идентификатор цвета для изображения
  21.  imagefill($im, 0, 0, $bg); //выполняет заливку цветом
  22.  
  23.  putenv( 'GDFONTPATH=' . realpath('.') ); //проверяет путь до файла со шрифтами
  24.  
  25.  $captcha = '';//обнуляем текст
  26.  for ($i = 0; $i < $caplen; $i++)
  27.  {
  28.    $captcha .= $letters[ rand(0, strlen($letters)-1) ]; // дописываем случайный символ из алфавила
  29.    $x = ($width - 20) / $caplen * $i + 10;//растояние между символами
  30.    $x = rand($x, $x+4);//случайное смещение
  31.    $y = $height - ( ($height - $fontsize) / 2 ); // координата Y
  32.    $curcolor = imagecolorallocate( $im, rand(0, 100), rand(0, 100), rand(0, 100) );//цвет для текущей буквы
  33.    $angle = rand(-25, 25);//случайный угол наклона
  34.    imagettftext($im, $fontsize, $angle, $x, $y, $curcolor, $font, $captcha[$i]); //вывод текста
  35.  }
  36.  
  37.  // открываем сессию для сохранения сгенерированного текста
  38.  $_SESSION['captcha'] = md5($captcha);
  39.  
  40.  
  41.  imagepng($im); //выводим изображение
  42.  imagedestroy($im);//отчищаем память
  43.  ?>
  44.  


Отредактировано модератором: Мелкий, 20 Июня, 2012 - 10:58:30
 
 Top
fdr21
Отправлено: 20 Июня, 2012 - 11:29:23
Post Id



Гость


Покинул форум
Сообщений всего: 86
Дата рег-ции: Июнь 2012  


Помог: 5 раз(а)




код captcha работает нормально.
Проверял так
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. ?>
  4. <img src="captcha.php" />
  5. <?PHP
  6. var_dump($_SESSION);
  7. ?>
  8.  

(Отредактировано автором: 20 Июня, 2012 - 11:29:53)

 
 Top
Данил_123
Отправлено: 20 Июня, 2012 - 11:38:52
Post Id


Участник


Покинул форум
Сообщений всего: 1026
Дата рег-ции: Июнь 2011  
Откуда: rostov


Помог: 9 раз(а)




CODE (html):
скопировать код в буфер обмена
  1. <img src="captcha.php" />
хорошая картинка..


-----
http://mysitecost.ru
 
 Top
piratexnik
Отправлено: 20 Июня, 2012 - 12:05:11
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июнь 2012  


Помог: 0 раз(а)




fdr21 пишет:
код captcha работает нормально.
Проверял так
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. ?>
  4. <img src="captcha.php" />
  5. <?PHP
  6. var_dump($_SESSION);
  7. ?>
  8.  

чтоб было понятно о чем я говорю.
надо убрать шифрование
в 39 строке
PHP:
скопировать код в буфер обмена
  1.  $_SESSION['captcha'] = $captcha;

тогда при проверке изображение и переменная будет различаться.
 
 Top
fdr21
Отправлено: 20 Июня, 2012 - 13:14:38
Post Id



Гость


Покинул форум
Сообщений всего: 86
Дата рег-ции: Июнь 2012  


Помог: 5 раз(а)




piratexnik пишет:

чтоб было понятно о чем я говорю.
надо убрать шифрование
в 39 строке
PHP:
скопировать код в буфер обмена
  1.  $_SESSION['captcha'] = $captcha;

тогда при проверке изображение и переменная будет различаться.


То что вы хотите, у вас не получится!!!
так ка в файле для вывода изображение:

Открывается старый файл сессии, который сгенерировал прошлый раз файл captcha.php.
А здесь
CODE (html):
скопировать код в буфер обмена
  1. <img src="captcha.php" />

мы запускаем, создаем новую сессию и изображение.
Так как сессии запускаются в заголовке документа, получить данные из новой сессии в этом контексте не получится.
И зачем оно вам нужно, все и так работает как нужно!
 
 Top
piratexnik
Отправлено: 20 Июня, 2012 - 15:10:26
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июнь 2012  


Помог: 0 раз(а)




Цитата:
И зачем оно вам нужно, все и так работает как нужно!

Понадобилось случайно. Капча отказывалась принимать примерно один из трех вводов.
Поэтому решил сравнить получаемое изображение со значением, чтоб узнать в чем причина.
В любом случае спасибо полезно было узнать.
ПС. по эксперементировав с кодом.

PHP:
скопировать код в буфер обмена
  1.  
  2. <img src="captcha.php" />
  3. <?PHP
  4. var_dump($_SESSION);
  5. ?>
  6.  

Хоть и знаю что session_start(); желательно до вывода чего либо,
Все равно переменная опаздывает. Хотя по идее должна открываться уже новая только, что сгенерированная сессия?
 
 Top
fdr21
Отправлено: 20 Июня, 2012 - 15:28:09
Post Id



Гость


Покинул форум
Сообщений всего: 86
Дата рег-ции: Июнь 2012  


Помог: 5 раз(а)




piratexnik пишет:

Понадобилось случайно. Капча отказывалась принимать примерно один из трех вводов.
Поэтому решил сравнить получаемое изображение со значением, чтоб узнать в чем причина.
В любом случае спасибо полезно было узнать.
ПС. по эксперементировав с кодом.

Спойлер (Отобразить)

Хоть и знаю что session_start(); желательно до вывода чего либо,
Все равно переменная опаздывает. Хотя по идее должна открываться уже новая только, что сгенерированная сессия?


Радость Если в таком, именно в таком контексте, без буферизации вы сможете запустить скрипт, ТОЧНО сработает)))
увы так запустить не получится
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB