Перейти к содержимому



Сравнение сессионных переменных

#1 cap4369
cap4369
  • Неактивные
  • 62 сообщений
  • Репутация: 1
0

Обновлено 12 ноября 2013 - 14:38  Отправлено 11 ноября 2013 - 18:19

Здравствуйте!
Сделал форму обратной связи с математической проверкой спама. Однако при проверке сессионных переменных выдается ошибка о неправильном ответе. При распечатке массива $_SESSION после нажатия кнопки выводится:
Array(
[captcha] => 9
[res_captcha] => 19
)
,
то есть при нажатии кнопки отправки сообщения меняется сессионная переменная $_SESSION['res_captcha'] и результат введенный мной в поле input естественно уже не равен новому значению. Помогите разобраться как сделать так, чтобы при отправке сообщения сессионные переменные оставались равными. Привожу код обработчика формы:
<?php
include "config.php";
if($_POST['submit']){
session_start();
// определяем переменные
$name = substr($_POST['name'], 0, 20);
$mail = substr($_POST['mail'], 0, 20);
$text = substr($_POST['text'], 0, 2000);
$captcha = $_POST['captcha'];
// проверка заполнения обязательных полей
$error = '';
$pattern = "/^[email protected][a-z0-9]+\.[a-z]{2,6}$/i";
if(empty($name)) $error = '<li>Не заполнено поле "Имя"</li>';
if(empty($mail)) $error .= '<li>Не заполнено поле "Email"</li>';
if(empty($text)) $error .= '<li>Не заполнено поле "Сообщение"</li>';
if(empty($captcha)) $error .= '<li>Не заполнено поле "Введите ответ"</li>';
if(!empty($mail) and !preg_match($pattern, $mail)) $error .= '<li>Поле "Ваш Email:" не соответствует установленному формату</li>';
if($captcha != $_SESSION['res_captcha']) $error .= '<li>Ответ на вопрос неверный</li>';
if(empty($error)) {
// определяем переменные
  $to = '[email protected]';
  $subject = "\r\n".'Заполнена форма на сайте'. "\r\n";
  $message = "\r\n"."Имя: " .$name. "\r\n";
  $message .= "Обратный e-mail: " .$mail. "\r\n";
  $message .= "Текст сообщения: " .$text. "\r\n";
  $headers = "Content-type: text/plain; charset = \"utf-8\"";
// формируем сообщение
  if(mail($to, $subject, $message, $headers)) {
   $_SESSION['res'] = $name.', Ваше письмо успешно отправлено.';
   header("Location: $site_url?option=contacts");
   exit();
  }
  else {
   $_SESSION['res'] = 'Произошла ошибка. Попробуйте еще раз.';
   header("Location: $site_url?option=contacts");
   exit();
  }
}
else {
  $_SESSION['res'] = "<strong>Не заполнены обязательные поля или допущены ошибки:</strong><ul>" .$error. "</ul>";
  $_SESSION['name'] = $name;
  $_SESSION['mail'] = $mail;
  $_SESSION['text'] = $text;
  $_SESSION['captcha'] = $captcha;
  header("Location: $site_url?option=contacts");
  exit();
}
header("Location: $site_url?option=contacts");
exit();   
}
session_start();
$a = mt_rand(1, 10);
$b = mt_rand(1, 10);
$_SESSION['res_captcha'] = $a + $b;
?>

 

 

  • 0

#2 matroskin8
matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 11 ноября 2013 - 22:26

Ну так в $_SESSION['res_captcha'] должно записываться значение сложения двух сгенерированных чисел, а в $_SESSION['captcha'] (кстати, совсем неясно зачем сохранять ответ пользователя???) - то, что пришло из формы... если ответ из формы не совпадает с тем, который сохранен в $_SESSION['res_captcha'], то и получим несовпадение.


то есть при нажатии кнопки отправки сообщения меняется сессионная переменная $_SESSION['res_captcha'] и результат введенный мной в поле input естественно уже не равен новому значению.

