我寫了一個全新的腳本來將我的會話存儲在數據庫中,並且一切似乎都正常。出於某種原因,每當我打開頁面時,會話變量都消失了。打開新頁面時會話變量重置
我假設這與我使用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的底部,它顯示ID 1爲例。但在索引頁面或任何頁面上的事情,他們都是空的,就好像沒有人登錄。
所以我的問題是session_start();按照我的方式刪除以前的會話。我讀過它開始或恢復會話,但我從來沒有看到有關會話ID的任何內容。
我是一種新的PHP,所以如果任何人看到的東西要改善的地方,請告訴我。
看起來像page_load.php或check_session.php實際上是刪除存儲的會話。嘗試將session_start()添加到這些頂部,並對其進行測試。 – MrTechie 2015-04-03 14:28:01
@MrTechie他們都已經在頂部有這個,我被告知在前一頁的每一頁都做這個 – Crecket 2015-04-03 14:30:53