Объединение captcha и php контакт формы (с использованием jquery)

Shokoladniu

Новичок
Объединение captcha и php контакт формы (с использованием jquery)

Здраствуйте! Есть простая php форма и интересная captcha, которые по отдельности настраиваются быстро и работают.
Но вместе они объединяться никак не хотят
PHP форма
PHP:
error_reporting(E_NOTICE);

	function valid_email($str)
	{
		return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
	}

	if($_POST['name']!='' && $_POST['email']!='' && valid_email($_POST['email'])==TRUE && strlen($_POST['comment'])>1)
	{
		$to = "[email protected]";
		$headers = 	'From: '.$_POST['email'].''. "\r\n" .
				'Reply-To: '.$_POST['email'].'' . "\r\n" .
				'X-Mailer: PHP/' . phpversion();
		$subject = "Contact Form";
		$message = htmlspecialchars($_POST['comment']);
		
		if(mail($to, $subject, $message, $headers))
		{
			echo 1; //SUCCESS
		}
		else {
			echo 2; //FAILURE - server failure
		}
	}
	else {
		echo 3; //FAILURE - not valid email
	}
и скрипт капчи (jQuery Fancy Captcha)
PHP:
session_start(); /* starts session to save generated random number */

/* this compare captcha's number from POST and SESSION */
if($_POST[captcha] && $_POST[captcha] == $_SESSION[captcha])
	{
		echo "Passed!"; /* YOUR CODE GOES HERE */ 
		unset($_SESSION[captcha]); /* this line makes session free, we recommend you to keep it */
	} 
	
/* in case that form isn't submitted this file will create a random number and save it in session */
elseif(!$_POST[captcha])
	echo "Failed!";
else
	{
		$rand = rand(0,4);
		$_SESSION[captcha] = $rand;
		echo $rand;
	}
Так же есть скрипт на jquery, которые обрабатывает echo 1,2,3 и выдает пользователю сообщение
PHP:
$(document).ready(function(){
$('#contactform').ajaxForm(function(data) {
				if (data==1){
					$('#success').fadeIn("slow");
					$('#contactform').resetForm();
				}
				else if (data==2){
					$('#badserver').fadeIn("slow");
				}
				else if (data==3)
				{
					$('#bademail').fadeIn("slow");
				}
								
			});
		});
Собстевнно как я делаю? форма отправляется на captcha.php у которой в /* YOUR CODE GOES HERE */ вставлен php скрипт отправки почты.
При попытке объединения отправка не работает. Т.е. выводятся всевозможные сообщения, но даже письмо не приходит на почту. В готовом варианте можно увидеть здесь
Мой вопрос: Что я сделал неправильно и как интегрировать капчу и данный скрипт формы?
 

dimagolov

Новичок
в начале добейся того, чтобы Notice-ов не вылазило.
кто картинку генерит и на основании чего? картинку генерить должен один скрипт, а проверять введенное значение другой. этого как-то не наблюдается.

вообще не понял идеи проверять капчу ajax-ом. ее надо проверять при валидации формы на стороне сервера при получении формы с данными.
 

Shokoladniu

Новичок
Вот что у меня получилось, но не работает - хотя сообщение об успешной отправке выскакивает
PHP:
<?

session_start(); /* starts session to save generated random number */

/* this compare captcha's number from POST and SESSION */
if($_POST['captcha'] && $_POST['captcha'] == $_SESSION['captcha'])
	{
		function valid_email($str)
	{
		return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
	}
	error_reporting(E_ALL);
	if($_POST['name']!='' && $_POST['email']!='' && valid_email($_POST['email'])==TRUE && strlen($_POST['comment'])>1)
	{
		$to = "[email protected]";
		$headers = 	'From: '.$_POST['email'].''. "\r\n" .
				'Reply-To: '.$_POST['email'].'' . "\r\n" .
				'X-Mailer: PHP/' . phpversion();
		$subject = "Contact Form";
		$message = htmlspecialchars($_POST['comment']);
		
		if(mail($to, $subject, $message, $headers))
		{
			echo 1; //SUCCESS
		}
		else {
			echo 2; //FAILURE - server failure
		}
	}
	else {
		echo 3; //FAILURE - not valid email
	}
		unset($_SESSION['captcha']); /* this line makes session free, we recommend you to keep it */
	} 
	
