problem mit mysql-klasse



  • Hallo,

    überhaupt nicht hübsch, aber sollte so in etwa funktionieren

    <?php 
        class cmysql 
        {        
            private $mysql_ress;
            function __construct($host,$user,$pass,$base) 
            { 
                $_SESSION['mysql_host'] = $host;
                $_SESSION['mysql_user'] = $user;
                $_SESSION['mysql_pass'] = $pass;
                $_SESSION['mysql_base'] = $base;
    
                $this->connect(); 
            } 
            private function connect() 
            { 
                if (isset($_SESSION['mysql_host'])&&
                    isset($_SESSION['mysql_user'])&&
                    isset($_SESSION['mysql_pass'])&&
                    isset($_SESSION['mysql_base']))
                {
                   $this->mysql_ress = mysql_connect($_SESSION['mysql_host'],$_SESSION['mysql_user'],$_SESSION['mysql_pass'],true); 
                   mysql_select_db($_SESSION['mysql_base'], $this->mysql_ress); 
                } 
            } 
            function query($sql) 
            { 
                $this->connect(); 
                return mysql_query($sql,$this->mysql_ress); 
            } 
            function fetch_object($query) 
            { 
                return mysql_fetch_object($query); 
            } 
            function num_rows($query) 
            { 
                return mysql_num_rows($query); 
            } 
            function show_db() 
            { 
                return $this->mysql_base; 
            } 
        } 
    ?>
    

    VlG


  • Mod

    Sqwan schrieb:

    Ich habe >= 2 Datenbanken. Ich habe >= 2 Objekte. Diese Objekte übergebe ich an ein weiteres Objekt, welches die verbindungen verwalten soll. Also daten über die Objekte zwischen >=2 DBs hin und her schaufelt. Die Objekte benutze ich in 2 Dateien. Deshalb habe ich die in die session geschrieben.

    Dann schreib die ID rein die du brauchst um die passende DB Connection per Factory erstellen zu können.

    Meine aufgabe ist quasi, veränder nur die mysql_klasse so das es geht, und lass vom rest die finger... Das ist im mom meine Situation...

    http://php.net/manual/en/language.oop5.magic.php

    __wakeup und __sleep

    Da ist sogar ein passendes Beispiel.



  • OK... Ich versteh das schlafen legen noch nicht so ganz. Was bringt mir das return aus dem beispiel.

    Ich versuch mir was mit der Factory zu basteln.
    Hmmz Beispiel werde ich testen wenn ich das mit der Factory nicht hinbekomme...


  • Mod

    Sqwan schrieb:

    OK... Ich versteh das schlafen legen noch nicht so ganz. Was bringt mir das return aus dem beispiel.

    __sleep returned ein array aus variablen die serialisiert werden sollen und die beim unserialize wieder geladen werden.

    In dem Beispiel sind das eben server, username, password, db. Diese Variablen werden serialisiert und beim unserialize wieder in das Objekt zurück geschrieben. Danach wird __wakeup aufgerufen. Im __wakeup kannst du dann einfach connect() aufrufen - da du ja die Verbindungsdaten noch alle hast.

    bei dir wäre das in etwa:

    function __sleep() {
      return array('mysql_user', 'mysql_pass', 'mysql_base', mysql_host');
    }
    
    function __wakeup() {
      $this->connect();
    }
    


  • ^^ okay... ich habe schlecht formuliert... Muss ich mir die returnten variablen selber speichern oder passiert das allein ?



  • Hallo,

    beim Aufruf von serialize($Object) wird die magical __sleep aufgerufen!

    $myObj = new cmysql;
    $_SESSION['myObj'] = serialize($myObj);
    
    unserialize($S_SESSION['myObj']); // in deinem Fall wird die Verbindung wieder hergestellt, da bei unserialize die magical __wakeup aufgerufen wird.
    

    VlG


  • Mod

    Sqwan schrieb:

    ^^ okay... ich habe schlecht formuliert... Muss ich mir die returnten variablen selber speichern oder passiert das allein ?

    Du lieferst nur die Namen der Variablen die serialisiert werden sollen. Alles andere macht PHP. Sowohl das serialisieren als auch das deserialsieren und auch das zuweisen, etc.


  • Mod

    hmmz schrieb:

    $myObj = new cmysql;
    $_SESSION['myObj'] = serialize($myObj);
    
    unserialize($S_SESSION['myObj']); // in deinem Fall wird die Verbindung wieder hergestellt, da bei unserialize die magical __wakeup aufgerufen wird.
    

    $_SESSION serialisiert und deserialisiert selber.



  • Hallo,

    also reicht eine Zuweisung des Object an die Session-Variable?

    Ich hab's von folgendem Beispiel auf php.net abgeleitet (Achtung, gekürzt):

    if (!isset($_SESSION['myObj'])) {
        $myObj = new MyClass();
    
        echo "\t\n\nNow serialize and unserialize object\n";
        $myObj = unserialize(serialize($myObj));
    
        //Store object in session
        $_SESSION['myObj'] = serialize($myObj);
    
    } else {
        //if myobj was stored
        $myObj_loaded = unserialize($_SESSION['myObj']);
        unset($_SESSION['myObj']);
    }
    

    VlG


  • Mod

    hmmz schrieb:

    also reicht eine Zuweisung des Object an die Session-Variable?

    ja.

    wäre sonst ja ziemlich unpraktisch.



  • ok, das wusst' ich nicht! Danke 👍

    VlG



  • Aus Zeitmangel noch nicht getestet... Mach ich aber heut abend.

    @hmmz... Genau das automatische Serialisieren war ja das prob. Weil man Mysql_Verbindungen nicht serialisieren kann...

    Dennoch vielen dank euch beiden für die Mühe...



  • Update:

    __sleep und __wakeup funktionieren super... Vielen dank euch beiden. Habt mir sehr geholfen...


Anmelden zum Antworten