Lige netop dette sidder jeg også og roder med, og har fået det til at virke med 'Procedural style' med en classe, det skulle virke men jeg er ikke helt færdig med det endnu. Denne stump code kræver en tabel 'test_sessions' med disse kolonner.: SID,UID,Displayname,IP,Resolved_IP,Browser,Viewing,Expires,Data
<?php
/**
* @author Jan Hansen
*/
class sessions {
public $life_time;
public $db_resource;
public $sessiontable;
function __construct($host,$username,$database,$password,$tableprefix) {
$this->sessiontable = $tableprefix."_sessions";
$this->db_resource = mysqli_connect($host,$username,$database,$password) or die("Can't connect to MySQL server! ");
$this->life_time = get_cfg_var("session.gc_maxlifetime");
session_set_save_handler(
array(&$this, "open"),
array(&$this, "close"),
array(&$this, "read"),
array(&$this, "write"),
array(&$this, "destroy"),
array(&$this, "gc")
);
}
# session open
function open($save_path, $session_name) {
$sql = "DELETE FROM `$this->sessiontable` WHERE `Expires` < UNIX_TIMESTAMP();";
mysqli_query($this->db_resource,$sql);
global $sess_save_path;
$sess_save_path = $save_path;
return true;
}
#session close
function close() {
mysqli_close($this->db_resource);
return true;
}
#session read
function read($sid) {
$data="";
$time = time();
$newsid = mysqli_real_escape_string($this->db_resource,$sid);
$sql = "SELECT `Data` FROM `$this->sessiontable` WHERE `SID` = '$newsid' AND `Expires` > $time";
$result = mysqli_query($this->db_resource,$sql);
$num = mysqli_num_rows($result);
if($num > 0) {
$row = mysqli_fetch_assoc($result);
$data = $row['Data'];
}
return $data;
}
#session write
function write($sid, $data) {
$time = time() + $this->life_time;
$newsid = mysqli_real_escape_string($this->db_resource,$sid);
$newdata = mysqli_real_escape_string($this->db_resource,$data);
$ip = getenv ("REMOTE_ADDR");
$resolved_ip = gethostbyaddr ($ip);
$browser = getenv ("HTTP_USER_AGENT");
if (strlen($_SERVER['QUERY_STRING']) > 0) {
$viewing = $_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING'];
} else {
$viewing = $_SERVER['PHP_SELF'];
}
$displayname = $_SESSION['disp'];
$uid = $_SESSION['uid'];
$sql = "REPLACE `$this->sessiontable` (`SID`,`Data`,`Expires`,`IP`,`Resolved_IP`,`Browser`,`Viewing`,`Displayname`,`UID`) VALUES ('$newsid','$newdata',$time,'$ip','$resolved_ip','$browser','$viewing','$displayname','$uid');";
$result = mysqli_query($this->db_resource,$sql) or die ("error replaceing");
return true;
}
function destroy($sid) {
$newsid = mysqli_real_escape_string($this->db_resource,$sid);
$sql = "DELETE FROM `$this->sessiontable` WHERE `SID` = '$newsid'";
mysqli_query($this->db_resource,$sql);
return true;
}
function gc() {
$sql = "DELETE FROM `$this->sessiontable` WHERE `Expires` < UNIX_TIMESTAMP();";
mysqli_query($this->db_resource,$sql);
return true;
}
function get_db_resource(){
return $this->db_resource;
}
}
?>
Det var classen, så følger index.php til at prøve med.
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Testside</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php
/**
* @author Jan Hansen
*/
function __autoload($class_name)
{
require_once($_SERVER['DOCUMENT_ROOT']."/classes/$class_name.php");
}
echo "test";
$sess = new sessions ("host","user","pass","database","test");
session_start();
$_SESSION['test'] = $_SESSION['test']+1;
echo $_SESSION['test'];
?>
</body>
</html>
Håber du kan bruge det til noget. Jeg har også prøvet med OOP ved at extende mysqli, det kan jeg ikke få til at virke selv den linie med echo "test"; bliver ikke vist så
2. Problem
Det har været et generelt ønske at php sessions skal kunne gemmes i databasen. Til det har jeg til hensigt at bruge PHPs indbyggede funktion, set_save_handler()......
Men jeg får hovedpine. Hvis jeg opretter en db forbindelse med mysql_pconnect() så har jeg ingen problemer med at skrive session data til database. Derimod, hvis jer bruger MySQLi eller mysql_connect() så virker det ikke...????
Tanken har slået mig at at det handler om persistent connection, men hvad fillen går man når man ikke har nogen persistent connection.
Jeg skal for go ordenskyld sige at jeg bruger MySQLi OOP og at connection link bliver tildelt funktioner, oop metoder, m.m via "global" lige i starten af funktioner. set_save_handler() er nemlig sær når det kommer til parameter.
Jeg har for sjov prøvet at lave db connection (MySQLi og mysql_connect()) linket i set_save_handler -funktionen "open" med den hjælper heller ikke noget
grunden til at jeg vil bruge MySQLi er pga. MySQLi understøtter transactioner - og dette skal jeg nemlig bruge. kunne også bruge det "gammeldags" metode( mysql_query("begin"); mysql_query("commit"); mysql_query("rollback"); )
men det virker nu lidt bøvlet når man kan andet - hvis man altså kan det...
Nogen ider?