• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage zu meiner Session-Klasse

Mars@Gera

Mitglied
Mahlzeit,

ich bin gerade dabei meine Session-Klasse zu testen und stell fest, dass das löschen meiner Session mittels Memberfunktion nicht möglich ist ..
Hier ein Codeschnipsel dessen:
PHP:
class session{
    private $name;
    private $value;

    public function setSession($name, $value){
        if($_SESSION[$name]){
            $_SESSION[$name] = $value;
        }
    }

    // ...

    public function destroySession($name){
        unset($name);
        session_destroy();
    }
    
    // ..
}

kann mir jemand sagen, wieso diese nicht gelöscht wird?

Bekomme diese Meldung:
Warning: session_destroy(): Trying to destroy uninitialized session

MfG Marcel
 
Zuletzt bearbeitet:
Werbung:
ja das habe ich in der index.php gemacht ...
die Session "erzeuge" ich mittels
$_SESSION["name"] = new session();
 
Werbung:
Wird auf jedenfall erstellt, weil wenn ich z.B. in der class-datei nochmals session_stert() mache sagt der mir, das diese schon einmal gestartet wurde.

MfG Marcel
 
Werbung:
PHP:
//Session Klasse
class session{
    private $name;
    private $value;
    
    /**
     * ist Session gesetzt
     * @param:  Name
     */
    public function isIsset($name){
        return isset($_SESSION[$name]);
    }
    
    /**
     * enthält Session Daten
     * @param:  Name
     */
    public function isEmpty($name){
        return empty($_SESSION[$name]);
    }
    
    /**
     * starte eine neue Session
     * @param:  Name
     * @param:  Inhalt
     */
    public function setSession($name, $value){
        if($_SESSION[$name]){
            $_SESSION[$name] = $value;
        }
    }
    
    /**
     * setze Session-Name
     * @param:  Name
     */
    public function setName($name){
        $this->name = $name;
    }
    
    /**
     * setze Session-Inhalt
     * @param:  Inhalt
     */
    public function setValue($str){
        $this->value = $str;
    }
    
    /**
     * erhalte Session-Name
     */
    public function getName(){
        return $this->name;
    }
    
    /**
     * erhalte Session-Inhalt
     */
    public function getValue(){
        return $this->value;
    }
    
    /**
     * lösche eine Session
     * @param:  Name
     */
    public function destroySession($name){
        unset($name);
        session_destroy();
    }
}

PHP:
// z.B. beim Login
$_SESSION["SID"] = new session();
$_SESSION["PW"] = new session();
$_SESSION["SID"]->setName("SID");
$_SESSION["SID"]->setValue(session_id());
$_SESSION["PW"]->setName("PW");
$_SESSION["PW"]->setValue(md5($_POST["f_pass"]));

jetzt das entscheidende ... beim logout ... dort kommt die oben beschriebene Fehlermeldung zustande

PHP:
session::destroySession("SID");
session::destroySession("PW");

Ich weiss, das es ziemlich "sinnlos" ist die Werte der Session über Memberfunktionen zu machen, jedoch will ich nicht immer dies mit einem Construktor machen ... ;)

MfG Marcel
 
session_destroy() zerstört die gesamte Session. Das heißt, beim zweiten Aufruf der Funktion besteht keine Session mehr, die zerstört werden könnte. Das führt dann zu der Fehlermeldung.

Insgesamt finde ich das Design deiner session-Klasse etwas eigenartig. Ich poste nachher mal einen Alternativvorschlag.
 
alles klar ... also die Fehlermeldung ist weg .. ob es den gewünschten Effekt hat, welchen ich haben möchte, werde ich dann mal testen, wenn ich mit der folgenden Problematik fertig bin ... aber danke für deinen Lösungsvorschlag schonmal =)
 
Werbung:
Hier die leicht veränderte Variante einer Klasse, die ich früher schon mal gepostet habe.

Die Instanzen dieser Klasse werden selbst nicht in der Session gespeichert. Ich glaube, das ist es, was ich an deiner Variante eigenartig finde. Eine Klasse für den Zugriff auf Session-Daten ist selbst Teil der Session-Daten.

PHP:
<?php

