Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как сравнить сессию и то, что введено в поле (https://javascript.ru/forum/misc/39127-kak-sravnit-sessiyu-i-chto-vvedeno-v-pole.html)

Nailya 17.06.2013 11:13

как сравнить сессию и то, что введено в поле
 
Всем доброго время суток!
У меня капча и поле , куда ввожу символы на картинке.
Создала для нее валидацию на php, то есть, если кнопка нажата и введенное в поле совпадает с тем, что в сессии,значит все верно,а
если не совпадают, то неверно. Но у меня еще валидация для всей формы на js и мне нужно ее переделать, чтобы там добавилась валидация для капчи, конкретно такая же как и на php.

Вопрос как можно ее прописать на js?
Вот валидация php конкретно для капча:
if(isset($_POST['button'])){
		if($_POST['secret'] == $_SESSION['secret']) {
			echo $_POST['secret'];
			echo $_SESSION['secret'];
			}
		else if($_POST['secret'] != $_SESSION['secret'])
			{
			echo "Введено неправильное число!";
			}
	}



Вот валидация на js для всей формы:
function moderation_0()
{
   alert((document.getElementById('comment').value != '' && document.getElementById('secret').value != '') ? 'Спасибо, Ваш комментарий отправлен на модерацию.' : 'Поля ввода текста не заполнены.');
}

вот весь код php+html
otzyvy.php:
if(isset($_POST['button'])){
		if($_POST['secret'] == $_SESSION['secret']) {
			echo $_POST['secret'];
			echo $_SESSION['secret'];
			}
		else if($_POST['secret'] != $_SESSION['secret'])
			{
			echo "Введено неправильное число!";
			}
	}

<span>Имя</span>
						<form  action="otzyvy.php"  method="POST">
						<input class="author" id="author" type="text" name="author"/><br/>
						<span>Отзыв</span><br />
						<textarea class="com" id="comment" name="comment" cols="30" rows="8"></textarea><br />
						 <?php include ('index.php'); ?><br />
  						 <input class="button" name="button"  type="submit"  onclick="moderation_0()" value="Отправить" />


капча index.php
<?php 
session_start(); 

// набор символов 
$alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
 $secret = "";
 
 // формируем строку из 5 символов, которая будет отображаться на картинке 
 for($i=0; $i<5; $i++)
 {
 	$secret.= $alpha[rand(0,strlen($alpha)-1)]; 
 	
 }

 // сохраняем сгенерированную строку в переменной сессии 
 $_SESSION['secret'] = $secret;
 
 echo $_SESSION['secret'];
 ?>
Введите число на картинке:<br /><input type="text" id="secret" name="secret" size="10"><br />
<img src="img.php"><br />


картинка для капча img.php
session_start(); 

 //Рисуем
 //Устанавливаем тип содержимого
 
//Устанавливаем сообщения об ошибках
 
 header('Content-Type: image/png');
 

 $image = imagecreate(80,31);
 //Выбираем цвет фона
 $grey = imagecolorallocate($image, 246,246,246);
 $red = imagecolorallocate($image, 255, 0, 0);
 $color = imagecolorallocate($image, 0, 0, 255);
 
 imagestring($image,5,10,7,$_SESSION['secret'],$color);
 //Оси координат
 imageline ($image, 20,0,80,3, $red);
 imageline ($image, 0,10,50,0, $red);
 imageline ($image, 90,5,40,31, $red);
 imageline ($image, 0,31,70,0, $red);
  
 //Сохраняем файл в формате png и выводим его
 imagepng($image);
 
 //Чистим использованную память
imagedestroy($image);

zebra 17.06.2013 11:45

Один файл отдает картинку с капчей и записывает данные в сессию. 2-й файл получает значение капчи и сравнивает его с сессией.
При клике на кнопку отсылаете капчу на 2-й файл, получаете ответ и смотрите правильно или нет.

Nailya 17.06.2013 11:52

я новичок, я не очень поняла вас, можно поподробней объяснить

zebra 17.06.2013 12:06

js не проверит сам капчу. Для этого нужно взять значение капчи (которое вводится в поле) и отослать скрипту, который проверит капчу. Пхп скрипт вернет результат (сами решаете какой). И если капча верна - делаете сабмит формы, или что вы там делали.

Nailya 17.06.2013 12:12

а как js отослать значение капчи?

zebra 17.06.2013 12:17

ajax

Nailya 17.06.2013 12:33

ясно

ruslan_mart 17.06.2013 12:42

Эм...

img.php:
session_start(); 
header('Content-Type: image/png');
$alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
for($i=0; $i<5; $i++) $secret.= $alpha[rand(0,strlen($alpha)-1)];
$_SESSION['secret'] = $secret;
$image = imagecreate(80,31);
$grey = imagecolorallocate($image, 246,246,246);
$red = imagecolorallocate($image, 255, 0, 0);
$color = imagecolorallocate($image, 0, 0, 255);
imagestring($image,5,10,7,$secret,$color);
imageline ($image, 20,0,80,3, $red);
imageline ($image, 0,10,50,0, $red);
imageline ($image, 90,5,40,31, $red);
imageline ($image, 0,31,70,0, $red);
imagepng($image);
imagedestroy($image);


page.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Документ без названия</title>
</head>

<body>
<form method="post">
   Введите код с картинки:
   <img alt="" src="img.php" />
   <input name="secret" maxlength="5" type="text" />
   <input type="sumbit" value="Отправить" />
</form>

<script type="text/javascript">
<?php
if($_POST['secret']) echo 'alert('.(($_POST['secret'] == $_SESSION['secret']) ? 'Всё верно!' : 'Неверный код безопасности!').')';
?>
</script>
</body>
</html>

Nailya 17.06.2013 13:18

Ruslan_xDD, этот не помогает, у меня все перестает работать

Nailya 17.06.2013 16:21

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

Валидация нужна только для полей textarea и для капча: если textarea пуста,то вывести

сообщение(поле не заполнено) асинхронно, при событии onblur, если верно ничего не выводить;

для input c id="secret как раз проверить $_POST['secret'] == $_SESSION['secret'] - проверить,если

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

сообщение(вы неправильно ввели символы/строка пуст),тоже событие onblur;

А если поля все верны,то просто после нажатия submit, вывести аlert('Спасибо, Ваш комментарий отправлен на модерацию') - как у меня в первом посте

добавила див в index.php дла вывода ошибки и onblur="valid()"
Введите число на картинке:<br /><input type="text" id="secret" name="secret" onblur="valid()" size="10"><br />
<img src="img.php"><br /><div id="myDiv" />


//запомнить ссылку на объект XMLHttpRequest
var xmlHttp = createXmlHttpRequestObject();
//cоздать объект XMLHttpRequest
function createXmlHttpRequestObject()
	{
	//для хранения ссылки на объект XMLHttpRequest
	var xmlHttp;
		try
		{
			xmlHttp = new XMLHttpRequest();
		}
		catch(e)
		{
			try
			{
				xmlHttp = new ActiveXObject("Microsoft.XMLHttp");
			}
			catch(e) { }
		}
		if(!xmlHttp)
			alert("Ошибка создания объекта XMLHttpRequest. ");
		else
			return xmlHttp;
	
	}

function valid()
{
	//продолжать, только если в xmlHttp не пустая ссылка
	if(xmlHttp)
		{
			//попытаться установить соединение с сервером
			try
			{
				name = encodeURIComponent(document.getElementById('secret').value);
				//инициировать доступ к серверу
				xmlHttp.open("GET","index.php?name=" + name, true );
				//метод, обрабатывающий ответы сервера
				xmlHttp.onreadystatechange = handleRequestStateChange;
				//асинхронный запрос серверу
				xmlHttp.send(null);
			}
			catch(e)
			{
				alert("Нет соединения с сервером:\n" + e.toString());
			}
		}
}

//эта ф-ция вызывается при изменении состояния запроса HTTP
function handleRequestStateChange()
	{
		//когда readyState = 4, мы можем прочитать ответ сервера
		if(xmlHttp.readyState == 4)
			//продолжать,только если статутс HTTP равен "OK"
			if(xmlHttp.status == 200)
				{
					try
					{
						//обработать ответ,полученный от сервера
						handleServerResponse();
					}
					catch(e)
					{
						//вывести сообщение об ошибке
						alert("Возникли проблемы во время получения данных:\n" + xmlHttp.statusText);
					}	
				}
	}

//обрабатывает ответ полученный от сервера
function handleServerResponse()
{
	//прочитать сообщение полученное от сервера
	var response = xmlHttp.responseText;
	//получить ссылку на элемент <div>
	myDiv = document.getElementById('myDiv');
	//вывести сообщение
	myDiv.innerHTML = 'Текст введенный пользователем:' + response;
}

ruslan_mart 17.06.2013 16:45

Цитата:

Сообщение от Nailya
этот не помогает, у меня все перестает работать

В оснувную страницу (page.php) тоже необходимо прописать session_start().

Nailya 17.06.2013 16:54

я решила методом ajax делать, этот вариант более подходящий, просто не пойму как вытаскивать из php значение сессии для ajax

zebra 17.06.2013 16:57

Вы отправляете цифры или что там у вас, которое ввел пользователь. пхп скрипт проверяет это значение с сессией, если они совпадают верните например echo 'ok', если нет echo 'no'
В функции которая принимает ajax ответ проверьте это значение, и от него уже дальше пляшите. :dance:

ruslan_mart 17.06.2013 17:13

captcha_image.php:
session_start(); 
header('Content-Type: image/png');
$alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
for($i=0; $i<5; $i++) $secret.= $alpha[rand(0,strlen($alpha)-1)];
$_SESSION['secret'] = $secret;
$image = imagecreate(80,31);
$grey = imagecolorallocate($image, 246,246,246);
$red = imagecolorallocate($image, 255, 0, 0);
$color = imagecolorallocate($image, 0, 0, 255);
imagestring($image,5,10,7,$secret,$color);
imageline ($image, 20,0,80,3, $red);
imageline ($image, 0,10,50,0, $red);
imageline ($image, 90,5,40,31, $red);
imageline ($image, 0,31,70,0, $red);
imagepng($image);
imagedestroy($image);


test_ajax.php:
session_start();
if($_POST['secret'] && $_POST['secret'] == $_SESSION['secret']) echo 1;


page.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Документ без названия</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-2.0.1.min.js"></script>
</head>

<body>
<img alt="" src="captha_image.php" />
<input id="secret" maxlength="5" type="text" />
<input onclick="test()" type="button" value="Проверить" />

<script type="text/javascript">
function test()
{
   $.post('test_ajax.php', {secret: $('#secret').val()}, function(a)
   {
      alert(a ? 'Всё верно!' : 'Неправильный код безопасности!');
   });
}
</script>
</body>
</html>

Nailya 17.06.2013 17:23

1) вот в otzyvy.php я проверила это условие,только при загрузки страницы, он мне сразу выдает, что "Введено неправильное число!"

if($_POST['secret'] == $_SESSION['secret']) {
			echo "OK";
			
			}
		else if($_POST['secret'] != $_SESSION['secret'])
			{
			echo "Введено неправильное число!";
			}


2)функции, которая принимает ajax ответ, выдает мне полную страницу php, а как мне получить только значение сессии

ruslan_mart 17.06.2013 17:26

Nailya, второй if не нужен. session_start() указан?

Nailya 17.06.2013 17:43

да указан

zebra 17.06.2013 17:49

Цитата:

Сообщение от Nailya
2)функции, которая принимает ajax ответ, выдает мне полную страницу php, а как мне получить только значение сессии

Сделайте отдельный файл, который будет только проверять капчу. Или пропишите die после условий.

Nailya 17.06.2013 17:57

я вас уже всех замучила, ничего у меня не получается, остается только с горя напиться(

ruslan_mart 17.06.2013 18:04

Nailya, я уже дал выше рабочий вариант с ajax.

zebra 17.06.2013 18:08

Цитата:

Сообщение от Nailya
я вас уже всех замучила, ничего у меня не получается, остается только с горя напиться(

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


Часовой пояс GMT +3, время: 09:06.