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

Реферальная программа Мегаплана

Выбрать шаблон и создать сайт

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

#1 cap4369

cap4369
  • Пользователь
  • 62 сообщений
  • Репутация: 1
0

Отправлено 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 = "/^.+@[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 = 'to@mail.com';
  $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


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