UPDATEPHP 세션 전용 (읽기/쓰기를 수행하는 클래스의 코드를 추가) 테이블
<?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;
}
}
?>
UPDATE 정보의 일부를 작성 : 나는 PHP에서 줄을 주석 처리했습니다. ini 파일을 사용하여 세션이 DB 대신 파일에 기록되도록하고 session_start()를 올바른 위치에 놓습니다. 그래서 다른 곳에서 코드를 배제 할 수있었습니다. 이 문제는 요구 사항 인 세션을 저장할 데이터베이스를 사용할 때만 발생합니다. 따라서 해결할 수있는 다른 아이디어가 있다면 알려주십시오. 감사.
ORIGINAL POST : 나는 어려움이 나를 도울 수있는 일을 기대하고, 여기에 무슨 일이 일어나고 있는지 알아내는 데 문제.
저는 데이터베이스에 내 세션 정보를 저장하는 php, mysql을 사용하고 있습니다. 앱은 localhost, vista에서만 실행됩니다. php.ini 파일에서 "session.save_handler = files"라인을 주석 처리하고 세션을 처리/쓰기하는 PHP 클래스를 사용하고 있습니다.
내 로그인 프로세스는 다음과 같습니다. 로그인을 통해 로그인 자격 증명을 제출하십시오. php. login.php는 loginprocess.php를 호출합니다. loginprocess.php는 사용자를 확인하고 유효한 세션이 새 세션을 시작하고 세션 변수에 데이터를 추가하면 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 필드, created_ts 필드 및 expires 필드에 데이터가 있지만 session_data 필드에는 아무것도 들어 있지 않으며 과거에는 내 모든 세션 데이터 저장되었습니다.
loginprocess.php에서 세션을 var_dump 할 수 있지만 데이터가 db 테이블에 존재하지 않습니다. 캐시를 사용하고 있습니까? 나는 나의 과자 등등을 맑게했다. 그러나 변화 없음.
왜 세션 ID가 테이블에 기록되지만 실제 세션 데이터는 아닌가?
모든 아이디어는 높이 평가됩니다. 감사.
우리는 세션 데이터를 저장하는 데 사용하는 프로세스에 대해 더 많이 알아야 할 것입니다. 데이타베이스에 세션을 저장하고 있다고 말하면 세션 읽기/쓰기 핸들러가 어떻게 설정되어 있습니까? – Johrn
게시물을 읽기/쓰기를 수행하는 클래스 객체로 업데이트했습니다. 당신의 도움을 주셔서 감사합니다. – Ronedog