Tobi: Global Variablen - daten kommen nicht an

Hallo,
ich suche nun schon seit stunden - und habe das problem dadurch auch schon etwas weiter eingeschränkt... leider aber immer noch nicht gelöst:

PROBLEM:
-------
Datenbankverbindung klappt nicht, wenn ich eine funktion benutze. Wenn ich direkt den code nehme, dann gehts.

Aufbau:
include(init.php) - hier werden alle funktionen geladen

dann wird code geladen, auch in form einer funktion, also ungefähr so:

function html
{
getInhalt($name,$sprache);   #funktion ist geladen
AUSGABE
}

Klappt so nicht...

function html
{
alle befehle aus der funktion direkt hier;
AUSGABE
}

Klappt dagegen super gut...
warum???

Kann mir jemand helfen??
Vielen Dank,

Tobi

  1. Lieber Tobi,

    function html
    {
    getInhalt($name,$sprache);   #funktion ist geladen
    AUSGABE
    }

    Klappt so nicht...

    woher nimmst Du innerhalb der Funktion "html" die Variablen $name und $sprache? Sie wurden nirgendwo initialisiert. Auch an die Funktion "html" wurden (zumindest in dem von Dir geposteten Beispiel) keine solchen Parameter übertragen.

    Was passiert eigentlich in der Funktion getInhalt? Was tut sie mit den von ihr erzeugten Inhalten? Wenn Sie z.B. einen String ermittelt, dann musst Du dieses Ergebnis auch verwenden, z.B. indem Du es einer Ergebnisvariablen zuweist!

    Was passiert damit?

    function html($name, $sprache) {  
        $code = getInhalt($name, $sprache); // holt sich den HTML-Code  
        ausgabe($code); // diese Funktion macht etwas mit dem Code  
    }
    

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. Hallo Felix,

      vielen Dank für die Antwort. Du hast recht, dass ich nicht allzu spezifisch war.

      woher nimmst Du innerhalb der Funktion "html" die Variablen $name und $sprache? Sie wurden nirgendwo initialisiert.

      Die initialisierung habe ich in dem Beispiel weggelassen. Alle Variablen werden aber korrekt initialisiert und auch übertragen (kommen an, getestet).

      Was passiert eigentlich in der Funktion getInhalt?

      nimmt die Vars an und führt eine sql abfrage durch und gibt mit return einen wert zurück, der ausgegeben werden soll.

      Es gibt eine SQL Link fehlermeldung (d.h. Datenbankverbindung klappt nicht, die aber in der übergeordneten funktion klappt).

      Ist es vielleicht das problem der funktion in einer funktion?
      Kann ich das irgednwie lösen (also mit funktion in funktion?)

      Freue mich über tipps..
      Danke & grüße aus Düsseldorf,
      Tobi

      Tobias

      1. echo $begrüßung;

        Ist es vielleicht das problem der funktion in einer funktion?

        Nein. Eine Funktion in einer anderen zu deklarieren ist zwar nicht besonders sinnvoll, aber machbar. Sinnvoll ist es deshalb nicht, weil sie dadurch keine lokale Funktion wird. Nach Aufruf der äußeren Funktion, durch den sie erst angelegt wird, steht sie ebenfalls lobal zur Verfügung. Wenn man die äußere Funktion ein weiteres Mal aufruft gibt es nur einen Fehler, dass es die innere Funktion bereits gibt.
        Aber dieses Verschachteln von Funktionen konnte ich in deinem Posting nicht erkennen. Der Aufruf von Funktionen innerhalb einer Funktion ist hingegen problemlos möglich. Generell ist aber die Einschränkung durch den Variable Scope zu beachten. Die Lösung mit dem Schlüsselwort global ist zwar eine einfache, aber keine besonders schöne. Funktionen sollten idealerweise nur mit den übergebenen Parametern arbeiten, und nicht auf außerhalb deklarierte Dinge angewiesen sein.

        echo "$verabschiedung $name";

        1. Hallo,

          steht sie ebenfalls lobal zur Verfügung.

          das ist dann das Gegenteil von 'glokal'?

          *scnr*
           Martin

          --
          Auf jeden Menschen auf der ganzen Welt entfallen statistisch gesehen etwa 3000 Spinnen, wie Wissenschaftler jetzt festgestellt haben.
          Wer will meine haben? Denn ich will sie bstimmt nicht.
        2. Hi Dedlfix,

          die struktur ist so:

          Datenbankaufbau
          Deklaration Funktion innen
          Deklaration Funktion außen

          Aufruf Funktion außen
          {
          Aufruf Funktion innen
            {
            daten holen
            daten return
            }
          daten ausgabe
          }

          und das klappt nicht (Problem Datenbankverbindung - die von innen ohne funktion geht), obwohl die parameter sauber übergeben werden...
          ich bin ratlos :-(

          danke für tipps!
          Tobi

          1. echo $begrüßung;

            die struktur ist so:

            Gib doch bitte mal statt des Pseudocodes richtigen an und versuche das Problem mit dem kleinstmöglichen Code nachvollziehbar darzustellen.

            Was auch immer beim Entwickeln hilfreich ist, ist ein auf E_ALL gestelltes error_reporting. Damit werden Meldungen über Zugriffe auf nicht vorhandene Variablen nicht mehr unterdrückt.

            echo "$verabschiedung $name";

            1. Hi Dedlfix,
              ja, du hast recht.

              Also:
              * Erstmal werden die Funktionen initialisiert:

              DB Verbindung

              include("php_dbconnect_content.php");

              #die funktion, die den Content holen soll, was aber nicht klappt...
              include("get_element_sql.func.php");

              <?php
               function get_element_sql($element,$lng){
                $sql = "SELECT * FROM $element WHERE lng='$lng'";
                $res = mysql_query($sql);
                $elarr = mysql_fetch_array($res);
                return $elarr;
              }
              ?>

              anmerkung:beide Vars kommen an.

              Funktion, die Elemente platziert und ausgibt

              include("place_elements.func.php");

              aus place_elements wird der code generiert, ein element ist auch

              eine funktion, etwa so:

              <?php
              function elem_bottom($lng,$element){
              $elarr = get_element_sql($element, $lng);
              echo  "$elarr[variable]";
              }
              ?>

              Wenn wir es so aufrufen, gibt es einene DB-Fehler:
              "Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in..."

              So aber klappt es:

              <?php
              function elem_bottom($lng,$element){

              $sql = "SELECT * FROM $element WHERE lng='$lng'";
                $res = mysql_query($sql);
                $elarr = mysql_fetch_array($res);

              echo  "$elarr[variable]";
              }
              ?>

              Und ich versteh es nicht... :-(

              Danke schon jetzt!
              Tobi

              1. echo $begrüßung;

                Und ich versteh es nicht... :-(

                Ich kann mir momentan auch noch keinen Reim drauf machen.

                $sql = "SELECT * FROM $element WHERE lng='$lng'";
                  $res = mysql_query($sql);
                  $elarr = mysql_fetch_array($res);

                Du unterlässt es hier, auf eine fehlerhafte Ausführung des SQL-Statements zu prüfen. Wenn MySQL einen Fehler meldet ist das Rückgabeergebnis der meisten mysql_*()-Funktionen ein false statt einer Ressourcenkennung, die für die nachfolgenden Funktionen benötigt werden.

                "Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in..."

                Bist du sicher, dass die Fehlermeldung "mysql_query()" erwähnt? Diese Meldung ist ein typischer Folgefehler, der von PHP erzeugt wird, weil statt der erwarteten Ressourcenkennung beispielsweise ein false übergeben wurde. Die Ressourcenkennung für die Connection kann man bei mysql_query() weglassen. Es wird dann die zuletzt geöffnete Verbindung verwendet. Da das der einzige Ressourcen-Parameter von mysql_query() ist, wundert mich die Meldung, so wie du sie hier gepostet hast.

                echo  "$elarr[variable]";

                Das Einrahmen von einfachen Variablen mit "" ist überflüssig. Außerdem: Why is $foo[bar] wrong?

                echo "$verabschiedung $name";

                1. Hi Dedlfix,

                  danke für alle Mühen - also suche ich den fehler mal in der SQL-Verbindung...

                  Why is $foo[bar] wrong?]

                  Und danke auch dafür - war mir tatsächlich nicht klar...
                  schöne Grüße

                  Tobi

                  1. echo $begrüßung;

                    danke für alle Mühen - also suche ich den fehler mal in der SQL-Verbindung...

                    Falls übrigens eine der mysql_*-Funktionen (Ausnahme: Fetch-Funktionen) ein false zurückliefert, liefert die Funktion mysql_error() die zum Fehler gehörende Meldung. Dies vergaß ich beim letzten Post zu erwähnen.

                    echo "$verabschiedung $name";

                2. Hallo

                  "Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in..."

                  Bist du sicher, dass die Fehlermeldung "mysql_query()" erwähnt? Diese Meldung ist ein typischer Folgefehler, der von PHP erzeugt wird, weil statt der erwarteten Ressourcenkennung beispielsweise ein false übergeben wurde. Die Ressourcenkennung für die Connection kann man bei mysql_query() weglassen. Es wird dann die zuletzt geöffnete Verbindung verwendet. Da das der einzige Ressourcen-Parameter von mysql_query() ist, wundert mich die Meldung, so wie du sie hier gepostet hast.

                  Wird die letzte Verbindung auch genommen, wenn diese innerhalb einer anderen Funktion hergestellt wurde? Etwa so:

                  function oeffne_verbindung() {  
                  global $a;  
                    
                  $sql = mysql_connect($a[0],$a[1],$a[2]);  
                  mysql_select_db($a[3],$sql);  
                  // kein return von $sql!  
                  }  
                    
                  function nutze_verbindung() {  
                  $sql = "SELECT * FROM $element WHERE lng='$lng'";  
                  $res = mysql_query($sql);  
                  return $res;  
                  }
                  

                  Wobei ich das auch grundsätzlich etwas anders strukturieren würde. :-)

                  Tschö, Auge

                  --
                  Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
                  (Victor Hugo)
                  Veranstaltungsdatenbank Vdb 0.1
                  1. Hi Auge,

                    nochmals danke für die Mühen!
                    Ich habs gefunden (nun gut, nicht aktiv, sondern ich habe einfach meine kompletten Backup-Daten nochmal drüberkopiert...)

                    Bist du sicher, dass die Fehlermeldung "mysql_query()" erwähnt?

                    Ja - die Fehlermeldung war einkopiert.
                    Ansonsten hatte ich deinen Code sinngemäß genauso auch drin.

                    Grundsätzlich anders strukturieren würde

                    Ja, ich wollte das eigentlich auch - hatte gerade eine Query-Klasse eingebaut, aber dann lief weder die Klasse noch das Original. Muss irgendwo ein Fehler von mir selber gewesen sein. Ich versuchs nochmal...

                    Also, danke und schönen Abend!
                    Tobi

                    1. Hallo

                      Bist du sicher, dass die Fehlermeldung "mysql_query()" erwähnt?

                      Ja - die Fehlermeldung war einkopiert.

                      War zwar noch von dedlfix, sei's drum. :-) Ich, bzw. meine Nachfrage bezog sich darauf, dass die Fehlermeldung eine offensichtlich nicht bestehende Verbindung moniert. Das bedeutet aber, dass der Fehler vorher "stattfindet".

                      Ansonsten hatte ich deinen Code sinngemäß genauso auch drin.

                      Mit einem return der Verbindungskennung aus der ersten und deren Übergabe in die zweite Funktion sollte dies funktionieren.

                      function oeffne_verbindung() {  
                      global $a;  
                      // $a: Daten zur Verbindungsaufnahme mit der DB  
                        
                      $sql = mysql_connect($a[0],$a[1],$a[2]);  
                      mysql_select_db($a[3],$sql);  
                      return $sql;  
                      }  
                        
                      function nutze_verbindung($sql,$query) {  
                      $res = mysql_query($query,$sql);  
                      return $res;  
                      }  
                        
                      $sql =  oeffne_verbindung();  
                        
                      if ($sql===false)  
                         {  
                         // Verbindungsaufbau gescheitert  
                         }  
                      else  
                         {  
                         $query = "SELECT * FROM $element WHERE lng='$lng'";  
                         $daten = nutze_verbindung($sql,$query)  
                         if ($daten===false)  
                            {  
                            // Abfrage gescheitert  
                            }  
                         else  
                            {  
                            // verarbeite die Daten  
                            }  
                         }
                      

                      Die Deklaration des Query außerhalb der Funktion den Vorteil, dass du diese überall, logischerweise auch mit verschiedenen Querys, verwenden kannst.

                      Tschö, Auge

                      --
                      Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
                      (Victor Hugo)
                      Veranstaltungsdatenbank Vdb 0.1
  2. Hi, Tobi

    function html
    {
    getInhalt($name,$sprache);   #funktion ist geladen
    AUSGABE
    }

    Jedoch sollte sich die Funktion nicht innerhalb einer Funktion befinden.

    So nicht:

    function html
    {
    getInhalt($name,$sprache);   #funktion ist geladen

    function tInhalt($name,$sprache)
    {

    }

    }

    so ja

    function html
    {
    getInhalt($name,$sprache);   #funktion ist geladen

    }

    function tInhalt($name,$sprache)
    {

    }