Задать вопрос
@treale

Как реализовать авторизацию посредством AJAX и PHP?

Решил немного поучить php и иже с ними.
С формы авторизации (два поля: логин, пароль) отправляю данные php-скрипту посредством сериализации формы с помощью jQuery.ajax. В ответ ожидаю получать 'yes', если такой пользователь с таким паролем есть, и 'no' - если, собственно, нет, выводя через echo.
Проблема в том, что скрипт обратно посылает пустоту. Переставляю выводы echo - иногда выводит только 'yes', иногда только 'no'.
Тестировал с передачей напрямую через форму (добавление submit-кнопки и action='auth.php'), все нормально - выводит yes/no.
Есть подозрение, что js данные перехватывает раньше/позже, чем отвечает php-скрипт. Все запускается на локалхосте, php 5.3.13

Форма:
<form id='logform' method='post' action=''>
	<div class="close"></div>
	<div class="title">Вход</div>
	<div class="form_err" style="display:block">Неверный логин или пароль</div>
	<div class="form_err err_true" style="display:block">Вы успешно авторизованы!</div>
	<input id='login' name='login' type="text" placeholder="Логин" />
	<input id='password' name='password' type="password" placeholder="Пароль" />
	<button id='log_btn'>Вход</button>
</form>

jquery-скрипт передачи данных с формы (алерты для "дебага"):
$('#log_btn').click(function() {
	$.ajax({
		type: "POST",
		url: "log_user.php",
		data: $('logform').serialize(),
		traditional: true,
		success: function(resp) {
			if (resp == 'yes') {
				alert('yes');
				$('#logform .form_err:first').css('display', 'none');
				$('.err_true').css('display', 'block');
			} else if (resp == 'no') {
				alert('no');
				$('#logform .form_err:first').css('display', 'block');
			} else alert(resp);
		},
		error: function(resp) {
			alert('error');
		}
	});
	return false;
});

PHP-скрипт:
<?php
	require_once('conn_db.php'); // файл с константами для подключения к бд
	$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB);
	if(isset($_POST['login']) && isset($_POST['password'])) {
		$username = $_POST['login'];
		$password = $_POST['password'];
		if ($stmt = $mysqli->prepare("SELECT count(*) FROM test_table WHERE login=?")) {
			$stmt->bind_param('s', $username);
			$stmt->execute();
			$stmt->bind_result($count_rec);
			$stmt->fetch();
			$stmt->close();
		}

		if ($count_rec == null) { 
			echo 'no';
			//exit();
		}
                
                // запрос на получение хэша пароля из таблицы
		if ($stmt = $mysqli->prepare("SELECT pass FROM test_table WHERE login=?")) {
			$stmt->bind_param('s', $username);
			$stmt->execute();
			$stmt->bind_result($corr_pass_hash);
			$stmt->fetch();

                        // сравнение с введенным юзером паролем
			$pass_hash = crypt($password, $corr_pass_hash);
			if ($corr_pass_hash === $pass_hash) {
				echo 'yes';
				//exit();
			} else { 
				echo 'no'; 
				//exit();
			}
			$stmt->close();
		}
	}	
	$mysqli->close();
?>
  • Вопрос задан
  • 16461 просмотр
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Всё-таки, совершенно необъяснима тяга пхп юзеров к написанию километров кода для каждой мизерной операции :)
Ну ладно, по экрану кода на запрос, потому что так в документации написано. Но аж два запроса к базе-то зачем?
Я конечно понимаю, что в новой для себя области всё непонятно. Но хоть немного задуматься над своими действиями можно? Есть хоть малейший смысл в выполнении первого запроса?

Всё что нам нужно - это получить пароль из базы и сравнить его с введенным.
<?php
	
// файл с константами для подключения к бд
require_once('conn_db.php'); 
$db = new safemysql($db_config);
    
if(isset($_POST['login']) && isset($_POST['password']))
{
    // запрос на получение хэша пароля из таблицы
    $sql = "SELECT pass FROM test_table WHERE login=?s";
    $pass = $db->getOne($sql, $_POST['login']);

    // сравнение с введенным юзером паролем
    if ($pass === crypt($_POST['password'], $pass))
    {
        exit('yes');
    }
}	
echo 'no';
Ответ написан
@kaasius
А чего говорит фаербаг/девконсоль?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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