Ошибку понял. Но как сделать проверку посредством jqery? как обратиться к файлу с ответом от капчи и при верном условии, форму отправить?
|
Делать отдельный запрос для проверки каптчи, при этом не обязательно код каптчи должен быть отдельным файлом, ибо имя у поля каптчи, а это ключ на сервере, свое, значит даже расположив в одном файле прием запроса каптчи и запрос формы, по имени ключа в запросе можно определить что интересует клиента.
Нужно только выполнить два обязательных условия: 1) Обработка асинхронных запросов клиента должна быть в самом начале файле, а при работе с сессией после ее продолжения. 2) Код обработки запроса должен заканчиваться завершением работы скрипта функцией exit. Ответ клиенту при этом может быть аргументом данной функции, если ответ это строка, которая будет выведена в браузер. Если этой функции передать число, то это будет принято как код завершения и вывода в браузер не будет. |
Что касается логики, то решений может быть туева туча. Вот два примера и оба это один скрипт, можете их запустить на локальном сервере под любым именем.
1) Согласно условиям ранее оговоренным: <? session_start(); //обработка запросов if($_POST) { switch($k = key($_POST)) { case 'check': $out = $_SESSION['check']==(int)$_POST[$k] ? '' : 'Завтра в школу с родителями!'; break; case 'text': $out = 'Ok'; } exit($out); } //каптча $a = ['+','-','*']; shuffle($a); $check = rand(1, 10) . $a[0] . rand(1, 10); eval('$_SESSION[check]='.$check.';'); ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script type="text/javascript"> $(function() { $('button').click(function() { $.post(location, {check: $(this).prev().val()}, function(d) { if(!d) $('form').submit(); else alert(d); }) }); $('form').submit(function(e) { e.preventDefault(); $.post(location, $(this).serialize(), function(d) { alert(d) }) }); }); </script> </head> <body> <form> <input name="text" value="Text" /> </form> <span>Сколько: <?=$check?>=?</span> <input name="check" /> <button>Проверка</button> </body> </html> Но при таком решении затруднительно обновлять каптчу при ошибках и после приема формы. Но достаточно генерацию каптчи сделать функцией, которую можно размещать хоть до обработки запросов, хоть после, эту задачу легко решить. 2) Генерация каптчи функцией и обмен с сервером в формате JSON. <? session_start(); //каптча function check() { $a = ['+','-','*']; shuffle($a); $check = rand(1, 10) . $a[0] . rand(1, 10); eval('$_SESSION[check]='.$check.';'); return $check; } //обработка запросов if($_POST) { switch($k = key($_POST)) { case 'check': $out = $_SESSION['check']==(int)$_POST[$k] ? '' : ['err'=>1, 'exp'=>check(), 'msg'=>'Двойка! Завтра в школу с родителями!']; break; case 'text': $out = ['exp'=>check(), 'msg'=>'Ok!']; } exit(json_encode($out)); } ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script type="text/javascript"> $(function() { $('button').click(function() { var f = $(this).prev(); $.post(location, {check: f.val()}, function(d) { if(!d.err) $('form').submit(); else { $('span').text(d.exp); f.val(''); alert(d.msg); } }, 'json') }); $('form').submit(function(e) { e.preventDefault(); $.post(location, $(this).serialize(), function(d) { $('span').text(d.exp); $('[name="check"]').val(''); alert(d.msg); }, 'json') }); }); </script> </head> <body> <form> <input name="text" value="Text" /> </form> <label>Сколько: <span><?=check()?></span>=?</label> <input name="check" /> <button>Проверка</button> </body> </html> |
Однако казалось легче изначально :)
Обманчивая и страшная штука этот JS. Пойду экспериментировать. Цитата:
|
Цитата:
И у вас проблемы прежде всего в этом, в структуре кода вашего, а не в JS. |
Часовой пояс GMT +3, время: 06:40. |