Как загрузить данные из PHP после капчи без перезагрузки страницы?
Приветствую.
Опишу ситуацию, чтобы было понятно.
Есть страница сайта. Перед ее отдачей работает код PHP. Этот код проверяет IP-адрес посетителя. Если с IP-адресом все нормально, то посетитель увидит перед собой страницу сайта. Если же IP-адрес попадает под фильтр, то вместо страницы посетитель увидит перед собой капчу. Ну, а как это обычно бывает: если посетитель решает капчу, то ему показывается страница, а если не решает — будет решать капчу до бесконечности, если не надоест, разумеется.
Я не пойму то, как можно отдать посетителю страницу после решения им капчи без перезагрузки страницы. Сайт работает на PHP.
Опишу текущую реализацию, чуть упростив ее сокращением кода.
Встроенный в страницу код проверки
// вот такой код выполняется перед показом страницы посетителю // если ip не подходит, то показываем ему капчу (captcha.html) // если ip нормальный, то показываем страницу (index.html) <?php // Проверка IP $ip = $_SERVER['REMOTE_ADDR']; if ($ip == "XX.XX.XX.XX") { include 'captcha.html'; exit; } else { // Блок else можно и не использовать include 'index.html'; exit; } |
// вот такой код выполняется перед показом страницы посетителю // если ip не подходит, то показываем ему капчу (captcha.html) // если ip нормальный, то показываем страницу (index.html) <?php // Проверка IP $ip = $_SERVER['REMOTE_ADDR']; if ($ip == "XX.XX.XX.XX") { include 'captcha.html'; exit; } else { // Блок else можно и не использовать include 'index.html'; exit; }
captcha.html
<!-- работает через яндекс.капчу --> <!-- капча запрашивает данные с сервера яндекса через js и вставляет их в атрибут --> <!-- полученные данные через js отправляют в php обработчик (request_response.php) --> <!doctype html> <html lang="en"> <head> <script src="https://smartcaptcha.yandexcloud.net/captcha.js" defer=""></script> </head> <body> <div id="smart-captcha" class="smart-captcha" data-callback="check_token" ></div> <script> function check_token(token) { // получаю токен капчи из поля var token_block = document.querySelector("#smart-captcha > input[type=hidden]"); var token = token_block.getAttribute("name"); // формирую данные var data = {}; data["token"] = token; // отправляют данные в обработчик fetch("request_response.php", { "method": "POST", "headers": { "Content-Type": "application/json; charset=utf-8" }, "body": JSON.stringify(data) }).then(function(data) { console.log(data); if (data["passed"] == "passed") { // если капча пройдена, то перезагружаю страницу window.location.reload(); } }) } </script> </body> </html> |
<!-- работает через яндекс.капчу --> <!-- капча запрашивает данные с сервера яндекса через js и вставляет их в атрибут --> <!-- полученные данные через js отправляют в php обработчик (request_response.php) --> <!doctype html> <html lang="en"> <head> <script src="https://smartcaptcha.yandexcloud.net/captcha.js" defer=""></script> </head> <body> <div id="smart-captcha" class="smart-captcha" data-callback="check_token" ></div> <script> function check_token(token) { // получаю токен капчи из поля var token_block = document.querySelector("#smart-captcha > input[type=hidden]"); var token = token_block.getAttribute("name"); // формирую данные var data = {}; data["token"] = token; // отправляют данные в обработчик fetch("request_response.php", { "method": "POST", "headers": { "Content-Type": "application/json; charset=utf-8" }, "body": JSON.stringify(data) }).then(function(data) { console.log(data); if (data["passed"] == "passed") { // если капча пройдена, то перезагружаю страницу window.location.reload(); } }) } </script> </body> </html>
request_response.php
// в обработчике отправляется запрос к серверу яндекса // яндекс может вернуть два ответа: все хорошо + что-то не то // если все хорошо, тогда надо показать посетителю страницу // и делаю я это, отправляя в скрипт о том, что все хорошо // скрипт перезагружает страницу, если все хорошо if(isset($_POST)){ // отправка запроса к яндексу // получение ответа // формирование json для ответа в js // отправка ответа в js echo json_encode($dats); } |
// в обработчике отправляется запрос к серверу яндекса // яндекс может вернуть два ответа: все хорошо + что-то не то // если все хорошо, тогда надо показать посетителю страницу // и делаю я это, отправляя в скрипт о том, что все хорошо // скрипт перезагружает страницу, если все хорошо if(isset($_POST)){ // отправка запроса к яндексу // получение ответа // формирование json для ответа в js // отправка ответа в js echo json_encode($dats); }
И на этом шаге я застрял: получаю ответ из PHP-обработчика и перезагружаю страницу через JS. Хотелось бы при успешности прохождения капчи как-то отдавать страницу без ее перезагрузки через JS.
Предполагаю, что есть какая-то возможность на этапе проверки IP-адреса в условии if-else прервать выполнение показа страницы и показать ее после прохождения капчи. В PHP/JS я не силен. Подскажите, пожалуйста, решение, если оно есть.
Если это имеет значение, то сайт работает на MODX и PHP подключен к нему прямо в файле index.php командой include_once.
Дополнительно:
Непонятно, чем этот вопрос отличается от обычного "как загрузить и отобразить информацию аяксом без перезагрузки страницы"
Не вижу ничего странного в изменении страницы без перезагрузки
Но обычный аякс запрос вполне решает его проблему.
Действительно — reload…
И чем отличается "продолжить загрузку" от "перезагрузить страницу" для меня как для пользователя?
пока идет проверка капчи, то можно как-то предзагрузить данные страницы,
тогда зачем капча? Я и без капчи прочитаю все что у вас "предзагрузилось".
Предполагаю, что есть какая-то возможность на этапе проверки IP-адреса в условии if-else прервать выполнение показа страницы и показать ее после прохождения капчи.
Нет такой возможности.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для загрузки данных из PHP после прохождения капчи без перезагрузки страницы можно воспользоваться технологией AJAX. AJAX позволяет отправлять запросы на сервер без необходимости обновления всей страницы.
Для начала необходимо создать HTML форму, в которой будет капча и поля для ввода данных. После прохождения капчи пользователем, мы будем отправлять данные на сервер с помощью AJAX.
Пример HTML формы:
<img src="captcha.jpg" id="captcha"> <button type="button">Отправить</button><img src="captcha.jpg" id="captcha"> <button type="button">Отправить</button>
Далее добавим скрипт JavaScript, который будет отправлять данные на сервер и обрабатывать ответ:
function sendData() { var data1 = document.getElementById('data1').value; var data2 = document.getElementById('data2').value; var captcha = document.getElementById('captchaInput').value; var xhr = new XMLHttpRequest(); xhr.open('POST', 'process.php', true); xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); xhr.onreadystatechange = function() { if(xhr.readyState == 4 && xhr.status == 200) { var response = xhr.responseText; // обработка ответа от сервера console.log(response); } }; var params = 'data1=' + data1 + '&data2=' + data2 + '&captcha=' + captcha; xhr.send(params); }
На сервере (в файле process.php) необходимо обработать полученные данные и вернуть ответ:
$data1 = $_POST['data1']; $data2 = $_POST['data2']; $captcha = $_POST['captcha']; // проверка капчи if($captcha == $_SESSION['captcha']) { // обработка данных // возвращаем ответ echo 'Данные успешно загружены!'; } else { echo 'Неверная капча!'; }
Таким образом, при нажатии на кнопку "Отправить" данные будут отправлены на сервер, обработаны и возвращен ответ, который будет отображен на странице без ее перезагрузки.