Быть того не может или вы показываете не весь код... когда нажата кнопка формы мы попадаем в условие if($_POST['submit']) и до проверки if($captcha != $_SESSION['res_captcha']) сессионная переменная $_SESSION['res_captcha'] нигде не переназначается. Вообще, можно было бы прикрепить скрипт с формой в архиве, чтобы можно было провести его дебаг, поскольку вот так вот искать ошибки в коде без дебага - это совсем неправильно.
P.S. Кстати, а почему бы не задать вопрос по скрипту его автору?
  • 0


#3 cap4369
cap4369
    Topic Starter
  • Неактивные
  • 62 сообщений
  • Репутация: 1

Отправлено 12 ноября 2013 - 00:25

Спасибо за ответ. Код обработчика указан выше называется mail.php(для атрибута action), он приведен полностью. Вот код формы mail_index.php:
<?php
include "config.php";
session_start();
include "mail.php";// Для вывода капчи
print_r($_SESSION);// Для проверки
?>
<div class="form_mail">
<form method="post" action="<?=$site_url?>classes/mail.php">
  <table cellspacing="20">
   <tr>
	<td><span id="red_star">*</span> Имя:</td>
	<td><span><input type="text" name="name" maxlength="20" size="25" value="<?=$_SESSION['name']?>" /></span></td>
   </tr>
   <tr>
	<td><span id="red_star">*</span> Ваш Email:</td>
	<td><span><input type="text" name="mail" maxlength="20" size="25" value="<?=$_SESSION['mail']?>" /></span></td>
   </tr>
   <tr>
	<td>
	<span id="red_star">*</span> Сообщение:</td>
	<td><span><textarea cols="45" rows="5" name="text"><?=$_SESSION['text']?></textarea></span></td>
   </tr>	
   <tr>
	<td>Введите ответ: <br /><h3><?=$a?> + <?=$b?> = ? <?=$_SESSION['res_captcha']?></h3></td>
	<td><span><input type = "text" name = "captcha" /></span></td>
   </tr>  
   <tr>
	<td colspan="2"><p class="form_mail_submit"><input   type="submit" name="submit" value="Отправить сообщение"></p></td>
   </tr>
  </table>  
</form>
<p class="message"><?=$_SESSION['res']?><p>
</div><!-- #mailform -->
<?php
session_unset();
session_destroy();
?>

И еще, вообще- то меня смущает то, что я в файле формы в начале сделал include "mail.php"; так как в форме переменные $a, $b и $_SESSION['res_captcha'] не выводятся. Но я пробовал ввести код генерации капчи в форму, перед соответствующим инпутом, от этого ничего не меняется.
  • 0

#4 matroskin8
matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 12 ноября 2013 - 00:47

Вот почему бы внимательнее не прочесть то, что писалось выше?:

можно было бы прикрепить скрипт с формой в архиве, чтобы можно было провести его дебаг

Старайтесь сделать так, чтобы помогающим вам, эта помощь доставляла как можно меньше хлопот... если бы вы прикрепили скрипт в архиве, то мне бы осталось лишь распаковать его и запустить... а так получается, что мне нужно создавать файлы, копировать в них код, сохранять их где-то... благо всего этого делать не пришлось, поскольку ошибка видна сразу. Вот смотрите, в файле mail.php переменной $_SESSION['res_captcha'] присваивается значение капчи. А чуть ниже в файле с формой это самое значение благополучно удаляется вот этими вот двумя строками:
<?php
session_unset();
session_destroy();
?>
Получается, что в сессионной переменной больше ничего нет... да и самой переменной нет... вот и вся ошибка. Решение просто:
1) либо удаляйте только ненужные переменные сессии, т.е. вместо session_unset(); session_destroy(); пишем так:
<?php
unset($_SESSION['res']);
unset($_SESSION['name']);
unset($_SESSION['mail']);
unset($_SESSION['text']);
unset($_SESSION['captcha']);
//session_unset();
//session_destroy();
?>
2) либо сделайте так, как это сделал автор скрипта: используйте не просто сессионные переменные, а сессионный массив:
$_SESSION['res']['name'];
$_SESSION['res']['email'];
// и т.д.
значение капчи в этот массив, конечно же, не записываем и можем оставить все той же переменной. Ну а в конце просто удаляем весь сессионный массив:
unset($_SESSION['res']);

  • 0


