【发布时间】:2009-09-21 06:50:08
【问题描述】:
我正在使用 ADOdb。出于某种原因,实际的 $db 没有被导入到“写入”函数中。
该函数旨在导入$db 的实际值。相反,它为$db 分配了一个空值:
<?php
// load ADODB class
include(DIR_WS_CLASSES . "adodb5/adodb.inc.php");
$db = NewADOConnection(DB_TYPE);
$db->Connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_DATABASE);
class SessionManager {
var $life_time;
function SessionManager(){
global $db;
// Read the maxlifetime setting from PHP
$this->life_time = get_cfg_var("session.gc_maxlifetime");
// Register this object as the session handler
session_set_save_handler(array(&$this, "open"),
array(&$this, "close"),
array(&$this, "read"),
array(&$this, "write"),
array(&$this, "destroy"),
array(&$this, "gc"));
}
function open($save_path, $session_name){
global $sess_save_path;
global $db;
$sess_save_path = $save_path;
return true;
}
function close(){
global $db;
return true;
}
function read($id){
global $db;
// Set empty result
$data = '';
// Fetch session data from the selected database
$time = time();
$newid = $db->qstr($id, get_magic_quotes_gpc());
$sql = "SELECT session_data
FROM sessions
WHERE session_id = $newid
AND expires > $time";
$rs = $db->Execute($sql) or die($db->ErrorMsg());
$a = $rs->RecordCount();
if($a > 0){
$data = $rs->fields['session_data'];
}
return $data;
}
function write($id, $data){
global $db;
// Build query
$time = time() + $this->life_time;
$newid = $db->qstr($id, get_magic_quotes_gpc());
$newdata = $db->qstr($data, get_magic_quotes_gpc());
$sql = "REPLACE sessions
(session_id, session_data, expires)
VALUES($newid, $newdata, $time)";
$rs = $db->Execute($sql) or die($db->ErrorMsg());
return TRUE;
}
function destroy($id){
global $db;
// Build query
$newid = $db->qstr($id, get_magic_quotes_gpc());
$sql = "DELETE FROM sessions
WHERE session_id = $newid";
$db->Execute($sql) or die($db->ErrorMsg());
return TRUE;
}
function gc(){
// Garbage Collection
global $db;
// Build DELETE query. Delete all records that passed expiration time
$sql = "DELETE FROM sessions
WHERE expires < UNIX_TIMESTAMP()";
$db->Execute($sql) or die($db->ErrorMsg());
// Always return TRUE
return true;
}
}
// initialize session
$sess = new SessionManager();
session_start();
?>
为什么实际的$db 没有在'write'函数中导入?
我该如何解决这个问题?
【问题讨论】:
-
你怎么知道 $db 是空的?你得到什么错误信息?充实后,发布的代码可以正常工作。请发布一个最小的测试用例。您还可以尝试使用调试器(例如 Eclipse+PDT+XDEBUG)来跟踪正在发生的事情。请注意,全局变量是邪恶的;更好的解决方案是将
$db成员添加到对象write是一种方法。 -
您能告诉我们您遇到了什么错误吗?是不是说某个函数调用了未定义的对象。或者是其他东西。我完全相信您在某处分配了 $db 其他东西,或者您正在关闭连接。类似的东西。告诉我们您遇到的错误。
-
我收到致命错误:在第 64 行对 E:\applications\myfurni\webroot\includes\classes\sessions\sessions.php 中的非对象调用成员函数 qstr()
-
Nirmal 请参阅下面的第二个答案。在您的代码中检查它。我相信它会解决你的问题。
-
据我所知 session_start();应该在页面顶部。