Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проверка и отправка формы (jqery+php) (https://javascript.ru/forum/misc/78695-proverka-i-otpravka-formy-jqery-php.html)

joyandjoy 22.10.2019 08:04

Ошибку понял. Но как сделать проверку посредством jqery? как обратиться к файлу с ответом от капчи и при верном условии, форму отправить?

laimas 22.10.2019 08:13

Делать отдельный запрос для проверки каптчи, при этом не обязательно код каптчи должен быть отдельным файлом, ибо имя у поля каптчи, а это ключ на сервере, свое, значит даже расположив в одном файле прием запроса каптчи и запрос формы, по имени ключа в запросе можно определить что интересует клиента.
Нужно только выполнить два обязательных условия:
1) Обработка асинхронных запросов клиента должна быть в самом начале файле, а при работе с сессией после ее продолжения.
2) Код обработки запроса должен заканчиваться завершением работы скрипта функцией exit. Ответ клиенту при этом может быть аргументом данной функции, если ответ это строка, которая будет выведена в браузер. Если этой функции передать число, то это будет принято как код завершения и вывода в браузер не будет.

laimas 22.10.2019 11:33

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

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>

joyandjoy 22.10.2019 12:13

Однако казалось легче изначально :)
Обманчивая и страшная штука этот JS.
Пойду экспериментировать.
Цитата:

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

laimas 22.10.2019 12:21

Цитата:

Сообщение от joyandjoy
В желаемом мной варианте как раз таки она и в виде функции как я понимаю

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

И у вас проблемы прежде всего в этом, в структуре кода вашего, а не в JS.


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