Session_set_save_handler не пишет в базу данных

В настоящее время я изучаю php и пытаюсь записать данные сеанса в свою базу данных без успеха.
У меня есть настройки с Apache24, средой PHP 7 и базой данных Postgresql.
Когда я создаю экземпляр sessionhandling учебный класс ($sess = new sessionhandling) в моем другом файле PHP ничего не записывается в базу данных. Однако, когда я передаю переменную и вызываю функцию записи ($sess->write), данные записываются в базу данных.

(Надеюсь, что это не является дубликатом любых других поднятых вопросов. Сделал много поисков в Stackoverflow и Google, но не нашел ответов, которые решают мою проблему)

Мой код обработчика сеанса выглядит следующим образом:

    <?php
Include(dirname(__DIR__).'\Userstories\db\Connection.php');
class sessionhandling extends Connecting implements SessionHandlerInterface {
public function __construct(){

// Set handler to overide SESSION

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');

// Start the session
session_start();
session_write_close;

}

public function open($save_path, $id) {
if(self::get()->connect()) {
return true;
} else {
return false;
}
}

public function close() {
if(self::get()->connect()->pdo = Null) {
return true;
} else {
return false;
}
}

public function read($id) {
//$pdo = Connecting::get()->connect();
$ipdo = self::get()->connect();
$q_udata = "SELECT data FROM sessions WHERE id=:id";
$stmt=$ipdo->prepare($q_udata);
$stmt->bindvalue(':id', $id);
$stmt->execute();

if($stmt->execute()) {
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$ipdo = NULL;
return $row['data'];
} else {
$ipdo = NULL;
return '';
}

}

public function write($id, $data){
$id = (string) $id;
$data = (string) $data;
$access = time();
$ipdo = self::get()->connect();
$c_id = "SELECT id FROM sessions WHERE id=:id";
$stmt=$ipdo->prepare($c_id);
$stmt->bindvalue(':id', $id);
$stmt->execute();
$idarray=$stmt->fetch(PDO::FETCH_ASSOC);
$row_id = $idarray['id'];

if(empty($row_id)) {
$sessionids = 'INSERT INTO sessions(id, data, access) VALUES(:id, :data, :access)';
$stmt = $ipdo->prepare($sessionids);
$stmt->bindvalue(':id', $id);
$stmt->bindvalue(':access', $access);
$stmt->bindvalue(':data', $data);
$stmt->execute();
session_write_close();
} else {

$rep_data = "UPDATE sessions SET data = :data, access = :access WHERE id = :id";
$stmt=$ipdo->prepare($rep_data);
$stmt->bindvalue(':id', $id);
$stmt->bindvalue(':access', $access);
$stmt->bindvalue(':data', $data);
$stmt->execute();
session_write_close();
}

if($stmt->execute()) {
$ipdo = NULL;
return true;
} else {
$ipdo = NULL;
return false;
}
}

public function destroy($id) {
$ipdo = self::get()->connect();
$del_data = "DELETE FROM sessions WHERE id =:id";
$stmt = $ipdo->prepare($del_data);
$stmt->bindvalue(':id', $id);
$stmt->execute();
if($stmt->execute()) {
$ipdo = NULL;
return true;
} else {
$ipdo = NULL;
return false;
}
}

public function gc($max) {
$old = time() - $max;

$ipdo = self::get()->connect();
$cleanup = "DELETE * FROM sessions WHERE access < :old";
$stmt = $ipdo->prepare($cleanup);
$stmt->bindvalue(':old', $old);
$stmt->execute();
if($stmt->execute()) {
$ipdo = NULL;
return true;
} else {
$ipdo = NULL;
return false;
}
}}

?>

Когда я удаляюimplements SessionHandlerInterface‘Сеанс обрабатывает класс и удаляет параметры $ save_path, $ id из открытой функции, я получаю следующую ошибку: «Предупреждение: session_start (): не удалось прочитать данные сеанса: user (path:) в C: \ Users \ Public \ Server \» Apache24 \ htdocs \ Userstories \ sessionhandling.php в строке 19 «

Рекомендуется ли определять $ save_path при использовании DB для обработки сеансов? Если так, каким должен быть $ save_path?

Любые советы о том, как заставить мой обработчик сеанса писать в БД, очень ценятся.

0

Решение

Я выполнил работу, изменив мою функцию чтения на эту и убедившись, что строка возвращается:

public function read($id) {
//$pdo = Connecting::get()->connect();
$ipdo = self::get()->connect();
$q_udata = "SELECT data FROM sessions WHERE id=:id";
$stmt=$ipdo->prepare($q_udata);
$stmt->bindvalue(':id', $id);
$stmt->execute();

if($stmt->execute()) {
$row = $stmt->fetch(\PDO::FETCH_ASSOC);
$ipdo = NULL;
$data = $row['data'];
return (string) $data;
} else {
$ipdo = NULL;
return '';
}

}

Я знаю, что это было указано в других сообщениях, но я думал, что мой $data = $row['data'] вернет строку в первую очередь.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]