Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Verständnisproblem bei Beispielcode

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Verständnisproblem bei Beispielcode

    Hi Ihr PHProfis!

    Ich beschäftige mich seit kurzem mit PHP und habe mir deshalb 2 Bücher zugelegt und vollziehe gerade die Beispielprojekte aus der NetBeans-IDE nach.

    Mein betrachtetes Projekt heißt AirAlliance. Dort gibt es eine Klasse namens "itinerarymanager.php". In dieser Klasse wird zuerst die Datenbankverbindung initialisiert. Später greifen andere Klassen auf Funktionen dieser Klasse zu, um DB-Abfragen abzusetzen.

    Der Teil den ich nicht so richtig verstehe, liegt in der Funktion "initDB()":

    PHP-Code:
    function initDB(){

    /* Get Sectors from session */   
        
    if(! isset($_SESSION['databaseURL'])){
                include(
    "conf/conf.php");
                
    $dbConf = new AAConf();
                
    $databaseURL $dbConf->get_databaseURL();
                
    $databaseUName $dbConf->get_databaseUName();
                
    $databasePWord $dbConf->get_databasePWord();
                
    $databaseName $dbConf->get_databaseName();
                    
                    
    //Set DB Info. in-session
                
    $_SESSION['databaseURL']=$databaseURL
                
    $_SESSION['databaseUName']=$databaseUName
                
    $_SESSION['databasePWord']=$databasePWord
                
    $_SESSION['databaseName']=$databaseName;
            
            
            
                
    $connection mysql_connect($databaseURL,$databaseUName,$databasePWord);
                    
    // or die ("Error while connecting to localhost");
                
    $db mysql_select_db($databaseName,$connection);
                    
    //or die ("Error while connecting to database");
            
                
    $rowArray;
                
    $rowID 1;
                
    $query "SELECT * FROM Sectors";
                
    $result mysql_query($query);
                while(
    $row mysql_fetch_array($result)){    
                        
    $rowArray[$rowID] = $row['Sector'];   
                        
    $rowID $rowID +1;
                    }  
                    
                    
    //Update the session with the sectors.
                
    $_SESSION['sectors']=$rowArray;    
            
                
    mysql_close($connection);
            }
        
    $databaseURL $_SESSION['databaseURL'];
        
    $databaseUName $_SESSION['databaseUName'];
        
    $databasePWord $_SESSION['databasePWord'];
        
    $databaseName $_SESSION['databaseName']; 

        
    $connection mysql_connect($databaseURL,$databaseUName,$databasePWord);
            
    //or die ("Error while connecting to host");
        
    $db mysql_select_db($databaseName,$connection);
            
    //or die ("Error while connecting to database");
        
    return $connection;

    Warum werden die Werte der 4 Variablen $databaseURL bis $DatabaseName erst aus der Konfigurationsdatei geladen, dann in Session-Objekte geschrieben und anschließend mit den Werten der Session-Objekte wieder neu initialisiert?

    Also in der Kurzform:

    $a = 5;
    $b = $a;
    $a = $b;

    ???

    Für den Brückenbau ans andere Ufer wäre ich sehr verbunden

    Grüße, Lars

  • #2
    du hast die if-Abfrage außer Acht gelassen ..

    nur wenn es $_SESSION['databaseURL'] NICHT gibt, wird die Verbindung initialisiert - im anderen Fall entnimmt er NUR die Daten den Session-Variablen ...

    damit es aber in beiden Varianten klappt sieht der Code so aus ..

    um es mit deinen Zahlen zu sagen
    PHP-Code:
    if ($b ist NICHT bekannt) {
       
    $a 5;  // irgendwo logisch, dass er dann erstmal die Werte für $b irgendwo her holen muss
       
    $b=$a // in deinem Code schaut er also in die Config-Datei

    $a $b 
    "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

    Kommentar


    • #3
      Ah ja,

      also steht da eigentlich: Wenn es die Session noch nicht gibt, mach eine neue, ansonsten setze die Variablen auf die Werte der vorhandenen Session.

      Aber warum steht dann der untere Teil

      PHP-Code:
      $databaseURL $_SESSION['databaseURL'];
          
      $databaseUName $_SESSION['databaseUName'];
          
      $databasePWord $_SESSION['databasePWord'];
          
      $databaseName $_SESSION['databaseName']; 
      nicht in einem else-Zweig?

      Lars

      P.S: Man, geht das hier schnell! Super!

      Kommentar


      • #4
        weil der immer ausgeführt werden soll -

        sie hätten vielleicht zur Vermeidung deiner Verwirrung ...

        if ($b ist NICHT bekannt)
        $c=5;
        $b=$c;
        }
        $a=$b ;

        schreiben sollen
        ...

        aber wozu noch extra 4 Variablen anlegen, wenn man die 4 nur hierfür brauchen würde. also betreibt man Wiederaufbereitung und benutzt die gleichen Variablen, die später sowieso diese Werte tragen sollen ..

        das macht das Programmieren dort etwas einfacher, eben weil man nur die Variablen verwendet, die es sowieso geben muss an dieser Stelle
        "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

        Kommentar


        • #5
          Nein, ein else-Zweig würde dort schon Sinn machen. Wozu noch einmal versuchen die Datenbankverbindung aufzubauen? Das ist im if-Zweig bereits geschehen und eine Verbindungskennung existiert dann auch bereits.Allerdings sollte man dann die Verbindung nicht mit
          Code:
          mysql_close($connection);
          schließen.
          [URL]http://hallophp.de[/URL]

          Kommentar


          • #6
            nun ich nehme an , das Schließen der Verbindung an der Stelle sowie der vorangehende Verbindungsaufbau sind nur ein Test, ob die Verbindung "geht" - danach werden die Connection-Variablen in der Session abgelegt zur späteren Verwendung - er holt ja im "Then"- Zweig zusätzliche Daten bei der ersten Verbindung zur Datenbank ...
            "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

            Kommentar


            • #7
              Ist ja fast wie ein Chat hier

              So ganz überzeugt bin ich von dieser Herangehensweise noch nicht.

              Wenn die if-Bedingung greift, werden die Variablen gesetzt und anschließend gleich nochmal mit den sowieso vorhandenen Werten überschrieben. Greift sie nicht, werden die Variablen gesetzt, ohne Initialisierung der Verbindung. In einem else-Zweig würde die Zuweisung doch auch immer erfolgen, da in if und in else die Werte gesetzt würden.

              So verstehe ich nicht die doppelte Abarbeitung bei Eintreten in die if-Bedingung, diese würde ich vermeiden.

              Lars

              Kommentar


              • #8
                du hast das Ende der Methode übersehen

                nach dem if-Krams
                PHP-Code:
                $databaseURL $_SESSION['databaseURL'];
                    
                $databaseUName $_SESSION['databaseUName'];
                    
                $databasePWord $_SESSION['databasePWord'];
                    
                $databaseName $_SESSION['databaseName'];  
                 
                $connection mysql_connect($databaseURL,$databaseUName,$databasePWord);
                        
                //or die ("Error while connecting to host");
                    
                $db mysql_select_db($databaseName,$connection);
                        
                //or die ("Error while connecting to database");
                    
                return $connection;

                also wenn es die Session-Variable gibt, dann liest er die ein, öffnet damit Verbindung zur Datenbank und liefert dieses $connection-Object zurück zur weiteren Verwendung ...

                wenn du das in einen Else-Zweig packen willst, dann muss wie Asipak schon schrieb das Schließen der Verbindung unterbleiben ...

                und "doppelte" Abarbeitung .. es sind 4 Variable, die je 1mal in Register geladen und wieder in Speicher geschrieben werden - im Normalfall liegen die Speicherbereiche dann sowieso im Cache, das geht also rasend schnell - ich würde bei dieser Variablen hin und herschreiberei nicht von echter Abarbeitung sprechen ....
                "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

                Kommentar


                • #9
                  Eure Antworten von 9:57 Uhr und 10:03 Uhr entgingen mir wegen einem Telefonat und der schon geöffneten Antwortmaske.

                  Nun habe ich mehrfach alle Antworten gelesen, den Quellcode nochmals durchgesehen und bin zu folgender Meinung gekommen: Der Beispielcode ist recht eigenwillig, aber er funktioniert gut. Jedoch würde ich den Aufbau lieber so lösen:

                  PHP-Code:
                  <?php

                  /*
                  DB Initialization method.
                  Returns the connection variable.
                  */
                  function initDB(){

                  /* Get Sectors from session */   
                      
                  if(! isset($_SESSION['databaseURL'])){
                              include(
                  "conf/conf.php");
                              
                  $dbConf = new AAConf();
                              
                  $databaseURL $dbConf->get_databaseURL();
                              
                  $databaseUName $dbConf->get_databaseUName();
                              
                  $databasePWord $dbConf->get_databasePWord();
                              
                  $databaseName $dbConf->get_databaseName();
                                  
                                  
                  //Set DB Info. in-session
                              
                  $_SESSION['databaseURL']=$databaseURL
                              
                  $_SESSION['databaseUName']=$databaseUName
                              
                  $_SESSION['databasePWord']=$databasePWord
                              
                  $_SESSION['databaseName']=$databaseName;        
                          
                              
                  $connection mysql_connect($databaseURL,$databaseUName,$databasePWord);
                                  
                  // or die ("Error while connecting to localhost");
                              
                  $db mysql_select_db($databaseName,$connection);
                                  
                  //or die ("Error while connecting to database");
                          
                              
                  $rowArray;
                              
                  $rowID 1;
                              
                  $query "SELECT * FROM Sectors";
                              
                  $result mysql_query($query);
                              while(
                  $row mysql_fetch_array($result)){    
                                      
                  $rowArray[$rowID] = $row['Sector'];   
                                      
                  $rowID $rowID +1;
                                  }  
                                  
                                  
                  //Update the session with the sectors.
                              
                  $_SESSION['sectors']=$rowArray;    
                          
                              return 
                  $connection;
                          }
                          
                          else{
                              
                  $databaseURL $_SESSION['databaseURL'];
                              
                  $databaseUName $_SESSION['databaseUName'];
                              
                  $databasePWord $_SESSION['databasePWord'];
                              
                  $databaseName $_SESSION['databaseName']; 

                              
                  $connection mysql_connect($databaseURL,$databaseUName,$databasePWord);
                                  
                  //or die ("Error while connecting to host");
                              
                  $db mysql_select_db($databaseName,$connection);
                                  
                  //or die ("Error while connecting to database");
                              
                  return $connection;
                          }    
                  }

                  ?>
                  So wird auf jeden Fall die Datenbankverbindung nur 1x geöffnet und kein überflüssiger Code wird ausgeführt.

                  Auch wenn die Abarbeitung der 4 Zeilen schnell geht, sowas wollte ich mir gar nicht erst angewöhnen. Irgendwann sind es mal 40 Zeilen und vielleicht noch in einer Schleife und schon merkt man auch Geschwindigkeitsunterschiede.

                  Oder?

                  Lars

                  Kommentar


                  • #10
                    nun wenn ich das Teil bauen würde .. gäbe es wahrscheinlich als erste Zeile in der Methode

                    $connection=null;
                    dann die if-Abfrage ....

                    und einmal ganz am Ende nach else
                    PHP-Code:
                       // Ende else-Zweig
                       
                    return $connection;
                    //Ende Methode 
                    natürlich brauchst du dann sowohl im Then als auch IM else-Zweig das return $connection; nicht mehr
                    "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

                    Kommentar


                    • #11
                      Ja, so gefällt es mir auch . Danke!

                      Schön, dass mir hier so schnell und diskussionsfreudig geantwortet wurde, ich schließe diesen Thread hiermit.



                      Lars

                      Kommentar

                      Lädt...
                      X