Mesuti
@Mesuti
Senior HTML developer (c)

Как на php вернуть конкретную ошибку при оправке формы Ajax?

Привет!

Форма с помощью Ajax отправляет данные в send.php обработчик и он уже взаимодействует с БазойДанных.

Можно ли прямо в обработчике send.php указывать ошибки типа "Неверный логин" или "Неверный пароль" или сразу обе ошибки и отправлять их на текущую страницу с формой?
Чтобы с помощью JavaScript далее оформлять эти ошибки для пользователя.

Если да, то покажете пример?

Нашел только технологию - передача ошибки в заголовок, но таким образом можно передать только 1 ошибку, да и строго определенные ошибки, да и не безопасно это от инъекций.

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

Пример
Ajax
$("form").submit(function(e) {
            e.preventDefault();
                $.ajax({
                    type: "POST",
                    url: "send.php",
                    data: $(this).serialize()
                }).done(function() {
                    // если успешная отправка
                }).fail(function () {
                    // если ошибка отправки
                });
                return false;
            });

Send.php (RedBean.php регистрация пользователя)
// Если такой логин есть, значит ошибка
if ( R::count('users', "login = ?", array($_POST['login'])) > 0)
{
// ХОТЯ И ВОЗНИКАЕТ ОШИБКА, AJAX ОТМЕЧАЕТ УСПЕШНУЮ ОТПРАВКУ. 
// КАК ЕЕ ОТПРАВИТЬ НА ТЕКУЩУЮ СТРАНИЦУ ?
$errors = 'Пользователь с таким Логином уже существует!';
} else
{
// Если логин уникальный - регистрируем юзера
$user = R::dispense('users');
$user->login = $_POST['login'];
$user->password = $_POST['password'];
R::store($user);
}
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
Shlop
@Shlop
Программист
Код может выглядеть вот так:
$("#form").submit(function(e) {
        e.preventDefault();
            $.ajax({
                dataType: 'json', //Тип данных, в котором ожидается получить ответ от сервера.
                type: "POST",
                url: "send.php",
                data: $(this).serialize()
            }).done(function(response) { // В response находится ответ от сервера который отправлен через echo из send.php
                if(!response.status) {
                    alert("Что-то не так");
                }
                else {
                    alert("Всё ок!");
                }
            }).fail(function () {
                
            });
            return false;
        });

// Если такой логин есть, значит ошибка
if ( R::count('users', "login = ?", array($_POST['login'])) > 0) {
	$response = [
		'messages_error' => 'Пользователь с таким Логином уже существует!',
		'status' => false,
	];
	echo json_encode($response); // Отправляем json ответ от сервера
} 
else {
	// Если логин уникальный - регистрируем юзера
	$user = R::dispense('users');
	$user->login = $_POST['login'];
	$user->password = $_POST['password'];
	R::store($user);
}


И кстати как инструмент для просмотра запросов к серверу и ответов от сервера, можно использовать вкладку Network в DevTools браузер Google Chrome, ну и в других браузерах тоже есть такая вкладка
5d4740daa6684529130203.png
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
TTATPuOT
@TTATPuOT
https://patriotovsky.ru/
Рекомендую присмотреться к методологии JSend: https://github.com/omniti-labs/jsend
А вообще, посмотрите, как сделаны API у других. Особенно рекомендую API Telegram ботов как эталон формирования ответов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы