Привет, я создал систему входа в систему, но по какой-то причине она не работает, я запускаю сеанс после некоторого входа, а затем сделал чек, если сеанс isset, и если сеанс не более 1 часа:
это мой скрипт входа в index.php:
<?php require 'mysql.php'; if(isset($_SESSION["username"]) && time() - $_SESSION["CREATED"] > 3600){ session_start(); session_unset(); session_destroy(); } if(isset($_SESSION["username"]) && time() - $_SESSION["CREATED"] < 3600){ header('Location: main.php'); } if (isset($_POST["login"])){ $username = $_POST["username"]; $password = $_POST["password"]; $stmt = $connect->prepare("SELECT username, password FROM users WHERE username=? "); $stmt->bind_param("s", $username); $stmt->execute(); $result = $stmt->get_result(); $rowcount = $result->num_rows; if ($rowcount > 0){ while ($row = $result->fetch_assoc()) { if ($row["username"] == $username && $row["password"] == $password){ if(!isset($_SESSION)) { session_start(); } $_SESSION["username"] = $username; $_SESSION["usertype"] = $row["usertype"]; $_SESSION["userid"] = $row["id"]; $_SESSION["CREATED"] = time(); header('Location: main.php'); } else { $error_msg2 = "Username or password does not mach"; $error2 = "error"; } } } else { $error_msg2 = "No such user"; $error2 = "error"; } echo $error_msg2; $stmt->close(); $connect->close(); } ?>
и это код main.php:
if(isset($_SESSION["username"]) && time() - $_SESSION["CREATED"] > 3600){ session_start(); session_unset(); session_destroy(); header('Location: index.php'); }
поэтому вы входите в систему, перенаправляясь на main.php, и если сеанс установлен, u не должен иметь доступ к index.php, потому что если вы попробуете u и сеанс не истекли, вы будете перенаправлены обратно main.php с main ifph сеанс истек, вы будете перенаправлены обратно на index.php для входа в систему, но независимо от того, вошли ли вы в систему или нет, вы можете свободно перемещаться между ними
Вы должны вызвать session_start
в любом случае – он заполняет $_SESSION
со значениями. Также достаточно отменить $_SESSION['username']
, не нужно уничтожать весь сеанс – PHP может позаботиться об этом. Вот код, который должен работать:
index.php
<?php require 'mysql.php'; session_start(); if (isset($_SESSION['username'])) { if ($_SESSION['CREATED'] < 3600) { header('Location: main.php'); exit; } unset($_SESSION['username']); } if (isset($_POST['username']) && isset($_POST['password'])) { $username = $_POST['username']; $password = $_POST['password']; $stmt = $connect->prepare('SELECT username, password FROM users WHERE username=? LIMIT 1'); $stmt->bind_param('s', $username); $stmt->execute(); $result = $stmt->get_result(); $rowcount = $result->num_rows; if ($rowcount > 0) { $row = $result->fetch_assoc(); if ($row['username'] == $username && $row['password'] == $password) { $_SESSION['username'] = $username; $_SESSION['usertype'] = $row['usertype']; $_SESSION['userid'] = $row['id']; $_SESSION['CREATED'] = time(); header('Location: main.php'); exit; } else { $error_msg2 = 'Username or password does not mach'; $error2 = 'error'; } } else { $error_msg2 = 'No such user'; $error2 = 'error'; } echo $error_msg2; $stmt->close(); $connect->close(); }
с<?php require 'mysql.php'; session_start(); if (isset($_SESSION['username'])) { if ($_SESSION['CREATED'] < 3600) { header('Location: main.php'); exit; } unset($_SESSION['username']); } if (isset($_POST['username']) && isset($_POST['password'])) { $username = $_POST['username']; $password = $_POST['password']; $stmt = $connect->prepare('SELECT username, password FROM users WHERE username=? LIMIT 1'); $stmt->bind_param('s', $username); $stmt->execute(); $result = $stmt->get_result(); $rowcount = $result->num_rows; if ($rowcount > 0) { $row = $result->fetch_assoc(); if ($row['username'] == $username && $row['password'] == $password) { $_SESSION['username'] = $username; $_SESSION['usertype'] = $row['usertype']; $_SESSION['userid'] = $row['id']; $_SESSION['CREATED'] = time(); header('Location: main.php'); exit; } else { $error_msg2 = 'Username or password does not mach'; $error2 = 'error'; } } else { $error_msg2 = 'No such user'; $error2 = 'error'; } echo $error_msg2; $stmt->close(); $connect->close(); }
main.php
session_start(); if (!isset($_SESSION['username']) || time() - $_SESSION['CREATED'] > 3600){ unset($_SESSION['username']); header('Location: index.php'); exit; }
сsession_start(); if (!isset($_SESSION['username']) || time() - $_SESSION['CREATED'] > 3600){ unset($_SESSION['username']); header('Location: index.php'); exit; }
Вы должны вызвать session_start (), прежде чем сможете использовать $ _SESSION.
<?php require 'mysql.php'; session_start(); if(isset($_SESSION["username"]) && time() - $_SESSION["CREATED"] > 3600){ session_unset(); session_destroy(); }
У меня есть предложение. Создайте функцию проверки сеанса.
function sessionValidate($username,$id=NULL) { $status = session_status(); if($status == PHP_SESSION_NONE) { //There is no active session session_start(); } if(!isset($_SESSION[$username])) { return false; } $id = $_SESSION[$roleid]; if((time()- $_SESSION["created"]) >= 3600) { session_destroy(); return false; } return $id; }
и проверить его на каждой странице или использовать его на титульной странице.
if(!($userid=sessionValidate($username))) { error_log("No session logging out ...."); header('Location: index.php'); }
ОБНОВИТЬ ::
Определение
session_status
– возвращает текущий статус сеанса
Возвращаемые значения
PHP_SESSION_DISABLED – если сеансы отключены.
PHP_SESSION_NONE – если сеансы включены, но не существует.
PHP_SESSION_ACTIVE – если сеансы включены, а один существует.