Wie speichere ich Sitzungsdaten in einer Datenbank anstatt im Dateisystem?

Ich habe zwei Websites, eine ist TLS und eine ist nicht, beide sind für denselben Client, aber ich benötige die Websites, um gemeinsame Daten für @ miteinander (und nur untereinander) zu teile users, Aufträg, Konte etc

Dies würde normalerweise mit @ gemacht werd$_SESSION data, aber ich kann diese offensichtlich nicht auf anderen Websites verwenden, und ich habe festgestellt, dass ich Sitzungsdaten nicht im Dateisystem, sondern in einer Datenbank (MySQL) speichern kann.

Ich habe mich umgegraben und @ gefundDiese nützliche Anleitung sowie das ältere aberebrauchsanweisu. Ich fand auchdieser Ratgeber Das hat etwas mehr aktuelles MySQL.

Ich habe eine Interface-Klasse geschrieben, aber sie funktioniert nur teilweise. Sie speichert die Sitzungsdaten in der Datenbank, ruft sie jedoch nicht ab. Ich habe auch das @ benut empfohlene Methode aus dem PHP-Handbuch.

My MySQL (wie aus den ersten beiden obigen Links kopiert):

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;

Bitte beachten Sie Bevor ich Ihnen meine Interface-Klasse zeige, wissen Sie bitte, dass die Db-Verbindung mein eigenes, maßgeschneidertes Interface verwendet und an sich perfekt funktioniert.

Das$sessionDBconnectionUrl enthält die Verbindungsdetails zur Sitzungsdatenbank, da ich Sitzungen in einer anderen Datenbank als die Inhalte der Hauptwebsite verwalte.

Meine Schnittstellenklasse (basierend auf allen obigen Links)

<?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();
    }

}

Meine Testseite (von Grund auf neu geschrieben!)

<?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;

Problem

Die Testseiten, die ich ausführe, speichern die Daten in der Datenbank, aber sie scheinen die Daten nicht abzurufen.

Ich habe die Fehlerprotokollierung aktiviert und es werden keine PHP-Fehler gemeldet. Es werden keine kritischen MySQL-Fehler gemeldet.

Warum funktioniert es nicht?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage