@MZhack

Почему не работает ajax?

Есть форма
<form id="login_form" method="post">
			<label for="username">Имя</label>
			<input type="text" name="username" autocomplete="off" required>
			<label for="password">Пароль</label>
			<input type="password" name="password" autocomplete="off" required>
			<button type="submit" name="do_login">Войти</button>
		</form>
		<div id="er_mes"></div>


Есть скрипт
$(document).ready(function() {
  $('#login_form').submit(function(event) {
    event.preventDefault();
    $.ajax({
      type: 'POST',
      url: '/core/do_login.php',
      data: $(this).serialize(),
      success: function(data) {
        if (data.error_login) {
          $('#er_mes').html(data.error_login);
        } else if (data.us3r_id) {
          $('#login_form').remove();
          $('body').append('<h1>Успех!</h1>');
        }
      },
      error: function(jqXHR, textStatus, errorThrown) {
      console.log(jqXHR, textStatus, errorThrown);
      }
    });
  });
});


При нажатии кнопки Войти, код do_login.php выполняется успешно, а условия которые указаны в ajax success - нет. Попробовал добавить error, в консоли тоже ничего не появляется. Пробовал также добавить dataType: 'json' после data - изменений так же никаких. Версию jquery 3.6.4, менял на 2.2.4 и 1.12.4 - ничего не изменилось.

Код do_login.php
require_once __DIR__.'/boot.php';

	$stmt = pdo()->prepare("SELECT * FROM `users` WHERE `username` = :username");
	$stmt->execute(['username' => $_POST['username']]);
	if (!$stmt->rowCount()) {
		$error_login = "Пользователь с такими данными не зарегистрирован";
		echo json_encode($error_login, JSON_UNESCAPED_UNICODE);
	} else {
		$user = $stmt->fetch(PDO::FETCH_ASSOC);
		if (!password_verify($_POST['password'], $user['password'])) {
			if (password_needs_rehash($user['password'], PASSWORD_DEFAULT)) {
				$newHash = password_hash($_POST['password'], PASSWORD_DEFAULT);
				$stmt = pdo()->prepare('UPDATE `users` SET `password` = :password WHERE `username` = :username');
				$stmt->execute(['username' => $_POST['username'],'password' => $newHash]);
				if (!password_verify($_POST['password'], $user['password'])) {
					$error_login = "Пароль неверен";
					echo json_encode($error_login, JSON_UNESCAPED_UNICODE);
				} else {
					$_SESSION['user_id'] = $user['id'];
					$password_rehash = "Пароль обновлён";
					$us3r_id = $_SESSION['user_id'];
					echo json_encode($us3r_id, JSON_UNESCAPED_UNICODE);
				}	
			} else {
				$error_login = "Пароль неверен";
				echo json_encode($error_login, JSON_UNESCAPED_UNICODE);
			}
		} else {
			$_SESSION['user_id'] = $user['id'];
			$us3r_id = $_SESSION['user_id'];
			echo json_encode($us3r_id, JSON_UNESCAPED_UNICODE);
		}
	}

Подскажите, в чём проблема? Почему не работает ajax?
  • Вопрос задан
  • 120 просмотров
Решения вопроса 1
DanArst
@DanArst Куратор тега JavaScript
Гриффиндор в моде при любой погоде!
Потому что в js у вас data - это якобы массив, хотя с обработчика вы возвращаете всегда строку.
Как вариант в обработчике измените код на следующий везде, где возвращаете результат:
$result = array();
if (!$stmt->rowCount()) {
    $result['error_login'] = "Пользователь с такими данными не зарегистрирован";
    echo json_encode($result, JSON_UNESCAPED_UNICODE);
}
...
$_SESSION['user_id'] = $user['id'];
$result['us3r_id'] = $_SESSION['user_id'];
echo json_encode($result, JSON_UNESCAPED_UNICODE);


И добавьте в AJAX-запрос параметр dataType: "json"

p.s отслеживайте, что передается и что возвращается в DevTools во вкладке Network, а не Console
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы