GÜNCELLEME (okuma / yazma yapar sınıfı için kod eklendi)
<?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;
}
}
?>
GÜNCELLEME: Ben oturumu yerine DB bir dosyaya yazılı izin vermek için php.ini dosyasındaki satırı uncommented ettik, ve ben sağ noktalar üzerinde session_start () koymak. Yani diğer noktalar kod ekarte etmek mümkün oldum. Bir gerekliliktir oturumları, saklamak için bir veritabanı kullanırken bana bu sorunu çözmek yardımcı olabilir orada başka bir fikir varsa, bana bildirin böylece bu sorun yalnızca oluşur. teşekkürler.
ORIGINAL POST: I'm having difficulty figuring out what's going on here, hoping some one can help me out.
Ben mysql veritabanında benim oturum bilgi depolamak, php kullanarak edilmiştir. Uygulama sadece localhost, Vista üzerinde çalışıyor. Php.ini dosyasında ben "session.save_handler = Dosyaları" hattı üzerinden yorumladı ve yazar / vb okur oturumu işlemek için bir php sınıfını kullanıyorum
Benim giriş işlemi şudur: login.php yoluyla oturum açma bilgilerini gönderin. login.php loginprocess.php çağırır. loginprocess.php kullanıcıyı doğrular ve geçerli yeni bir oturum başlatır ve oturum vars veri ekler, o zaman index.php yönlendirir.
İşte sorun bu. loginprocess.php sayfa $ _SESSION ['account_id'] = $ account_id gibi set olsun oturumu vars bir grup var; vs ama ben index.php gitmek ve ne zaman bir var_dump($_SESSION)
sadece "array () boş" diyor. Ancak, yönlendirme hat header("Location: ../index.php");
o oturum değişkeni tüm verileri gösterir hemen önce, loginprocess.php bir var_dump($_SESSION)
yaparsanız. Ben oturum bilgilerin depolandığı veritabanı bakarsanız, orada veri session_id alanında olduğu alan created_ts ve alanını sona eriyor, ancak session_data alan bunun içinde bir şey vardır ve geçmişte bu alanda nerede tüm oturum verileri saklandı.
Nasıl loginprocess.php de oturumu var_dump mümkün olabilir, ancak veriler bir tür önbelleğe kullanarak, db tablosunda mevcut değil mi? Ben, vb çerezlerimi, temizlenir .. ama değişim yok.
Neden session_id, bir tabloya yazılıyor, ama gerçek oturum veri yok?
Herhangi bir fikir takdir edilmektedir. Teşekkürler.