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

Почему не создается сессия после ajax авторизации?

Здравствуйте! Возникла проблема с тем, что после того как ajax отправил запрос к php обработчику у меня не создается сессия, хотя по условию должна. Подскажите, в чем ошибка?

ajax:
$(document).ready(function(){
var clickButtonLoginForm = $(".clickButtonLoginForm");
	
	clickButtonLoginForm.click(function(){
		
		var name_login = $("#name_login").val();
		var pass_login = $("#pass_login").val();
		
		if (name_login == "" || pass_login == "") {
		
			$("#error").text("Вы не заполнили все поля").removeClass("success").addClass("error").show().delay(3000).fadeOut(300);
			
		} else {
			
			$.ajax({
				
				url: "./test/login.php",
				type: "POST",
				data: {user: name_login, password: pass_login},
				success: function(data){
					
					if (data) {
						
						if (data == 1) {
							
							alert("Такая пара логин/пароль НЕ найдена.");
							
						} else {
							
							if (data == 0) {
								
                                $("#error").text("Вы успешно авторизовались!").removeClass("success").addClass("error").show().delay(3000).fadeOut(300);
								
                                
							} else {
								
								
									$("#error").text("Неизвестная ошибка").removeClass("success").addClass("error").show().delay(3000).fadeOut(300);
							}
							
						}
						
					} else {
						
						alert("Данные не получены!!!");
						
					}
					
				},
				error: function(){
					
					alert("Неизвестная ошибка, возможно отсутсвует подлючение к интернету");
					
				}
				
			});
			
		}
		
	});
 });


php:
if (isset($_POST['user']) && isset($_POST['password'])){

	$user = mysql_real_escape_string(htmlspecialchars($_POST['user'])); //немного профильтруем логин
	$password = md5(trim($_POST['password'])); //хешируем пароль т.к. в базе именно хеш
    $query = "SELECT id, user FROM rust_users WHERE user= '$user' AND password = '$password' LIMIT 1"; // проверяем введенные данные
    $sql = mysql_query($query) or die(mysql_error());
    
        if (mysql_num_rows($sql) == true) { // если такой пользователь есть
        $row = mysql_fetch_assoc($sql);
		$_SESSION['id'] = $row['id']; //ставим метку в сессии 
		$_SESSION['user'] = $row['user'];
		setcookie("CookieMy", $row['user'], time()+60*60*24*10);	//ставим куки и время их хранения 10 дней
        echo 0;
   }else{
    echo 1;
   }
    
}
  • Вопрос задан
  • 2565 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vdem
А где вызов session_start()?

UPD: И еще вдогонку:
1. Используйте пробелы, а не табуляцию. Я и сам бы табуляцию использовал. Но так принято. Иначе при работе в команде будут проблемы.
2. Отступы соответственно в 4 пробела.
3. Меньше пустых строчек.
4. Не оставляйте невидимые символы (пробелы, табуляции) в конце строк или в "пустых" строках. Очень обескураживает, когда нажимаешь на [End], а оказываешься не в видимом конце строки, а морковь знает где.

UPD2: ПОЧЕМУ ВСЕ до сих пор используют mysql_*? Есть же PDO. И не надо ничего экранировать - ведь можно и забыть это сделать, и уже SQL injection уязвимость готова.
$pdo = new PDO(sprintf('%s:host=%s;dbname=%s', 'mysql', 'localhost', 'dbname'), 'user', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8; SET CHARACTER SET utf8;'));
$stmt = $pdo->prepare('
    SELECT `id`, `user`
    FROM `rust_users`
    WHERE `user` = :user
                AND `password` = :password
    LIMIT 1');
$stmt->execute(array(':user' => $user, ':password' => $password));
$row = $stmt->fetch(PDO::FETCH_ASSOC);

И ни о каком экранировании задумываться не надо.

UPD3: Это конечно спорно, но я бы вместо if(data == 0) рекомендовал писать if(0 == data), а в более общем виде
if([constant|expression|function call] == variable)
потому что ошибку вида if(data = 0) бывает очень сложно отловить. Вот вчера потратил полдня, отлаживая чужой код, из-за подобной ошибки (и таких случаев было на моей памяти немало). А если сравниваются две переменные, надо быть вдвойне внимательным.
Ответ написан
Ваш ответ на вопрос

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

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