problem mit mysql-klasse


  • Mod

    Speichere einfach diedaten die du fuer das connect brauchst in der session.

    Du kannst in php eine klasse schreiben die sich serialisieren laesst und dann eben selbststaendig die connevtion wieder aufbaut.

    Prinzipiell klingt das alles aber wie ein falscher ansatz...



  • welcher ansatz wäre besser?


  • Mod

    Sqwan schrieb:

    welcher ansatz wäre besser?

    Ich war noch nie in einer Situation wo ich eine Datenbankverbindung serialisieren will. Ich kenne auch kein Framework wo dies ein Feature ist dass man anpreist/verwendet. Ab und zu ist es moeglich - dann liegt es aber an der technischen Infrastruktur und nicht weil man das Feature unbedingt haben wollte.

    Interessant ist deshalb: Warum denkst du dass es notwendig ist? Wieso ist eine Datenbankverbindung nicht immer die selbe? Worin unterscheiden sich die unterschiedlichen Verbindungen?



  • Naja, mir ist eigentlich relativ egal ob die seriell ist oder nicht.

    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.

    Da ich das design nicht gemacht habe, verstehe ich allerdings nicht warum das mysql_objekt nicht einfach global ist, wie es im Manual steht.

    Und ich verstehe nicht, warum man kein zweites Objekt erzeugen kann/soll/darf...

    Ich hab mittlerweile nur herausgefunden, das die verbindungsdaten nur einmalig bei einem Login geladen werden, und ab dann im Objekt zur verfügung stehen.

    Langsam verzweifel ich auch, denn ich kann kein Problem lösen, wenn ich nichts verändern darf 😞
    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...



  • 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