ОБНОВЛЕНИЕ (добавлен код для класса, который выполняет чтение / запись)
<?php
error_reporting(E_ALL);
class dbSession
{
function dbSession($gc_maxlifetime = "", $gc_probability = "", $gc_divisor = "")
{
if ($gc_maxlifetime != "" && is_integer($gc_maxlifetime)) {
@ini_set('session.gc_maxlifetime', $gc_maxlifetime);
}
if ($gc_probability != "" && is_integer($gc_probability)) {
@ini_set('session.gc_probability', $gc_probability);
}
if ($gc_divisor != "" && is_integer($gc_divisor)) {
@ini_set('session.gc_divisor', $gc_divisor);
}
$this->sessionLifetime = ini_get("session.gc_maxlifetime");
session_write_close();
session_set_save_handler(
array(&$this, 'open'),
array(&$this, 'close'),
array(&$this, 'read'),
array(&$this, 'write'),
array(&$this, 'destroy'),
array(&$this, 'gc')
);
register_shutdown_function('session_write_close');
@session_start();
}
function open($save_path, $session_name)
{
$mySQLHost = "localhost";
$mySQLUsername = "username";
$mySQLPassword = "password";
$mySQLDatabase = "rst_sessions";
$link = mysql_connect($mySQLHost, $mySQLUsername, $mySQLPassword);
if (!$link) {
die ("Could not connect to database!");
}
$dbc = mysql_select_db($mySQLDatabase, $link);
if (!$dbc) {
die ("Could not select database!");
}
return true;
}
function close()
{
mysql_close();
return true;
}
function read($session_id)
{
$result = @mysql_query("
SELECT
session_data
FROM
session_data
WHERE
session_id = '".$session_id."' AND
http_user_agent = '".$_SERVER["HTTP_USER_AGENT"]."' AND
session_expire > '".time()."'
");
if (is_resource($result) && @mysql_num_rows($result) > 0) {
// return found data
$fields = @mysql_fetch_assoc($result);
// don't bother with the unserialization - PHP handles this automatically
return $fields["session_data"];
}
return "";
}
function write($session_id, $session_data)
{
// first checks if there is a session with this id
$result = @mysql_query(" SELECT *FROM session_data WHERE session_id = '".$session_id."'");
if (@mysql_num_rows($result) > 0)
{
$result = @mysql_query(" UPDATE session_data
SET
session_data = '".$session_data."',
session_expire = '".(time() + $this->sessionLifetime)."',
account_id = '" . $_SESSION['account']['account_id'] . "',
username = '" . $_SESSION['users']['username'] . "',
report_logo_path = '". $_SESSION['path_to_report_logo'] . '/' . $_SESSION['report_logo_img'] . "',
report_footer_all = '". $_SESSION['report_footer_all'] . "',
report_footer_summary= '". $_SESSION['report_footer_summary'] . "'
WHERE
session_id = '".$session_id."'
");
// if anything happened
if (@mysql_affected_rows())
{
return true;
}
}
else // if this session id is not in the database
{
$sql = "
INSERT INTO
session_data
(
session_id,
http_user_agent,
session_data,
session_expire,
account_id,
username
)
VALUES
(
'".serialize($session_id)."',
'".$_SERVER["HTTP_USER_AGENT"]."',
'".$session_data."',
'".(time() + $this->sessionLifetime)."',
'".$_SESSION['account']['account_id']."',
'".$_SESSION['users']['username']."'
)
";
$result = @mysql_query($sql);
if (@mysql_affected_rows())
{
// return an empty string
return "";
}
}
// if something went wrong, return false
return false;
}
}
?>
ОБНОВЛЕНИЕ: я раскомментировал строку в файле php.ini, чтобы разрешить запись сеанса в файл, а не в БД, и я поставил session_start () в правильных местах. Так что я смог исключить код в других местах. Эта проблема возникает только при использовании базы данных для хранения сеансов, что является обязательным требованием, поэтому, если есть какие-либо другие идеи, которые могут помочь мне решить эту проблему, дайте мне знать. Благодарю.
ОРИГИНАЛЬНЫЙ ПОЧТА:
Мне трудно понять, что здесь происходит, в надежде, что кто-нибудь мне поможет.
Я использую php, MySQL хранит информацию о моем сеансе в базе данных. Приложение работает только на localhost, Vista. В файле php.ini я закомментировал строку «session.save_handler = files» и использую класс php для обработки записи / чтения сеанса и т. Д.
Мой процесс входа в систему такой: отправить учетные данные для входа через login.php. login.php вызывает loginprocess.php. loginprocess.php проверяет пользователя, и если valid запускает новый сеанс и добавляет данные в переменные сеанса, то он перенаправляет в index.php.
Вот проблема. на странице loginprocess.php есть несколько сессий, которые устанавливаются как $ _SESSION ['account_id'] = $ account_id; и т.д., но когда я иду в index.php и делаю var_dump($_SESSION)
, он просто говорит "array () empty" Однако, если я сделаю var_dump($_SESSION)
в loginprocess.php, непосредственно перед строкой перенаправления header("Location: ../index.php");
, тогда он покажет все данные в переменной сеанса. Если я загляну в базу данных, где хранится информация о сеансе, то есть данные в поле session_id, поле creation_ts и поле expires, но в поле session_data ничего нет внутри, и в прошлом это поле, где все мои данные сеанса был сохранен.
Как я могу иметь возможность var_dump сеанса в loginprocess.php, но данные не существуют в таблице БД, использует ли она какое-то кэширование? Я очистил свои куки и т. Д., Но без изменений.
Почему session_id записывается в таблицу, а фактические данные сеанса - нет?
Любые идеи приветствуются. Спасибо.