За последние 24 часа нас посетили 138289 программистов и 6673 робота. Сейчас ищет 2071 программист ...

Авторизация ajax php

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 16 июл 2017.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Есть такая проблема, если логин и пароль не правильный, то в блоке выводит неправильный логин и пароль, но если правильный, то в этом же блоке, появляется дубликат сайта, почему так, если в php коде, я написал переадресацию?

    HTML:
    1. <p>Вход на сайт</p>
    2.     <form method="POST">
    3.         <div><label><span>Логин</span><input class="login" name="login" type="text"></label></div>
    4.         <div><label><span>Пароль</span><input class="password" name="password" type="password"></label></div>
    5.                          
    6.         <input type="submit" class="auth" name="auth" value="Войти">
    7.     </form>
    8.  
    9.     <div id="wrongLogin"></div>
    10.                      
    11. <div class="registr"><a href="?action=registr">Или зарегистрируйтесь</div>
    12.  
    13.     var auth = document.querySelector('.auth');
    14.         auth.addEventListener('click', function(e) {
    15.             e.preventDefault();
    16.             var forma = e.target.parentElement;
    17.             var login = forma.elements.login.value;
    18.             var pass = forma.elements.password.value;
    19.  
    20.             xmlhttp=new XMLHttpRequest();
    21.                                          
    22.             xmlhttp.onreadystatechange=function() {
    23.                 if (this.readyState==4 && this.status==200) {
    24.                    wrongLogin.innerHTML=this.responseText;
    25.                 }
    26.             }
    27.                          
    28.                 xmlhttp.open("POST","./",true);
    29.                 xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
    30.                 xmlhttp.send("log="+login+"&password="+pass);              
    31.             })              
    32.                  
    33.                  
    PHP:
    1.     function login($login, $password) {
    2.      
    3.         $newLogin = str_replace(";","",$login);
    4.         $newLogin2 = str_replace(")","",$newLogin);
    5.         $newLogin3 = str_replace("'","",$newLogin2);
    6.      
    7.         $sqlPass = "SELECT `id`, `login`, `password`, `avatar`, `link_vk`, `reputation` FROM users WHERE login = :log";
    8.         $resPass = $this->db->prepare($sqlPass);
    9.         $resPass->bindValue(':log', trim($newLogin3), PDO::PARAM_STR);
    10.         $resPass->execute();
    11.      
    12.         $allRes = $resPass->fetchAll();
    13.      
    14.  
    15.         if(count($allRes) == 0) {
    16.             die('<p>Неверный логин или пароль</p>');
    17.         }
    18.      
    19.         $needPassword = $allRes[0]['password'];
    20.         $userId = $allRes[0]['id'];
    21.         $userLogin = $allRes[0]['login'];
    22.         $userAvatar = $allRes[0]['avatar'];
    23.         $userVk = $allRes[0]['link_vk'];
    24.         $userRep =$allRes[0]['reputation'];
    25.      
    26.      
    27.         $hash = $needPassword;
    28.  
    29.         if (password_verify($password, $hash)) {
    30.          
    31.             $salt = 'slovo';
    32.             $tokenstr = strval(date('s')) . $salt;
    33.             $token = md5($tokenstr);
    34.                                  
    35.             $sql = "UPDATE users SET token ='" . $token . "' WHERE login = :log2";
    36.             $queryToket = $this->db->prepare($sql);
    37.             $queryToket->bindValue(':log2', trim($newLogin3), PDO::PARAM_STR);
    38.             $queryToket->execute();
    39.                      
    40.             setcookie ("user", $token, time()+604800);
    41.                  
    42.             $_SESSION['token'] = $token;
    43.             $_SESSION['user'] = $userLogin;
    44.             $_SESSION['id'] = $userId;
    45.             $_SESSION['avatar'] = $userAvatar;
    46.             $_SESSION['vkontakte'] = $userVk;
    47.             $_SESSION['reputation'] = $userRep;
    48.             output_add_rewrite_var('token', $token);
    49.             header('Location: ./index.php?token='.$_SESSION['token']);
    50.          
    51.         }
    52.      
    53.         else {
    54.             die('<p>Неверный логин или пароль</p>');
    55.         }
    56.  
    57.      
    58.     }
     
  2. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.724
    Симпатии:
    358
    Код (Text):
    1. header('Location: ./index.php?token='.$_SESSION['token']);
    после этого попробуйте die(); поставить... хотя и так должно редиректить..
     
  3. rewuxiin

    rewuxiin Активный пользователь

    С нами с:
    17 апр 2012
    Сообщения:
    611
    Симпатии:
    87
    возвращай в ajax true (и если нужно ссылку куда переадресовать) и уже в js выполняй window.location.reload()
     
    Dimon2x нравится это.
  4. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.724
    Симпатии:
    358
    да, Вы правы.. чего то я протормозил... если ajax то на стороне клиента надо редиректить получается)
     
  5. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Код (Javascript):
    1. $(".auth").on( "click", function() {
    2.                 jQuery.ajax({
    3.                     url:      "", //Здесь вставлять URL своего Ajax-php скрипта-обработчика
    4.                     type:     "POST",
    5.                     dataType: "html",
    6.                     data: jQuery("#login").serialize(),
    7.                     success: function(response) {
    8.                         $('#wrongLogin').html(response);
    9.                    },
    10.                 error: function(response) {
    11.                
    12.                 }
    13.              });
    14. });
    Потом сделай так:
    HTML:
    1. <form method="POST" id='login'>
    2.         <div><label><span>Логин</span><input class="login" name="login" type="text"></label></div>
    3.         <div><label><span>Пароль</span><input class="password" name="password" type="password"></label></div>
    4.                        
    5.         <input type="submit" class="auth" name="auth" value="Войти">
    6.     </form>
    7. <div id="wrongLogin"></div>
    8.  
     
  6. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Добавил return true

    PHP:
    1. $_SESSION['vkontakte'] = $userVk;
    2.             $_SESSION['reputation'] = $userRep;
    3.             output_add_rewrite_var('token', $token);
    4.             //header('Location: ./index.php?token='.$_SESSION['token']);
    5.             return true;
    Код (Javascript):
    1. xmlhttp.onreadystatechange=function() {
    2.                 if (this.readyState==4 && this.status==200) {
    3.                     console.log(this.responseText);
    4.                     if(this.responseText == true) {
    5.                         window.location.reload();
    6.                     }
    7.                     else {
    8.                         wrongLogin.innerHTML=this.responseText;
    9.                     }
    10.                 }
    11.             }
    Но почему-то этот return не передаётся
     
  7. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Подключи jQuery модуль.
    Просто в начале страницы добавь:
    HTML:
    1. <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
     
  8. rewuxiin

    rewuxiin Активный пользователь

    С нами с:
    17 апр 2012
    Сообщения:
    611
    Симпатии:
    87
    Danil005, человек пишет на чистом js, на кой вы ему сразу пихаете jquery? да я понимаю с ним проще, но нэйтив знать нужно!
     
  9. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Я не хочу использовать jQuery
     
  10. rewuxiin

    rewuxiin Активный пользователь

    С нами с:
    17 апр 2012
    Сообщения:
    611
    Симпатии:
    87
    возвращать нужно в Json, если передавать больше одного параметра.
    ты же вот здесь смотрел прежде чем юзать js ajax?
     
  11. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Вместо return true, буду использовать echo true, так работает
     
  12. rewuxiin

    rewuxiin Активный пользователь

    С нами с:
    17 апр 2012
    Сообщения:
    611
    Симпатии:
    87
    как временное решение подойдет
     
  13. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    А зачем обязательно использовать Json?
     
  14. rewuxiin

    rewuxiin Активный пользователь

    С нами с:
    17 апр 2012
    Сообщения:
    611
    Симпатии:
    87
    https://php.ru/manual/book.json.html

    Удобно тем, что можно передавать много параметров, текст, да и вообще сформированные шаблоны, которые уже в js обрабатывать и показывать пользователю во всплывающих окнах или просто подменяя отображение в блоках страницы.
    вот, например, в вашем случае,можно не перезагружать страницу, а передать шаблон отображения аватара, имени пользователя и ссылки на профиль и подменить этими данными html блока с авторизацией.
     
    Dimon2x нравится это.
  15. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Dimon2x
    Зачем столько SESSION создавать если можно обойтись одним $_SESSION['id'] мне просто интересно) я не говорю что это не правильно.
     
  16. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    1. $_SESSION['avatar'] = $userAvatar нужен для того, что бы показывать у пользователя аватарку и больше не дёргать базу.
    2. $_SESSION['reputation'] = то же самое
     
  17. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Dimon2x
    Дак ты раз дернешь базу да и все, если будет $_SESSION['id'] а так если будешь делать как сейчас много сесий при проверке будешь всю сессию проверять могут возникнуть проблемы, например: сессия id есть а сессии avatar нету, и при проверке если юзер авторизован и нет сессии avatar то страница для юзера может не открытся. Мне кажется что так и будет.
     
  18. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    А куда может деться avatar?
     
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Dimon2x
    ну не знаю испарится!