ILoveYAnny
@ILoveYAnny

Почему не ставятся куки через setcookie в PHP скрипте, при запросе скрипта через AJAX?

Здравствуйте, пытаюсь прикрутить форму регистрации, с это статьи на Хабре
https://habrahabr.ru/post/13726/

Так, как указано в статье, всё получилось. Я адаптировал для следующей задачи

1) Открывается модальное окно, вводится логин и пароль
2) При совпадении страница перезагружается, во входной точке идёт проверка в check.php (Из той же статьи на хабре) и Twig подставляет Никнейм на место Логина.

Дак вот проблема в том, что check.php обращается к Кукам, а они не записываются, при обращении к файлу login.php АЯКС запросом, место подстановки куков выделено жирны и подставлен комментарий.

Попробовал в аякс запрос добавить заголовки, не помогло.

$.ajax({
	  type: "POST",
	  data: {login:login, password:password},
	  url: 'lib/getlogin.php',
	  headers: {
            'Cookie': document.cookie
         }
	   });


Что это может быть? Я уже 2 часа бьюсь, неужели setcookie не срабатывает при AJAX обращении?
Пока вижу решение, на клиенте сохранять куки, но оно не особо меня устраивает

login.php
function generateCode($length=6) {

    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";

    $code = "";

    $clen = strlen($chars) - 1;  
    while (strlen($code) < $length) {

            $code .= $chars[mt_rand(0,$clen)];  
    }

    return $code;

}

if(isset($_POST['password']))

{

    # Вытаскиваем из БД запись, у которой логин равняеться введенному

    $query = mysql_query("SELECT user_id, user_password FROM users WHERE user_login='".mysql_real_escape_string($_POST['login'])."' LIMIT 1");

    $data = mysql_fetch_assoc($query);

    

    # Соавниваем пароли

    if($data['user_password'] === md5(md5($_POST['password'])))

    {

        # Генерируем случайное число и шифруем его

        $hash = md5(generateCode(10));

            

        if(!@$_POST['not_attach_ip'])

        {

            # Если пользователя выбрал привязку к IP

            # Переводим IP в строку

            $insip = ", user_ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')";

        }

        

        # Записываем в БД новый хеш авторизации и IP

        mysql_query("UPDATE users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'");

        

        # Ставим куки

        setcookie("id", $data['user_id'], time()+60*60*24*30);

        setcookie("hash", $hash, time()+60*60*24*30);

        

        # Переадресовываем браузер на страницу проверки нашего скрипта

        print "1"; exit();

    }

    else

    {

        print "Вы ввели неправильный логин/пароль";

    }

}


check.php
if (isset($_COOKIE['id']) and isset($_COOKIE['hash']))

{   

    $query = mysql_query("SELECT *,INET_NTOA(user_ip) FROM users WHERE user_id = '".intval($_COOKIE['id'])."' LIMIT 1");

    $userdata = mysql_fetch_assoc($query);
	
	// or (($userdata['user_ip'] !== $_SERVER['REMOTE_ADDR'])  and ($userdata['user_ip'] !== "0"))

    if(($userdata['user_hash'] !== $_COOKIE['hash']) or ($userdata['user_id'] !== $_COOKIE['id']))

    {

        setcookie("id", "", time() - 3600*24*30*12, "/");

        setcookie("hash", "", time() - 3600*24*30*12, "/");

        print "Хм, что-то не получилось";

    }

    else

    {

        $nameUser = "123";

    }

}
  • Вопрос задан
  • 2792 просмотра
Решения вопроса 2
ILoveYAnny
@ILoveYAnny Автор вопроса
Необходимо было добавить 4 параметр, видимость куков для всего сайта, иначе говоря их путь.

setcookie("id", $data['user_id'], time()+60*60*24*30, "/");
setcookie("hash", $hash, time()+60*60*24*30, "/");
Ответ написан
Комментировать
w_b_x
@w_b_x
Ещё возможно, что куки не хотят ставиться, по той же причине, почему они не ставятся если загрузить ваш PHP скрипт в iframe.

Решение вы можете увидеть, например, здесь:
https://geektimes.ru/post/112077/
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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