У меня есть два веб-сайта, Один TLS и один не так, как это для одного клиента, но мне нужны сайты, чтобы поделиться друг с другом (и только друг с другом) общие данные для пользователей, заказы, счета и т. Д.Как сохранить данные сеанса в базе данных, а не в файловой системе?
Это обычно делается с данными $_SESSION
, но я, очевидно, не могу работать на других сайтах, и я обнаружил, что я могу хранить данные сеанса в базе данных (MySQL), а не в файловой системе.
Я выкопал и нашел This useful guide так же, как и этот старый, но useful guide. Я также нашел this guide, который имеет немного более современный MySQL.
Я написал класс интерфейса, но он работает только частично, он хранит данные сеанса в базе данных, но он не извлекает его. Я также использовал suggested method from the PHP manual.
Моя MySQL (копируемый из первых двух ссылок выше):
CREATE TABLE `sessions` (
`id` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`access` int(10) NOT NULL,
`data` text COLLATE utf8_unicode_ci NOT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDb DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Пожалуйста, обратите внимание: Прежде чем я покажу вам мой интерфейс класса, пожалуйста, знать, что connetion Db использует мой собственный пользовательский интерфейс и отлично работает сам по себе.
$sessionDBconnectionUrl
содержит сведения о соединении с базой данных сеанса, поскольку я занимаюсь сессиями отдельной базы данных с основного содержимого веб-сайта.
Мой интерфейс класса (как на основе всех приведенных выше ссылок)
<?php
/***
* Created by PhpStorm.
***/
class HafSessionHandler implements SessionHandler {
private $database = null;
public function __construct($sessionDBconnectionUrl){
if(!empty($sessionDBconnectionUrl) && file_exists($_SERVER['DOCUMENT_ROOT'].$sessionDBconnectionUrl)) {
require_once "class.dataBase.php";
// Instantiate new Database object
$this->database = new Database($sessionDBconnectionUrl);
}
else {
error_log("Session could not initialise class.");
}
}
/**
* Open
*/
public function open($savepath, $id){
$openRow = $this->database->getSelect("SELECT `data` FROM sessions WHERE id = ? LIMIT 1",$id);
if($this->database->selectRowsFoundCounter() == 1){
// Return True
return $openRow['data'];
}
else {
// Return False
return ' ';
}
/**
* Read
*/
public function read($id)
{
// Set query
$readRow = $this->database->getSelect('SELECT `data` FROM sessions WHERE id = ? LIMIT 1', $id,TRUE);
if ($this->database->selectRowsFoundCounter() > 0) {
return $readRow['data'];
} else {
error_log("could not read session id ".$id);
return '';
}
}
/**
* Write
*/
public function write($id, $data)
{
$access = time();
// Set query
$dataReplace[0] = $id;
$dataReplace[1] = $access;
$dataReplace[2] = $data;
if ($this->database->noReturnQuery('REPLACE INTO sessions(id,access,`data`) VALUES (?, ?, ?)', $dataReplace)) {
return TRUE;
} else {
return FALSE;
}
}
/**
* Destroy
*/
public function destroy($id)
{
// Set query
if ($this->database->noReturnQuery('DELETE * FROM sessions WHERE id = ? ', $id)) {
return TRUE;
} else {
return FALSE;
}
}
/**
* Close
*/
public function close(){
// Close the database connection
// If successful
if($this->database->dbiLink->close){
// Return True
return true;
}
// Return False
return false;
}
/**
* Garbage Collection
*/
public function gc($max)
{
// Calculate what is to be deemed old
$old = time() - $max;
// Set query
if ($this->database->noReturnQuery('DELETE * FROM sessions WHERE access < ?', $old)) {
return TRUE;
} else {
return FALSE;
}
}
public function __destruct()
{
$this->close();
}
}
Моя тестовая страница (написана с нуля!)
<?php
require "class.sessionHandler.inc.php";
$HSH = new HafSessionHandler("connection.session.dbxlink.php");
session_set_save_handler($HSH, TRUE);
session_start();
print "<p>Hello this is an index page</p>";
$_SESSION['horses'] = "treesx3";
$_SESSION['tiespan'] = (int)$_SESSION['tiespan']+7;
print "<p>There should be some session data in the database now. <a href='index3.php'>link</a></p>";
var_dump($_SESSION);
exit;
Выпуск:
Проверочные страницы, которые я запускаю, сохраняют данные в базе данных в порядке, но они, похоже, не извлекают данные,
У меня включено протоколирование ошибок и сообщения об ошибках PHP отсутствуют. Никаких критических ошибок MySQL не сообщается.
Почему это не работает?
Я думаю, ваши худшие проблемы - это совместное использование файлов cookie между доменами (да, на стороне клиента) ... – SparK
Почему? можете ли вы объяснить немного больше? – Martin
На двух сайтах будет использоваться страница передачи, поэтому все посещения торгового сайта с основного сайта будут осуществляться через страницу передачи, которая устанавливает передачу данных сеанса, прежде чем передавать пользователя на свою целевую страницу. – Martin