我正在努力创造一个"记住我"基于我通过stackoverflow找到的答案登录。
它似乎无法正常工作,登录后只需创建PHP Session
而不是创建PHP Session
和Cookie
。
index.php
:
include('./config.php');
include('./cookie-check.php');
include('./redirect.php');
print_r($_SESSION);
if(!isset($_SESSION['cookie']) && empty($_SESSION['user_is_loggedin'])) {
CheckCookieLogin();
if(isset($_SESSION['userID'])) {
?>
<p>Logged In</p>
<a href="./action.php?a=logout">Logout</a>
<?php
} else {
?>
<form method="post" action="./action.php?a=login">
<input name="formName" type="text" placeholder="username" autocomplete="off" autofocus required />
<input name="formPass" type="password" placeholder="username" autocomplete="off" required />
<button type="submit">login</button>
</form>
<?php
};
} else {
?>
<p>Logged In</p>
<a href="./action.php?a=logout">Logout</a>
<?php
};
?>
config.php
:
<?php
$currentPage = basename($_SERVER['PHP_SELF']);
session_start();
$users = new mysqli("localhost", "root", "######", "web_users");
if ($users->connect_errno) {
printf("Connect failed: %s\n", $users->connect_error);
exit();
};
?>
action.php
:
<?php
include('./config.php');
include('./better_crypt.php');
if(isset($_GET['a'])) {
$action = $_GET['a'];
if($action == 'login') {
$formName = $_POST['formName'];
$formPass = $_POST['formPass'];
$ip = $_SERVER['REMOTE_HOST'];
$checkName = $users->prepare("SELECT userID,userPass FROM users WHERE userName=? LIMIT 1");
$checkName->bind_param("s", $formName);
$checkName->execute();
$checkName->store_result();
if($checkName->num_rows > 0) {
$checkName->bind_result($userID,$userPass);
while($checkName->fetch()) {
if(hash_equals($userPass, better_crypt($formPass,$userPass))) {
$_SESSION['userID'] = $userID;
$_SESSION['user_is_loggedin'] = 1;
$cookiehash = md5(sha1($formName . $ip));
setcookie("uname",$cookiehash,time()+3600*24*365,'/','fmadev.fma.uk.com');
$remember = $users->prepare("UPDATE users SET login_session=? WHERE userID=?");
$remember->bind_param("si", $cookiehash,$userID);
$remember->execute();
$remember->close();
?>
<p>Logged In</p>
<?php
} else {
?>
<p>Invalid Password</p>
<?php
};
};
} else {
?>
<p>Invalid Username</p>
<?php
};
$checkName->close();
} else if($action == "logout") {
if(isset($_SESSION['userID'])) {
$userID = $_SESSION['userID'];
$logout = $users->prepare("UPDATE users SET login_session=null WHERE userID=?");
$logout->bind_param("i", $userID);
if($logout->execute()) {
$_SESSION['cookie'] = $uname;
setcookie("uname",$uname,0,'/','fmadev.fma.uk.com');
session_unset();
?>
<p>Logging out</p>
<?php
} else {
?>
<p>Unable to logout, try again...</p>
<?php
};
$logout->close();
} else {
?>
<p>You must be logged in first</p>
<?php
};
} else {
?>
<p>A valid action is required</p>
<?php
};
} else {
?>
<p>An action is required</p>
<?php }; ?>
cookie-check.php
:
<?php
function CheckCookieLogin() {
$uname = $_COOKIE['uname'];
if (!empty($uname)) {
$users = new mysqli("localhost", "root", "######", "web_users");
if ($users->connect_errno) {
printf("Connect failed: %s\n", $users->connect_error);
exit();
};
$check = $users->prepare("SELECT userID FROM users WHERE login_session=? LIMIT 1");
$check->bind_param("s", $uname);
$check->execute();
$check->store_result();
if($check->num_rows > 0) {
$_SESSION['user_is_loggedin'] = 1;
$_SESSION['cookie'] = $uname;
setcookie("uname",$uname,time()+3600*24*365,'/','fmadev.fma.uk.com');
$check->bind_result($userID);
while($check->fetch()) {
$_SESSION['userID'] = $userID;
};
};
$check->close();
};
};
?>
在此代码中是否有原因导致cookie未被创建?
答案 0 :(得分:0)
我通过IP而不是域名连接到网站,因此没有创建cookie。