Intereting Posts
Поиск диапазона дат для текущей недели, месяца и года Захват текста между квадратными скобками в PHP Почему мой php-код не подключается к моей удаленной базе данных MySql? Какая разница в ./ ../ / Разделить строку на предложения с использованием регулярного выражения Сервисный локатор в Zend Framework 2 Неустранимая ошибка HelperSet не найдена при настройке Doctrine Console (с помощью CodeIgniter) Каков наилучший способ отразить результаты из базы данных в html-код в PHP? Исходный код PHP в файлах UTF-8; как правильно интерпретировать? Базовый PHP API-интерфейс Vimeo Advanced API есть ли способ отправить данные из разных форм одновременно с помощью только одной кнопки отправки? скрипт образца php для разбивки на страницы Ошибка wsdl: нет правильного разделения заголовков и документа Lamp / Cakephp: потоковое изображение: двоичный 0x00 заменен на 0x20 Как исправить память, израсходованную с помощью PHPExcel?

Сессия не работает

Привет, я создал систему входа в систему, но по какой-то причине она не работает, я запускаю сеанс после некоторого входа, а затем сделал чек, если сеанс 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 для входа в систему, но независимо от того, вошли ли вы в систему или нет, вы можете свободно перемещаться между ними

Solutions Collecting From Web of "Сессия не работает"

Вы должны вызвать 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 – если сеансы включены, а один существует.