Ergebnis 1 bis 9 von 9
  1. #1
    eckocharlie ist offline Routinier
    registriert
    02-07-2006
    Beiträge
    296

    [PHP] Meinungsfrage / Was denkt ihr?!?

    Also, da ich hier irgendwie eine Sektion vermisse, in der man seinen Code vorstellen kann....mach ich es hier mal

    (Falls ihr keinen Sinn drin seht, ich lass mich eines besseren belehren *g*)

    Habe einen DatenbankPool "programmiert". Gedacht ist diese Klasse um auch bei "verschachtelten" Querys in mehreren whileSchleifen oder funktionen/Methoden immer eine eigene Verbndung zu haben. Bisher hatte ich aber somit für jede Anfrage eine Verbindung. Bei 50 Anfragen waren das 50 Verbindungen. Hätte ich EINMAL eine Verbindung aufgemacht, wäre bei einer Verschachtelung die Verbidung teils doppelbelegt, und somit nicht möglich.

    Die Klasse (leider noch nicht ganz dokumentiert):

    PHP-Code:
    <?php
    /**
     * This file is part of SLD.
     * 
     * @author    Marcel Nöhmeier <webmaster@park-to-fly.de>
     * @copyright 2006 by Marcel Nöhmeier
     * @version   $Id: DbCon.class.php", "v 1.0 2006/11/25 23:05:07
     * @access    public
     */
    final class Dbcp extends Base 
    {
        static private 
    $instance            false;

        private 
    $dbCons                        = array();

        private 
    $host                        "*******";
        private 
    $user                        "*********";
        private 
    $password                    "*******";
        private 
    $db                            "******";


        private function 
    __construct()
        {
            
    $this->show_messages true;
        }
        
        
    /**
         * Die "Singleton"-Methode
         *
         * @return object
         */
        
    static function init()
        {
            if ( !
    Dbcp::$instance )
            {
                
    Dbcp::$instance = new Dbcp();
            }
            return 
    Dbcp::$instance;
        }
        
        
    /**
         * Aufbau einer neuen Verbindung zum angegebenen Host
         *
         * @param String $host
         * @param String $user
         * @param String $password
         * @return mysql_resource
         */
        
    private function createNewCon$host$user$password )
        {
            return 
    mysql_connect$host$user$password );
        }
        
    /**
         * Setzen der Datenbank
         *
         * @param String $db
         * @param mysql_resource $link
         * @return mysql_resource
         */
        
    private function setDB$db$link )
        {
            if ( !
    mysql_select_db$db$link ) )
            {
                throw new 
    Exception("NoDbCon");
            }
            return 
    $link;
        }
        
        
    /**
         * Schritte:
         * 
         * 1. Verbindung zur DB und wählen der Verbindung
         * 2. $conKey: erstellen eines UniKey-Schlüssels um doppelte Keys im Array zu vermeiden
         * 3. Die Usagedefinition zuerst auf true setzen, damit keine andere SQL-Instanz diese nutzen kann
         * 4. Den Link für den Zugriff zuweisen
         *(4.1)Message ausgeben
         * 5. den Schlüssel für die Ident in der Sql Klasse zurückgeben
         *
         * @return String
         */
        
    private function registerDbCon()
        {
            
    $link $this->setDB$this->db$this->createNewCon$this->host$this->user$this->password ) );
            
    $conKey $this->makeID();
            
    $this->dbCons[$conKey]['usage'] = true;
            
    $this->dbCons[$conKey]['link'] = $link;
            
    $this->getMessage"Erstelle DB-Verbindung mit der ID: ".$conKey );
            return 
    $conKey;
        }
        
        
    /**
         * Verbindung zur Verwendung freigeben
         *
         * @param String $conKey
         */
        
    private function deregisterDbCon$conKey )
        {
            
    $this->dbCons[$conKey]['usage'] = false;
        }
        
        
    /**
         * Verbindungskennung setzen damit keine andere SQL Instanz diese Verwenden kann
         *
         * @param String $conKey
         */
        
    private function register$conKey )
        {
            
    $this->dbCons[$conKey]['usage'] = true;
        }
        
        private function 
    is_registered$conKey )
        {
            return ( isset( 
    $this->dbCons[$conKey]['usage'] ) ) ? $this->dbCons[$conKey]['usage'] : false;
        }

        public function 
    getRegisteredDbCon()
        {
            if ( isset( 
    $this->dbCons ) && is_array$this->dbCons ) && $this->array_is_filled$this->dbCons ) )
            {
                foreach ( 
    $this->dbCons as $key => $value )
                {
                    
    $this->getMessage"Prüfe Con mit der ID: ".$key );
                    if ( !
    $this->is_registered$key ) )
                    {
                        
    $this->register$key );
                        
    $this->getMessage"Con mit der ID: ".$key." wird absofort benutzt" );
                        return 
    $key;
                    }
                    else 
                    {
                        
    $this->getMessage"Con mit der ID: ".$key." wird schon benutzt" );
                    }
                }
            }
            return 
    $this->registerDbCon();
        }
        public function 
    getVariableRegisteredDbCon$host$user$password$db )
        {
            
    $link $this->setDB$db$this->createNewCon$host$user$password ) );
            
    $conKey $this->makeID();
            
    $this->dbCons[$conKey]['usage'] = true;
            
    $this->dbCons[$conKey]['link'] = $link;
            
            
    $this->getMessage"g" );
            return 
    $conKey;
        }
        public function 
    destroyVrCon$conKey )
        {
            if ( 
    mysql_close$this->dbCons[$conKey]['link'] ) )
            {
                unset( 
    $this->dbCons[$conKey] );
                return 
    true;
            }
            return 
    false;
        }
        public function 
    getConLink$conKey )
        {
            return ( 
    $this->dbCons[$conKey]['usage'] ) ? $this->dbCons[$conKey]['link'] : false;
        }
        public function 
    putRegisteredDbCon$conKey )
        {
            
    $this->getMessage"Con mit der ID: ".$conKey." wird nun nicht mehr benutzt und ist frei" );
            
    $this->deregisterDbCon$conKey );
        }
        
        private function 
    closeCon$conKey$link )
        {
            
    $this->getMessage"<span>Versuche DB mit dem Link [".$conKey."] => ".$link." zu schliessen!<br /></span>" );
            if ( @
    mysql_close$link ) )
            {
                
    $this->getMessage"<span>DB mit dem Link [".$conKey."] => ".$link." geschlossen!<br /></span>" );
                unset( 
    $this->dbCons[$conKey] );
                return 
    true;
            }
        }
        
        public function 
    __destruct()
        {
            foreach ( 
    $this->dbCons as $key => $value )
            {
                if ( 
    $this->closeCon$key$value['link'] ) )
                {
                    continue;
                }
            }
        }
    }
    ?>
    Das ganze ist eine Singleton Klasse. Gleich im vorraus, sollte es wirklich jemanden geben, dem diese Klasse nutzen sollte: Nimm sie :-)

    Was mir noch nicht gefällt ist, dass man nur eine Verbindung eintragen kann und nicht mehrere.

    Dazu hätte ich auch eine Frage an euch:

    Kann ich die Verbindungsdaten mehrere DB-Server in eine per htacces geschützte Datei eintragen und auslesen? Oder wäre das zu unsicher, oder gar "selbstmörderisch"? Oder wie verwalte ich mehrere Serverdaten?!? xml?



    Wer Fragen, Kritik oder sonstwas hat, nur bescheidgeben. Auf verlangen poste ich auch gerne die SQL Klasse.


    LG


    Marcel

  2. #2
    Avatar von skooli
    skooli ist offline König
    registriert
    08-01-2006
    Beiträge
    958

    AW: [PHP] Meinungsfrage / Was denkt ihr?!?

    wieso nicht am anfang des scriptes nur eine Datenbankverbindung aufmachen, alle Queries durch diese Verbindung schicken, und sie am Ende wieder schließen?

  3. #3
    eckocharlie ist offline Routinier
    registriert
    02-07-2006
    Beiträge
    296

    AW: [PHP] Meinungsfrage / Was denkt ihr?!?

    nehmen wir mal folgendes an:


    Schematisch geschrieben!!


    SELECT * FROM kunden

    while->datensätze

    //2. abfrage
    SELECT * FROM bestellungen WHERE kunden_id = $ds['id']

    while->datensätze
    echo datensatz



    Hier wirst du probleme bekommen, denn bevor die erste Abfrage durch ist, machst du eine neue auf. somit referenziert die eine verbindung auf 2 Abfragen. Bei mir hat er mit EINER Verbidung immer mit der 1. Anfrage aufgehört, sobald die 2. dazugekommen ist.

    Jetzt arbeitet er alles sauber ab, sogar bei einer sehr tiefen verschachtelung.

    Klar, du würdest nun hier mit nem Join kommen. Dieses Konstrukt war aber auch nur zur verdeutlichung gedacht. Es kommt ja öfter vor, das man in verschiedenen Funktionen/Methoden mehrere Abfragen hat. Da musst du eben auf sowas fast zurückgreifen.


    Hab mich da einfach auch mal an JAVA und C orientiert, da dort ja auch DatenbankPools verwendung finden.


    :o)


    LG

    Marcel

  4. #4
    Avatar von skooli
    skooli ist offline König
    registriert
    08-01-2006
    Beiträge
    958

    AW: [PHP] Meinungsfrage / Was denkt ihr?!?

    ich weiß nicht, ich habe noch nie ernsthaft eine Query in einer Schleife gebraucht, das kann man im grund immer zu einer zusammenbauen. Außerdem geht das von dir genannte beispiel durchaus, man muss sich das Result der Query halt in eine eigene variable holen bevor man die nächste Query absetzt

  5. #5
    eckocharlie ist offline Routinier
    registriert
    02-07-2006
    Beiträge
    296

    AW: [PHP] Meinungsfrage / Was denkt ihr?!?

    Naja...ich hab für SQL Abfragen ne eigene Klasse...somit sind die "results" IMMER ein einer eigenen Variable drin. Aber es gab/gibt trotzdem Probleme.

    Ich habe gestern die neue SQL-Klasse in Verbindung mit dem Pool eingesetzt und siehe da. 1. Wurde das alles viel schneller, 2. gab es keine Probleme bei den Abfragen und der Verarbeitung.

    Dazu wie gesagt kommt auch noch ein Handling für verschiedene DB-Server hinzu.
    Die Frage ist aber halt, wie kann ich am besten und am sichersten die Verbindungsdaten speichern um nicht in der PHP Datei ein mehr oder minder größeres Array per Hand zu schreiben. Und ich bin mir eben nicht sicher ob es nicht gefährlich ist, die Daten in einem txt File zu speichern.



    LG


    Marcel

  6. #6
    Avatar von skooli
    skooli ist offline König
    registriert
    08-01-2006
    Beiträge
    958

    AW: [PHP] Meinungsfrage / Was denkt ihr?!?

    als txt auf keinen fall - außer sie liegt nicht im htdocs verzeichnis. Normal ist eine php mit normalen variablen (oder array) das einfachste / schnellste, und man braucht ftp um da ranzukommen

    Naja...ich hab für SQL Abfragen ne eigene Klasse...somit sind die "results" IMMER ein einer eigenen Variable drin. Aber es gab/gibt trotzdem Probleme.
    ich mache das ähnlich und hatte noch nie solche Probleme - vielleicht auch weil ich keine queries in schleifen bau. Deswegen kann ich die Probleme nicht ganz nachvollziehen

    Ich habe gestern die neue SQL-Klasse in Verbindung mit dem Pool eingesetzt und siehe da. 1. Wurde das alles viel schneller, 2. gab es keine Probleme bei den Abfragen und der Verarbeitung.
    versuch mal von den queries in der schleife wegzukommen, du wirst feststellen dass das gleich nochmal viel schneller ist

  7. #7
    eckocharlie ist offline Routinier
    registriert
    02-07-2006
    Beiträge
    296

    AW: [PHP] Meinungsfrage / Was denkt ihr?!?

    Das Problem ist aber, das ich einfache "StatusQuery" habe..oder andere, einfache, nicht "Join"bare Querys, verbaut in Methoden die eben die ergebnisse von Abfragen modifizieren. Also verändern. Da müsste ich dann für jeden Fall einen anderen Query baun, und zusätzlich für jeden Fall, von einem "Oberfall" eine andere Methode. Ich programmier nun komplett ObjektOrientiert. Sprich, es gibt bei meinem PHP Script nur EINE Datei mit nem Eingang wie bei Java die main Methode. (Es kann auch mehrere Dateien geben die ausgeführt werden, jedoch ist bei diesen auch nur eine Methode vorhanden...also:

    <? $new = new Klasse( $_REQUEST ); ?>
    (Davor sind natürlich noch session_start(), error_reporting( E_ALL ), autoload() etc. Die sich ja nicht wirklich in eine Klasse packen lassen.)


    LG

    Marcel

    PS: Nun, ich will aber kein "dickes" Array in ne Klasse packen bzgl. der Verbindungsinfos*g*

  8. #8
    Avatar von skooli
    skooli ist offline König
    registriert
    08-01-2006
    Beiträge
    958

    AW: [PHP] Meinungsfrage / Was denkt ihr?!?

    PS: Nun, ich will aber kein "dickes" Array in ne Klasse packen bzgl. der Verbindungsinfos*g*
    naja, alle php-Projekte halten das eigentlich so, inklusive vBulleting, wBB und anderen große Teile - du hättest halt nicht die Daten für nur eine Verbindung da drin sondern für mehrere.

  9. #9
    eckocharlie ist offline Routinier
    registriert
    02-07-2006
    Beiträge
    296

    AW: [PHP] Meinungsfrage / Was denkt ihr?!?

    hmm......
    Na gut....einverstanden *g*
    Dann halt ins Array...

Ähnliche Themen

  1. [PHP] rename() löscht dateien...
    Von Tomas im Forum Serverseitige Programmierung
    Antworten: 2
    Letzter Beitrag: 17-03-2006, 17:09
  2. [PHP] shell_exec() ausgabe :<
    Von skooli im Forum Serverseitige Programmierung
    Antworten: 1
    Letzter Beitrag: 08-03-2006, 12:21
  3. [PHP] Datensatz löschen mit vorherigem CONFIRM
    Von Halla im Forum Serverseitige Programmierung
    Antworten: 4
    Letzter Beitrag: 08-01-2005, 10:34
  4. [PHP], [MYSQL] Update funktioniert nicht
    Von Tanja im Forum Serverseitige Programmierung
    Antworten: 12
    Letzter Beitrag: 03-09-2004, 15:46
  5. [PHP] seiten in tabellen öffnen?
    Von sauraus im Forum Serverseitige Programmierung
    Antworten: 9
    Letzter Beitrag: 23-08-2004, 08:22

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •