problem mit mysql-klasse



  • und was kann ich da tun?





  • freakC++ schrieb:

    vielleicht das

    http://php.net/manual/de/function.serialize.php

    lg, freakC++

    php.net schrieb:

    Der zu serialisierende Wert. serialize() kann mit allen Typen umgehen, ausgenommen mit dem resource-Typ

    Wieso erzeugst du nicht einfach ein neues Objekt? Unter Verwendung von mysql_pconnect sollte das auch kein Problem darstellen.

    LG



  • Schad!

    Naja, bei einem neuen Objekt, sind halt alle gespeicherten Attribute weg. Aber so mache ich das auch!

    lg, freakC++



  • <?php
    	class cmysql
    	{
    		var $mysql_host;
    		var $mysql_user;
    		var $mysql_pass;
    		var $mysql_base;
    		var $mysql_ress;
    
    		function __construct($host,$user,$pass,$base)
    		{
    			$this->mysql_host = $host;
    			$this->mysql_user = $user;
    			$this->mysql_pass = $pass;
    			$this->mysql_base = $base;
    
    			$this->connect();
    		}
    		private function connect()
    		{
    			$this->mysql_ress = mysql_connect($this->mysql_host,$this->mysql_user,$this->mysql_pass,true);
    			mysql_select_db($this->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;
    		}
    	}
    ?>
    

    Spätestens so sollte es doch eigentlich gehen oder nicht?
    tut es aber nicht 😞



  • Hallo,

    es ist nicht effizient bei jedem Query eine neue Connection zu erzeugen! Was spricht dagegen ein neues cmysql-Objekt zu erstellen?

    VlG



  • weil ich daten brauche die das objekt enthält. Ich will ja auch nicht bie jedem Query eine neue erzeugen... Ich will nur erstmal den fehler los werden. Aber auch mit immer neu erzeugen gehts nicht.



  • mysql-klassen sind doch das beste beispiel für singletons? leider vermiss ich dies pattern im source... könnt ihr mich nicht einmal glücklich machen 😞



  • ich will nicht wissen wieso jmd. mysql klassen serialisieren will! soll ich euch was sagen? es ist mir vollkommen gleich! es gibt gutbezahlte studenten, informatiker und sonstige kasperl die dafür zuständig sind sich darüber gedanken zu machen. ich als codeäffchen bin es nicht. da ich mich jetzt in meinen affenstall zurück ziehe, wünsche ich euch auch weiterhin viel spaß beim misthaufen wälzen :p

    tschüss dudies ➡



  • rageQuit schrieb:

    mysql-klassen sind doch das beste beispiel für singletons? leider vermiss ich dies pattern im source... könnt ihr mich nicht einmal glücklich machen 😞

    Was ist denn an mysql_klasse singleton? Sie ist eben nicht global, und man kann 1000 Objekte erstellen. Damit sind beide notwendigkeiten nicht erfüllt.

    mal abgesehen davon hilft mir das grade nicht. Wieso kann ich nicht neu verbinden?



  • Sqwan schrieb:

    Sie ist eben nicht global, und man kann 1000 Objekte erstellen.

    ähm, verwendet deine app mehr als einen db-server? würd mich schwer wundern...

    Sqwan schrieb:

    Wieso kann ich nicht neu verbinden?

    am besten verbindest dich bei jedem query und schließt danach die verbindung wieder! dann bist die probleme und mich los



  • Sorry... Habe ich versucht bei jedem Query zu verbinden auch wieder zu schließen. Geht aber nicht.

    Bisher verwende ich tatsächlichen einen DB Server und bisher 2 Datenbanken.
    Dabei soll eine davon später mal auf einen zweiten server.
    Frag mich nicht nach dem Sinn. Ich versuch einfach nur das Problem zu lösen...


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

Anmelden zum Antworten