/**
 * A container class for interfacing with session data using a namespace
 *
 * Usage example:
 *
 * <code>
 * session_start();
 * $sc = new Session_Container('myproject);
 *
 * $sc->set('core.user.id', $userId);
 *     // Meaning: $_SESSION[<namespace>]['core']['user']['id'] = $userId;
 *
 * $userId = $sc->get('core.user.id');
 *     // $userId = $_SESSION[<namespace>]['core']['user']['id'];
 *
 * // And so on...
 * </code>
 *
 * @todo This class isn't thoroughly tested
 * @author Marc Ermshaus <http://www.ermshaus.org/>
 * @license Public domain
 * @version 2011-03-02
 */
class Session_Container
{
    /**
     * @var string This container's namespace
     */
    protected $_namespace = '';

    /**
     * Creates a new container
     *
     * @param string $namespace Namespace in $_SESSION for this container
     */
    public function __construct($namespace = 'default')
    {
        $this->_namespace = $namespace;
    }

    /**
     * Returns a reference to the element in $_SESSION denoted by $keyParts
     *
     * @param array $keyParts
     * @throws Exception Element not found
     * @return mixed
     */
    protected function &_resolveKey(array $keyParts)
    {
        $parent = &$_SESSION[$this->_namespace];

        foreach ($keyParts as $part) {
            if (isset($parent[$part])) {
                $parent = &$parent[$part];
            } else {
                throw new Exception();
            }
        }

        return $parent;
    }

    /**
     * Set a key's value
     *
     * @param string $key
     * @param mixed $value
     */
    public function set($key, $value)
    {
        $keyParts = explode('.', $key);
        $leaveKey = array_pop($keyParts);

        $parent = &$_SESSION[$this->_namespace];

        foreach ($keyParts as $part) {
            if (!isset($parent[$part])) {
                $parent[$part] = array();
            }

            $parent = &$parent[$part];
        }

        $parent[$leaveKey] = $value;
    }

    /**
     * Get a key's value
     *
     * @param string $key
     * @return mixed
     */
    public function get($key)
    {
        $keyParts = explode('.', $key);

        try {
            $parent = $this->_resolveKey($keyParts);
        } catch (Exception $e) {
            $parent = null;
        }

        return $parent;
    }

    /**
     * Delete a key
     *
     * @param string $key
     * @return bool
     */
    public function delete($key)
    {
        $keyParts = explode('.', $key);
        $leaveKey = array_pop($keyParts);

        try {
            $parent = &$this->_resolveKey($keyParts);
        } catch (Exception $e) {
            return false;
        }

        unset($parent[$leaveKey]);
        return true;
    }

    /**
     * Get and delete a key
     *
     * @param string $key
     * @return mixed
     */
    public function pop($key)
    {
        $value = $this->get($key);
        $this->delete($key);
        return $value;
    }

    /**
     * Clear all session data contained in this namespace
     */
    public function clear()
    {
        unset($_SESSION[$this->_namespace]);
    }
}

Demo:

PHP:
<?php

require_once './Session_Container.php';

session_start();

$scFoo = new Session_Container('foo');
$scBar = new Session_Container('bar');

if (isset($_GET['action']) && isset($_GET['container'])) {
    switch ($_GET['container']) {
        case 'bar':
            switch ($_GET['action']) {
                case 'clear':
                    $scBar->clear();
                    break;
                case 'set':
                    $scBar->set('name', 'Mark van Bommel');
                    break;
            }
            break;
        
        case 'foo':
            switch ($_GET['action']) {
                case 'clear':
                    $scFoo->clear();
                    break;
                case 'set':
                    $randomData = new stdClass();
                    $randomData->test = 'xyz';
                    $randomData->hello = 'Hello World';

                    $scFoo->set('randomData', $randomData);
                    break;
            }
            break;
    }

    header('Location: ./' . basename(__FILE__));
}

?><!DOCTYPE html>

<html lang="en">

<head>
    <meta charset="utf-8" />
    <title>New</title>
</head>

<body>

    <h2>Actions</h2>
    <ul>
        <li><a href="?action=set&amp;container=foo">set (foo)</a></li>
        <li><a href="?action=clear&amp;container=foo">clear (foo)</a></li>
        <li><a href="?action=set&amp;container=bar">set (bar)</a></li>
        <li><a href="?action=clear&amp;container=bar">clear (bar)</a></li>
    </ul>

    <h2>Content of <var>$_SESSION</var></h2>
    <pre><?php    
    print_r($_SESSION);
    ?></pre>

</body>

</html>
 
Zurück
Oben