Есть такая проблема, если логин и пароль не правильный, то в блоке выводит неправильный логин и пароль, но если правильный, то в этом же блоке, появляется дубликат сайта, почему так, если в php коде, я написал переадресацию? HTML: <p>Вход на сайт</p> <form method="POST"> <div><label><span>Логин</span><input class="login" name="login" type="text"></label></div> <div><label><span>Пароль</span><input class="password" name="password" type="password"></label></div> <input type="submit" class="auth" name="auth" value="Войти"> </form> <div id="wrongLogin"></div> <div class="registr"><a href="?action=registr">Или зарегистрируйтесь</div> <script> var auth = document.querySelector('.auth'); auth.addEventListener('click', function(e) { e.preventDefault(); var forma = e.target.parentElement; var login = forma.elements.login.value; var pass = forma.elements.password.value; xmlhttp=new XMLHttpRequest(); xmlhttp.onreadystatechange=function() { if (this.readyState==4 && this.status==200) { wrongLogin.innerHTML=this.responseText; } } xmlhttp.open("POST","./",true); xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') xmlhttp.send("log="+login+"&password="+pass); }) </script> PHP: function login($login, $password) { $newLogin = str_replace(";","",$login); $newLogin2 = str_replace(")","",$newLogin); $newLogin3 = str_replace("'","",$newLogin2); $sqlPass = "SELECT `id`, `login`, `password`, `avatar`, `link_vk`, `reputation` FROM users WHERE login = :log"; $resPass = $this->db->prepare($sqlPass); $resPass->bindValue(':log', trim($newLogin3), PDO::PARAM_STR); $resPass->execute(); $allRes = $resPass->fetchAll(); if(count($allRes) == 0) { die('<p>Неверный логин или пароль</p>'); } $needPassword = $allRes[0]['password']; $userId = $allRes[0]['id']; $userLogin = $allRes[0]['login']; $userAvatar = $allRes[0]['avatar']; $userVk = $allRes[0]['link_vk']; $userRep =$allRes[0]['reputation']; $hash = $needPassword; if (password_verify($password, $hash)) { $salt = 'slovo'; $tokenstr = strval(date('s')) . $salt; $token = md5($tokenstr); $sql = "UPDATE users SET token ='" . $token . "' WHERE login = :log2"; $queryToket = $this->db->prepare($sql); $queryToket->bindValue(':log2', trim($newLogin3), PDO::PARAM_STR); $queryToket->execute(); setcookie ("user", $token, time()+604800); $_SESSION['token'] = $token; $_SESSION['user'] = $userLogin; $_SESSION['id'] = $userId; $_SESSION['avatar'] = $userAvatar; $_SESSION['vkontakte'] = $userVk; $_SESSION['reputation'] = $userRep; output_add_rewrite_var('token', $token); header('Location: ./index.php?token='.$_SESSION['token']); } else { die('<p>Неверный логин или пароль</p>'); } }
Код (Text): header('Location: ./index.php?token='.$_SESSION['token']); после этого попробуйте die(); поставить... хотя и так должно редиректить..
возвращай в ajax true (и если нужно ссылку куда переадресовать) и уже в js выполняй window.location.reload()
Код (Javascript): $(".auth").on( "click", function() { jQuery.ajax({ url: "", //Здесь вставлять URL своего Ajax-php скрипта-обработчика type: "POST", dataType: "html", data: jQuery("#login").serialize(), success: function(response) { $('#wrongLogin').html(response); }, error: function(response) { } }); }); Потом сделай так: HTML: <form method="POST" id='login'> <div><label><span>Логин</span><input class="login" name="login" type="text"></label></div> <div><label><span>Пароль</span><input class="password" name="password" type="password"></label></div> <input type="submit" class="auth" name="auth" value="Войти"> </form> <div id="wrongLogin"></div>
Добавил return true PHP: $_SESSION['vkontakte'] = $userVk; $_SESSION['reputation'] = $userRep; output_add_rewrite_var('token', $token); //header('Location: ./index.php?token='.$_SESSION['token']); return true; Код (Javascript): xmlhttp.onreadystatechange=function() { if (this.readyState==4 && this.status==200) { console.log(this.responseText); if(this.responseText == true) { window.location.reload(); } else { wrongLogin.innerHTML=this.responseText; } } } Но почему-то этот return не передаётся
Подключи jQuery модуль. Просто в начале страницы добавь: HTML: <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
Danil005, человек пишет на чистом js, на кой вы ему сразу пихаете jquery? да я понимаю с ним проще, но нэйтив знать нужно!
возвращать нужно в Json, если передавать больше одного параметра. ты же вот здесь смотрел прежде чем юзать js ajax?
https://php.ru/manual/book.json.html Удобно тем, что можно передавать много параметров, текст, да и вообще сформированные шаблоны, которые уже в js обрабатывать и показывать пользователю во всплывающих окнах или просто подменяя отображение в блоках страницы. вот, например, в вашем случае,можно не перезагружать страницу, а передать шаблон отображения аватара, имени пользователя и ссылки на профиль и подменить этими данными html блока с авторизацией.
@Dimon2x Зачем столько SESSION создавать если можно обойтись одним $_SESSION['id'] мне просто интересно) я не говорю что это не правильно.
$_SESSION['avatar'] = $userAvatar нужен для того, что бы показывать у пользователя аватарку и больше не дёргать базу. $_SESSION['reputation'] = то же самое
@Dimon2x Дак ты раз дернешь базу да и все, если будет $_SESSION['id'] а так если будешь делать как сейчас много сесий при проверке будешь всю сессию проверять могут возникнуть проблемы, например: сессия id есть а сессии avatar нету, и при проверке если юзер авторизован и нет сессии avatar то страница для юзера может не открытся. Мне кажется что так и будет.