Я написал целый новый скрипт для хранения моих сеансов в базе данных, и все, кажется, работает. По какой-то причине, когда я открываю страницу, переменные сеанса уходят.Сессионные переменные сбрасываются при открытии новой страницы
Я предполагаю, что это имеет какое-то отношение ко мне, используя session_start(); в верхней части страницы, в то время как я использую session_start ($ session_id); на моем скрипте, чтобы начать сеанс. Сбрасывает ли это session_id?
Это главный PHP скрипт, который устанавливает переменные/сессий
<?php
session_start();
include($_SERVER['DOCUMENT_ROOT']. '/../db_connect.php');
if (!Isset($_SESSION['crecketgaming_usergroup'])){
$_SESSION['crecketgaming_usergroup'] = "Guest";
}
try {
$conn = new PDO("mysql:host=$servername:3307;dbname=$dbname", $username, $password);
}catch(PDOException $e){
echo "Connection failed: " . $e->getMessage();
}
onLoad($conn);
function onLoad($conn){
$session_id = "";
if(isset($_COOKIE['Crecketgaming_sessionid'])){
$time = time();
$session_id = $_COOKIE['Crecketgaming_sessionid'];
$addrip = $_SERVER['REMOTE_ADDR'];
$sql = "SELECT * FROM sessions WHERE session_id = :sessionid AND ip = :addrip";
$sth = $conn->prepare($sql);
$sth->bindParam(':sessionid', $session_id, PDO::PARAM_STR);
$sth->bindParam(':addrip', $addrip, PDO::PARAM_STR);
if($sth->execute()){
}else{
echo "error";
}
$rowcount = $sth->rowCount();
$row = $sth->fetch();
$userid = $row['user_id'];
//echo $row['user_id'];
if ($rowcount > 0) {
} else {
$session_id = storeUID($conn);
}
} else {
$session_id = storeUID($conn);
}
if($session_id !== "") {
if($userid === NULL){
}else{
//echo $userid;
setSessionDetails($conn, $userid);
}
}
}
function storeUID($conn){
$addrip = $_SERVER['REMOTE_ADDR'];
$session_id = createUID(100);
$time = time();
if(setcookie("Crecketgaming_sessionid", $session_id, mktime(). time()+60*60*24*30)){
$agent = $_SERVER['HTTP_USER_AGENT'];
$ip = $ip = $_SERVER['REMOTE_ADDR'];
$sql = "INSERT INTO sessions (session_id, ip, time) VALUES (:sessionid, :addrip, :time)";
$sth = $conn->prepare($sql);
$sth->bindParam(':sessionid', $session_id, PDO::PARAM_STR);
$sth->bindParam(':addrip', $addrip, PDO::PARAM_STR);
$sth->bindParam(':time', $time, PDO::PARAM_INT);
$sth->execute();
}
return $session_id;
session_start($session_id);
}
function createUID($length) {
$chars = "abcdefghijkmnopqrstuvwxyz";
srand((double)microtime()*1000000);
$i = 0;
$pass = '' ;
while ($i < $length) {
$num = rand() % 33;
$tmp = substr($chars, $num, 1);
$pass = $pass . $tmp;
$i++;
}
return $pass;
}
function setSessionDetails($conn, $userid) {
session_start($session_id);
session_id($session_id);
$sql = "SELECT * FROM users WHERE user_ID = :user_ID";
$sth = $conn->prepare($sql);
$sth->bindParam(':user_ID', $userid);
$sth->execute();
$row = $sth->fetch();
$_SESSION['crecketgaming_usergroup'] = $row['Usergroup'];
$_SESSION['crecketgaming_username'] = $row['Username'];
$_SESSION['crecketgaming_userid'] = $row['user_ID'];
}
?>
И в верхней части моей страницы индекса, например, это мой единственный код PHP:
<?php
session_start();
include($_SERVER['DOCUMENT_ROOT']. '/../db_connect.php');
include($_SERVER['DOCUMENT_ROOT']. '/includes/page_load.php');
include($_SERVER['DOCUMENT_ROOT']. '/includes/check_session.php');
?>
Это называется в верхней части страницы. db_connect содержит мои данные подключения к серверу, page_load подсчитывает количество раз, когда ip-адрес обновляет страницу, а check_session - это файл, который был показан выше.
Я проверил, и если я ставлю
echo $_SESSION['crecketgaming_userid']; //outputs "1"
echo $_SESSION['crecketgaming_usename ']; //outputs "crecket"
exit;
В нижней части check_session.php это показывает идентификатор 1, например. Но на странице индекса или любой странице, если на то есть они все пусты, как будто никто не вошел в систему.
Так что мой вопрос: session_start(); удалить предыдущие сеансы, как я это делаю. Я прочитал, что он запускает или возобновляет сеанс, но я ничего не видел о идентификаторах сеанса.
Я как бы новичок в php, поэтому, если кто-нибудь увидит что-то, что можно улучшить в любом месте, скажите мне.
Похоже, page_load.php или check_session.php фактически отбрасывает сохраненные сеансы. Попробуйте добавить session_start() в верхнюю часть этих тем и протестировать его. – MrTechie
@MrTechie У них обоих уже есть это наверху, мне сказали сделать это на каждой странице некоторое время назад – Crecket