Las aplicaciones están en distintos servidores de la red.
Estoy usando session_set_save_handler. Buscando por muchos lados encontré que era la mejor solución, guardar las sesiones en mysql.
El problema es que cuando redirecciona al index.php no tengo la session guardada y no puedo acceder a los datos de session, pero si me guarda los datos en mysql.
Creo que el mayor problema es que no se como utilizar estas clases...
![Confundido](http://static.forosdelweb.com/fdwtheme/images/smilies/confused.png)
Si alguien puede explicarme como utilizarla estaría muy agradecido. Es decir como utilizar los datos una vez almacenados.
Gracias de antemano.
Estoy usando estas clases:
session_data.php
Código PHP:
<?php
class SessionData
{
private $dbHost = 'localhost';
private $dbUser = 'root';
private $dbPass = 'prueba';
private $dbName = 'login';
private $dbTable = 'sessions';
private $db;
public function __construct(mysqli $db = null) {
if(isset($db))
{
$this->db = $db;
}
else
{
$this->db = new mysqli(
$this->dbHost,
$this->dbUser,
$this->dbPass
);
if($this->db->connect_errno)
{
throw new Exception($this->db->connect_error);
}
}
}
public function get($id) {
$sql = "SELECT `data` FROM `{$this->dbName}`.`{$this->dbTable}` " .
"WHERE `id` = ?";
if($stmt = $this->db->prepare($sql))
{
if($stmt->bind_param('s', $id))
{
if($stmt->execute())
{
$stmt->bind_result($data);
if($stmt->fetch())
{
return $data;
}
return '';
}
error_log($this->stmt->error);
}
error_log($this->stmt->error);
}
error_log($this->db->error);
return '';
}
public function set($id, $data) {
$sql = "REPLACE INTO `{$this->dbName}`.`{$this->dbTable}` " .
"(`id`, `data`, `time`) VALUES (?, ?, NOW())";
if($stmt = $this->db->prepare($sql))
{
if($stmt->bind_param('ss', $id, $data))
{
if($stmt->execute() and $stmt->affected_rows)
{
return true;
}
else
{
error_log($stmt->error);
}
}
else
{
error_log($stmt->error);
}
}
else
{
error_log($this->db->error);
}
return false;
}
public function delete($id) {
$sql = "DELETE FROM `{$this->dbName}`.`{$this->dbTable}` " .
"WHERE `id` = ?";
if($stmt = $this->db->prepare($sql))
{
if($stmt->bind_param('s', $id))
{
if($stmt->execute())
{
return true;
}
else
{
error_log($stmt->error);
}
}
else
{
error_log($stmt->error);
}
}
else
{
error_log($this->db->error);
}
return false;
}
public function clean($seconds) {
$sec = (int) $seconds;
$sql = "DELETE FROM `{$this->dbName}`.`{$this->dbTable}` " .
"WHERE `time` < (NOW() - INTERVAL $sec SECOND)";
if($this->db->query($sql))
{
return true;
}
error_log($this->db->error);
return false;
}
// public function createTable($print = false) {
// $sql = <<<EOD
// CREATE TABLE IF NOT EXISTS `{$this->dbName}`.`{$this->dbTable}` (
// `id` varchar(255) NOT NULL COMMENT 'session ID',
// `data` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'serialized session array',
// `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
// PRIMARY KEY (`id`),
// KEY `time` (`time`)
// ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
// EOD;
// if($print)
// {
// return $sql;
// }
// else
// {
// $this->db->query($sql);
// if($this->db->errno)
// {
// user_error($this->db->error);
// return false;
// }
// }
// return true;
// }
}
?>
Código PHP:
<?php
require_once('inc/session_data.php');
//require_once('session_data.php');
class SessionHandler {
private $sd;
//private $seconds = '3600';
public function __construct(SessionData $sd=null) {
if(isset($sd))
{
$this->sd = $sd;
}
else
{
try
{
$this->sd = new SessionData();
}
catch(Exception $e)
{
throw new Exception($e);
}
}
}
public function open($path, $name) {
return true;
}
public function close() {
return true;
}
public function read($id) {
return $this->sd->get($id);
}
public function write($id, $data) {
return $this->sd->set($id, $data);
}
public function gc($seconds) {
return $this->sd->clean($seconds);
}
public function destroy($id) {
return $this->sd->delete($id);
}
public function __destruct() {
session_write_close();
}
}
?>
Código PHP:
<?php
//require_once'session_handle.php';
require_once'inc/session_handle.php';
try
{
$sh = new SessionHandler();
}
catch(Exception $e)
{
error_log((string)$e);
die('Session initialization failed');
}
session_set_save_handler(
array($sh, 'open'),
array($sh, 'close'),
array($sh, 'read'),
array($sh, 'write'),
array($sh, 'destroy'),
array($sh, 'gc')
) or die("Session save handler failed");
register_shutdown_function('session_write_close');
session_start();
?>
Código PHP:
include('inc/conectLDAP.php');
if($ds){
$info=ldap_buscar(0,"cn",$_GET['user']);
if($info['count'] > 0){
if($info[0]['carlicense'][0]==$_GET['dni'] ){
$log=ldap_autenticar($info[0]['dn'],trim($_GET['pass']));
if($log==1){
//session_destroy();
require_once('inc/session_prueba.php');
$_SESSION['uname']=$_GET['user'];
//permisos
for($i=0;$i<count($info[0]['employeetype'])-1;$i++){
$apps[$i]=$info[0]['employeetype'][$i];
}
// if(in_array("ADMIN",$apps)){
// echo "<script>alert('".htmlspecialchars(SID)."');</script>";
// echo "<script>location.href = 'http://".ADMIN."/login.php?externo&classid=".$_GET['pass']."&user=".$_GET['user']."';</script>";
// }
$_SESSION['apps']=$apps;
$_SESSION['logued']=true;
$_SESSION['nombre']=$info[0]['displayname'][0];
//$isd=session_id();
//redireccionamiento
//echo "<script>location.href = 'http://".host."/?id=".htmlspecialchars(SID)."';</script>";
echo "<script>location.href = 'http://".host."';</script>";
}else{
echo error_auth;
echo "<script>$('input').val('');</script>";
return false;
}
}else{
echo error_auth;
echo "<script>$('input').val('');</script>";
return false;
}
}else{
echo no_user;
echo "<script>$('input').val('');</script>";
return false;
}
}else{
echo noldap;
}