X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Сравнение сессионных переменных
cap4369
cap4369
Topic Starter сообщение 11.11.2013, 19:19; Ответить: cap4369
Сообщение #1


Здравствуйте!
Сделал форму обратной связи с математической проверкой спама. Однако при проверке сессионных переменных выдается ошибка о неправильном ответе. При распечатке массива $_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
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 11.11.2013, 23:26; Ответить: matroskin8
Сообщение #2


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

Быть того не может или вы показываете не весь код... когда нажата кнопка формы мы попадаем в условие if($_POST['submit']) и до проверки if($captcha != $_SESSION['res_captcha']) сессионная переменная $_SESSION['res_captcha'] нигде не переназначается. Вообще, можно было бы прикрепить скрипт с формой в архиве, чтобы можно было провести его дебаг, поскольку вот так вот искать ошибки в коде без дебага - это совсем неправильно.
P.S. Кстати, а почему бы не задать вопрос по скрипту его автору?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
cap4369
cap4369
Topic Starter сообщение 12.11.2013, 1:25; Ответить: cap4369
Сообщение #3


Спасибо за ответ. Код обработчика указан выше называется 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'] не выводятся. Но я пробовал ввести код генерации капчи в форму, перед соответствующим инпутом, от этого ничего не меняется.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 12.11.2013, 1:47; Ответить: matroskin8
Сообщение #4


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

Старайтесь сделать так, чтобы помогающим вам, эта помощь доставляла как можно меньше хлопот... если бы вы прикрепили скрипт в архиве, то мне бы осталось лишь распаковать его и запустить... а так получается, что мне нужно создавать файлы, копировать в них код, сохранять их где-то... благо всего этого делать не пришлось, поскольку ошибка видна сразу. Вот смотрите, в файле 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']);
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
cap4369
cap4369
Topic Starter сообщение 12.11.2013, 13:03; Ответить: cap4369
Сообщение #5


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

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

Сейчас займусь созданием шумового фона и изменением шрифта тоже нелегкая тема. Подскажите, следует создавать отдельный php файл и подключать его атрибутом src, или можно продолжать писать код в генерации капчи?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 12.11.2013, 13:27; Ответить: matroskin8
Сообщение #6


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

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

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

А как угодно, тут уже решать вам, как лучше... если не ошибаюсь, то урок по созданию капчи с шумом должен быть на сайте - можно взять алгоритм реализации из него.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
cap4369
cap4369
Topic Starter сообщение 12.11.2013, 13:36; Ответить: cap4369
Сообщение #7


Спасибо, сейчас зайду на Ваш сайт поищу, ну и напишу, что у меня проблема с созданием тем на форуме. Очень приятно с Вами общаться, даже настроение приподнятое появилось от того, что есть такие небезразличные люди, готовые прийти на помощь. Еще раз благодарю и удачи Вам!
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 12.11.2013, 15:38; Ответить: matroskin8
Сообщение #8


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

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) ExchangeRates.Pro: сравнение цен Bitcoin/Crypto обменников, бирж, P2P рынка 🚀
Поможем найти лучшие цены на обмен 34 криптовалют в 255 странах
8 ExchangeRatesPro 3126 12.2.2020, 18:46
автор: ExchangeRatesPro
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыСравнение 2-х страниц на одну тему
1 rad_mw 1056 28.6.2018, 18:27
автор: Napoleon-007
Открытая тема (нет новых ответов) Php - скрипт. Сравнение строк в csv файлах
2 PoliteX 2494 21.7.2015, 11:50
автор: PoliteX
Открытая тема (нет новых ответов) Сравнение на основе регулярных выражений. Бюджет 40 евро.
5 Nickondr 4759 1.10.2011, 23:15
автор: -Webmaster-


 



RSS Текстовая версия Сейчас: 19.4.2024, 19:24
Дизайн