Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Verständnisschwierigkeiten includes und Funktionsaufrufe

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Verständnisschwierigkeiten includes und Funktionsaufrufe

    Hallo,

    ich habe eine Verständnisschwierigkeit, wie PHP Dateien includet und die Funktionen aufruft.

    Mein Code ist wie folgt aufgebaut:

    Basisdatei:
    PHP-Code:
    include('../ordner1/datei.inc.php');   //definiert Kontrollfunktionen
    include('../ordner2/datei.inc.php');   //definiert kleine HTML-Schnipsel z.B. Login-Box

    // später im Code kommt ein Aufruf aus der Datei in Ordner 2
    show_login_box();

    // ... 
    Auszug der Datei in ordner2:
    PHP-Code:
    function show_login_box()
    {
       
    // ...

       // Aufruf der Funktion aus Datei in ordner 1
       
    echo getTitle();

       
    // ...

    getTitle() ist als Funktion definiert aber ich bekomme immer den Fehler, dass die Funktion nicht deklariert ist.

    Ich dachte eigentlich, dass PHP die includes durch den Quellcode ersetzt, so dass alle Funktionen in dem Dokument verfügbar sind, so dass quasi für den PHP-Interpreter die Datei folgt aussieht

    PHP-Code:
    // include('../ordner1/datei.inc.php') wird ersetzt durch
    function 1() { ... }
    function 
    2() { ... }
    //...
    function n() { ... }

    // und include('../ordner2/datei.inc.php') ersetzt wird durch
    function n+{ ... }
    function 
    n+{ ... }
    // ...
    function n+m{ ... } 
    So dass alle Funktionen sich auch gegenseitig aufrufen können. Weiss nicht, ob es in PHP nötig ist, aber falls das so funktioniert habe ich es wie in C gehalten, so dass die Funktion, die eine andere aufruft weiter unten deklariert wird.

    Muss ich die Funktion noch anderweitig bekannt machen?
    Wo liegt mein Denkfehler?


    Vielen Dank und Gruß,
    spaceman

  • #2
    wo ist denn getTitle() definiert?

    Kommentar


    • #3
      In der Datei, die zuerst includet wird. Deshalb gehe ich ja davon aus, dass die Funktion weiter oben im Code steht, als die Funktion, die getTitle() aufruft.

      Ist meine Annahme vom Aufbau denn prinzipiell richtig? Also wie die includes ersetzt werden.

      Kommentar


      • #4
        Bist du dir sicher, dass du das nicht ein wenig zu sehr vereinfacht hast für das Forum?
        getTitle() hört sich nach einer Methode (!=Funktion) an. Die zugehörige Klasse muss vielleicht erst instanziert werden.

        Das ist nun geraten, wir brauchen den richtigen Code, wenn es nicht grad 5 Seiten sind, sonnst musst du halt sinnvoll kürzen.

        Kommentar


        • #5
          Ja, ich weiss, klingt wie ein Methodenname, ist aber keiner.

          Vielleicht habe ich das zu sehr abstrahiert?

          Folgende Anwendung: In meiner Anwendung brauche ich ständig Länderdaten. Deshalb existiert in meiner Datenbank eine Tabelle country, die nur einen auto-increment Wert als Index und den Ländernamen enthält.

          Des weiteren gibt es unter anderem Kunden, die natürlich aus einem Land kommen. Dieses ist in der Tabelle client neben den Stammdaten als Fremdschlüssel gespeichert.

          Wenn ich nach einem Kunden suche wird - falls Ergebnisse gefunden wurden - in einer Schleife eine Funktion show_box_client( $client_data ) angezeigt. Diese wird in meiner View-Komponente includet.

          Nun werden verständlicherweise anstatt der Ländernamen, die Länder_ID angezeigt. Deshalb möchte ich innerhalb von show_box_client( $client_data ) eine Funktion get_country( $id ) aufrufen, die anhand der Länder_ID den Namen aus der DB holt und diesen returnt.




          Grundgerüst:
          PHP-Code:
          include('dbconnect.inc.php');   // definiert DB-Zugriff
          include('control_basic.inc.php');   // definiert get_country()
          include('view_boxes.inc.php');   // definiert show_box_client()

          if ( isset( $_REQUEST['search_client'] ) ) // submit-Button aus Suchformular
          {
             
          // Hier kommen erst Pflichtfeldkontrolle und "Entschärfung" der Usereingabe, dann
             
             
          $link dbconnect();   // in dbconnect.inc.php
             
             // Query zusammensetzen und dann

             
          $result mysql_query$query );
             
          mysql_close$link );

             
          $count mysql_num_rows$result );

             if ( 
          $count >= )
             {
                for ( 
          $i 1$i <= $count$i++ )
             {
                   
          $data mysql_fetch_assoc$result );
                   
          show_box_client$data );   // in view_boxes.inc.php
                
          }
             }


          Datei view_boxes.inc.php:
          PHP-Code:
          function show_box_client$client_data )
          {
             echo 
          '
                <div id="box_client">
                <table>
                // Erzeugt eine kleine Box mit den Klientendaten, irgendwann kommt die Stelle:
                   <tr>
                      <td>Country: </td>
                      <td>' 
          get_country$client_data['client_country'] ) . '</td>
                   </tr>
                   // ...
                </table>
                </div>
             '
          ;



          Die Datei control_basic.inc.php:
          PHP-Code:
          function get_country$country_id )
          {
             
          $link dbconnect();

             
          $query "SELECT * FROM country WHERE country_id=";
             
          $query "'" mysql_real_escape_string$country_id ) . "'";

             
          $result mysql_query$query );

             
          mysql_close$link);

             if ( 
          mysql_num_rows$result ) == )
             {
                
          $data mysql_fetch_assoc$result );
                return 
          $data['country_name'];
             }

             return 
          "";



          Hoffe, dass es nun verständlicher ist. Tut mir leid, wenn ich mich ein wenig doof anstelle, aber PHP ist noch recht frisch für mich.


          Vielen Dank schon mal für die Mühe!

          Kommentar


          • #6
            Hmm sollte eigentlich funktionieren... hast du auch wirklich alle Funktionen überall gleich geschrieben? Was genau steht in der Fehlermeldung (copy & paste pls)?

            Kommentar


            • #7
              Hab es vor ein paar Minuten auf die Kette bekommen, aber kann mir nicht erklären warum das so ist. Die Namen und Übergabewerte habe ich vorher alle kontrolliert und die stimmten. Kenne das ja aus anderen Sprachen, dass es oft daran hapert, weil man sich verschrieben hat.

              Aus irgendeinem Grund war die DB-Resource nicht in Ordnung. Ich habe in der Datei control_basic.inc.php in der Funktion shoxw_box_client() (siehe bitte oben) die Zeile

              PHP-Code:
              mysql_close$link ); 
              auskommentiert. Andernfalls hat die Abfrage is_resource( $link ) nämlich einen Fehler geliefert, zumindest ab dem zweiten Durchgang. Hat PHP damit ein Problem, wenn ich durch eine Schleife mehrfach eine Funktion aufrufe, die eine DB-Verbindung erzeugt, einen Query sendet und die DB-Verbindung wieder schliesst?

              Naja... zumindest ist das Grundproblem behoben auch wenn mir nicht klar ist, woher der Fehler kam. Leider kann ich jetzt kein copy und paste mehr machen, aber der Fehler war call of undefined function get_country in "Dokumentpfad, Zeile"

              Kommentar


              • #8
                Eigentlich eh nicht notwendig, die Verbindung händisch zu schließen. Zudem schließt du die Ressource, wie soll dann z.b. mysql_fetch_assoc funktionieren?

                Solltest du auch nicht, da diese sowieso mit dem Abarbeiten des Skripts geschlossen wird. Zudem steigt mit jedem öffnen und schließen der DB- Verbindung die Rechenlast.

                Macht also nur Sinn, wenn nach all ! deinen DB- Abfragen jede Menge Rechenarbeit auf den Server wartet, die nichts mit der DB zu tun haben.

                Kommentar


                • #9
                  Zitat von spacemanspiff Beitrag anzeigen
                  Hat PHP damit ein Problem, wenn ich durch eine Schleife mehrfach eine Funktion aufrufe, die eine DB-Verbindung erzeugt, einen Query sendet und die DB-Verbindung wieder schliesst?
                  Das klingt nicht gerade sinnvoll. Normalerweise braucht man nur eine Datenbankverbindung, die man während des Scrpts bestehen lässt. Da ich Globals nicht mag empfehle ich dir einen Singleton in einer Datenbankklasse oder ein dbconnect(), das immer die selbe Verbindung zurückliefert.
                  PHP-Code:
                  function dbconnect()
                  {
                      static 
                  $link NULL;
                      if (
                  is_null($link)) {
                          
                  $link mysql_connect(...);
                          
                  #echo 'Verbindung hergestellt!';
                      
                  }
                      return 
                  $link;

                  Kommentar


                  • #10
                    Hallo, da möchte ich mich doch gleich mal mit einer Frage dranhängen.

                    Was ist der Unterschied zu Phlegmas Beispiel und dieser Version?

                    PHP-Code:
                    function dbconnect()
                    {
                        
                    $link mysql_connect(...);

                        if(!
                    $link) die('Verbindung fehlgeschlagen');

                        return 
                    $link;

                    Kommentar


                    • #11
                      Zitat von ElaWeb Beitrag anzeigen
                      Was ist der unterschied zu Phlegmas Beispiel und dieser Version?
                      In deiner Version wird bei jedem Funktionsaufruf mysql_connect() aufgerufen, in Phlegmas Beispiel nur beim ersten Aufruf.
                      Die static Variable "merkt" sich sinnbildlich gesprochen ihren letzten Zustand.

                      Kommentar


                      • #12
                        Eine statische Variable existiert nur in einem lokalen Funktions-Bereich, der Wert geht beim Verlassen dieses Bereichs aber nicht verloren.

                        Kommentar


                        • #13
                          Die Alternative zum static wäre ein global. Wie bereits erwähnt stehe ich nicht besonders auf Globals, die meiner Meinung nach nicht zu gutem Code beitragen. Gepostetes ist ein billig Singleton für Funktionen^^.

                          Kommentar


                          • #14
                            Wobei ein Singleton für mich in den meisten Fällen ein "Anti-Pattern" ist.
                            Es schränkt unnötig ein und macht die Vererbung kaputt.

                            Eine Registry oder Factory ist sinnvoller.

                            Kommentar


                            • #15
                              Zitat von phpdev Beitrag anzeigen
                              Eine Registry oder Factory ist sinnvoller.
                              Nein und Ja, ich bevorzuge die Factory, Registry ist für kleinere Sachen wohl ausreichend, aber Factory bietet noch mehr Spielraum je nach Verwendung.
                              Gerade wenn viel mit Datenbanken, Files, Templates etc. gearbeitet wird, ist die Methode von Vorteil.

                              Das ist aber OOP und die Gegenfarge ist, kommt der Fragende damit klar?

                              Kommentar

                              Lädt...
                              X