problem mit mysql-klasse



  • Schönen guten Abend...

    Also ich habe eine Mysql_klasse in PHP geschrieben. Dieses speichert eine verbindung. Das objekt dieser Klasse dieser klasse reiche ich durch. erstmal gebe ich das objekt an eine anderes Objekt weiter, speicher dieses dann in einer Session und gehe dann mit "header(Location:..." weiter auf ne andere seite, starte da die session wieder will das objekt verwenden, aber die verbindungs-resource ist auf einmal 0.

    Leider ist das nicht in meinem Sinne. Weiß jemand was ich machen muss damit das funktioniert?

    Ich hänge mal die funktion dran. ^^ Und bitte keine sicherheitsbelehrung. Ich weiß dass man sich eine solche Klasse auch sparen kann...

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


  • Sqwan schrieb:

    erstmal gebe ich das objekt an eine anderes Objekt weiter

    Und dabei geht nichts verloren?

    lg, freakC++



  • ich weiß nicht genau. Denke schon. Eben diese Source...
    Hat iwas mit dem Scope zu tun habe ich gelesen.
    Leider versteh ich das nicht so wirklich.
    Eigentlich soll das eine Objekt doch nur das Mysql-Objekt haben um es benutzen zu können...


  • Mod

    Sqwan schrieb:

    speicher dieses dann in einer Session und gehe dann mit "header(Location:..." weiter

    In einer session werden alle Daten serialisiert. Resoucren lassen sich nicht serialisieren... Das ist dein Problem.



  • 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


Anmelden zum Antworten