#5 cap4369
cap4369
    Topic Starter
  • Неактивные
  • 62 сообщений
  • Репутация: 1

Отправлено 12 ноября 2013 - 12:03

Спасибо за помощь. Я действительно делал этот скрипт по бесплатным урокам вашего сайта, очень хороший сайт, только вот проблема, я на нем зарегистрирован, но почему- то создавать темы не могу. Может потому что не являюсь клиентом, то есть не приобретал платных курсов? К сожалению, я пенсионер по инвалидности и не могу себе позволить покупку курсов, хотя понимаю, что они мне очень нужны, приходится довольствоваться тем, что есть. Но и бесплатных уроков вполне достаточно. В них все доходчиво и подробно рассказывается и показывается, с разъяснением почему так, а не иначе. Я считаю, что в рунете это лучший сайт по самостоятельной разработке веб приложений.

А то что я не прикрепил скрипт в архиве, то я просто не знал как, только потом разобрался, что надо было воспользоваться расширенной формой.

Сейчас займусь созданием шумового фона и изменением шрифта тоже нелегкая тема. Подскажите, следует создавать отдельный php файл и подключать его атрибутом src, или можно продолжать писать код в генерации капчи?
  • 0

#6 matroskin8
matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 12 ноября 2013 - 12:27

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

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

Сейчас займусь созданием шумового фона и изменения шрифта тоже нелегкая тема. Подскажите, следует создавать отдельный php файл и подключать его атрибутом src, или можно продолжать писать код в генерации капчи?

А как угодно, тут уже решать вам, как лучше... если не ошибаюсь, то урок по созданию капчи с шумом должен быть на сайте - можно взять алгоритм реализации из него.
  • 0


#7 cap4369
cap4369
    Topic Starter
  • Неактивные
  • 62 сообщений
  • Репутация: 1

Отправлено 12 ноября 2013 - 12:36

Спасибо, сейчас зайду на Ваш сайт поищу, ну и напишу, что у меня проблема с созданием тем на форуме. Очень приятно с Вами общаться, даже настроение приподнятое появилось от того, что есть такие небезразличные люди, готовые прийти на помощь. Еще раз благодарю и удачи Вам!
  • 0

#8 matroskin8
matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 12 ноября 2013 - 14:38

Пожалуйста.
И Вам удачи! :)
  • 0


robot
robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Похожие темы
  Название темы Автор Статистика Последнее сообщение

Пользователь месяца
Megoydagi Megoydagi 1-й за Август
Очков активности: 30 4 темы, 8 сообщений, 1 балл репутации
Сайт: bank.net.ru
ТОП самых активных за этот месяц
  • Фотография Vmir
    #1

    Vmir
    Очков активности: 48 3 темы, 7 сообщений, 2 балла репутации

  • Фотография BLIK
    #2

    BLIK
    Очков активности: 40.5 Вне конкурса за определение пользователя месяца

  • Фотография Zevss
    #3

    Zevss (domles43.ru)
    Очков активности: 15 3 темы, 1 сообщение, 1 балл репутации

  • Фотография SergiuS85
    #4

    SergiuS85
    Очков активности: 12 2 темы, 2 сообщения, 1 балл репутации

  • Фотография WGN
    #5

    WGN (worldgamenews.com)
    Очков активности: 12 1 тема, 5 сообщений, 1 балл репутации

  • Фотография Totti
    #6

    Totti
    Очков активности: 12 0 тем, 8 сообщений, 1 балл репутации

  • Фотография kuztoday
    #7

    kuztoday
    Очков активности: 10.5 1 тема, 4 сообщения, 1 балл репутации

  • Фотография Sale_account
    #8

    Sale_account
    Очков активности: 10.5 2 темы, 1 сообщение, 1 балл репутации

  • Фотография DeHuC_64
    #9

    DeHuC_64 (russiangreat.ru)
    Очков активности: 9 Вне конкурса за определение пользователя месяца

  • Фотография kolver
    #10

    kolver
    Очков активности: 9 1 тема, 3 сообщения, 1 балл репутации

  • Показать весь ТОП 10

Поддержите форум! =)
Топ 5 участников по репутации

Оформление форума – IPBSkins.ru