/* in case that form isn't submitted this file will create a random number and save it in session */
elseif($_POST['captcha'])
	echo 4;
else
	{
		$rand = rand(0,4);
		$_SESSION['captcha'] = $rand;
		echo $rand;
	}
	
?>
 

baev

‹°°¬•
Команда форума
Shokoladniu:
1. Как самостоятельно отлаживать код — http://phpfaq.ru/debug

2. Функция mail возвращает true в случае успешной передачи сообщения mailagent'у.
Если mailagent не смог отправить письмо, функция об этом не узнает.
 

Shokoladniu

Новичок
Автор оригинала: baev
Shokoladniu:
1. Как самостоятельно отлаживать код — http://phpfaq.ru/debug
Спасибо, но у меня возникла загвоздка- если ставить error reporting в самое начало - не работает капча
2. Функция mail возвращает true в случае успешной передачи сообщения mailagent'у.
Если mailagent не смог отправить письмо, функция об этом не узнает.
Тогда как можно узнать отправил mailagent в действительности письмо или нет?
 

Shokoladniu

Новичок
ФАHАТ, спасибо за столь исчерпывающий ответ. Все бы у нас так отвечали, и не было бы в стране неучей вроде меня. Многое для себя понял.
 

baev

‹°°¬•
Команда форума
если ставить error reporting в самое начало - не работает капча
— и сообщений об ошибках не выводится?

Тогда как можно узнать отправил mailagent в действительности письмо или нет?
— если письмо получили, значит — отправил. Очевидно же.

И, да, довожу до Вашего сведения, что статья http://phpfaq.ru/debug написана Фaнатом (как и прочие на том же ресурсе).
А в правилах этого форума в самом начале озвучено требование:
Прежде чем задать вопрос, попробуйте найти на него ответ в FAQ'ах и/или мануале, а также тут:
http://phpclub.ru/faq/
http://phpfaq.ru/
 

Shokoladniu

Новичок
PHP:
Notice: Undefined index: captcha in /home/perexru/public_html/kiseleva/captcha/captcha.php on line 6
вот 6 строка
if($_POST['captcha'] && $_POST['captcha'] == $_SESSION['captcha'])
 и 
Notice: Undefined index: captcha in /home/perexru/public_html/kiseleva/captcha/captcha.php on line 37
вот строка 37
elseif($_POST['captcha'])
письма приходят, но попадают в спам

В факе не нашел ответа на свой вопрос
 

Фанат

oncle terrible
Команда форума
baev
не, ну, все-таки, требование найти ответ на большом сайте - слишком драконовское.
это все равно что посылать просто в документацию без ссылки

тем более в таком вопросе, как отладка.
тем более, что про отладку аякс-приложений, являющуюся весьма нетривиальной, там ничего нет.

-~{}~ 03.09.09 12:36:

даже письмо не приходит на почту.
письма приходят, но попадают в спам
так что же с письмами происходит?
 

Shokoladniu

Новичок
В итоге: ошибки исправил, нотисов больше нет.
Письма приходят. но попадают в спам
При сабмите пустой формы выводится сообщение об успешной отправке, чего быть не должно - ведь не заполнена капча и остальное.
 

dimagolov

Новичок
Письма приходят. но попадают в спам
При сабмите пустой формы выводится сообщение об успешной отправке, чего быть не должно - ведь не заполнена капча и остальное.
Shokoladniu, это уже апафеоз маразма. попадания писем в спам, это вопрос ну никак не связанный ни с php ни с ajax. причем вопрос не простой. часто (например на yahoo или gmail) достаточно один раз письмо от нового отправителя пометить как "не спам", а часто надо менять настройки почтовика и править DNS домена.

а вот "ведь не заполнена капча и остальное" это проблема в логике твоего кода, то есть в твоей логике. ты уж потрудись разобраться почему такое происходит, думать за тебя тут никто не будет...
 

baev

‹°°¬•
Команда форума
Фaнат, ну, там явно были ошибки в php, никак не связанные с аяксом. И сейчас — то же самое.
(А «драконовские требования» сопоставимы с требовательностью топикстартера в отношении отвечающих.)
 
Сверху