Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] mysqli Verbindung besteht in externer Funktion nicht mehr

Einklappen

Neue Werbung 2019

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

  • [Erledigt] mysqli Verbindung besteht in externer Funktion nicht mehr

    Hallo,


    ich steh ziemlich auf dem Schlauch und bitte deswegen um Hilfe.

    Ich habe php-scripts in vier Dateien aufgeteilt. Zum einen gibt's die normale index.php (im Browser wird Seiteninhalt über index.php?seite=SEITENAME geladen), dann eine konfig.php in der die nötig Variablen gesetzer werden, eine verbindung.php zur mysqli Verbindung mit den Variablen aus config.php und eine funktionen.php zur Auslagerung von Funktionen (insbesondere um einen Seiteninhalt zu laden).

    index.php

    PHP-Code:
    <?php
    require("verbindung.php");
    include(
    "funktionen.php");

    echo isset(
    $mysqli_db); // Debug -> 1

    if(isset($_GET['seite']))
        
    ladeSeite($_GET['seite']);

    ?>
    funktionen.php

    PHP-Code:
    <?php
    echo isset($mysqli_db); // Debug -> 1
    function ladeSeite($seite)
    {
        echo isset(
    $mysqli_db); // Debug -> 0
       // ...
    }
    ?>
    verbindung.php

    PHP-Code:
    <?php
    require("konfig.php");
    $mysqli_db = new mysqli(...);
    ?>
    und in der konfig natürlich die Verbindungsdaten.


    Mein Problem ist, dass die mysql Verbindung nicht mehr besteht wenn die Funktion "ladeSeite" aufgerufen wird (siehe Kommentare).

    "Notice: Undefined variable: mysqli_db in funktionen.php on line 5"

    In index.php besteht sie, wenn die Datei funktionen.php eingefügt wird besteht sie, jedoch sobald man die Funktion "ladeSeite" aufruft besteht sie nicht mehr.

    Was mache ich falsch?

    Vielen Dank für hilfreiche Antworten!


  • #2
    Die existiert schon weiter. Nur in IN einer Funktion hast du einen neuen Scope (Variablengültigkeitsbereich). Heißt dort sind NICHT die Variablen von außerhalb verfügbar! Du müsstest die benötigten Variablen schon übergeben. (es gibt zwar noch das Wort "glob" das solltest du aber möglichst nicht einsetzen).

    Kommentar


    • #3
      http://www.php.de/php-einsteiger/489...nsammlung.html
      http://hallophp.de

      Kommentar


      • #4
        Danke Flor1an. Ich dachte Variablen außerhalb des Codeblocks würden ihre Gültigkeit innerhalb des Blocks behalten (bei manch anderen Sprachen der Fall).

        Jetzt klappts, super .

        Kommentar


        • #5
          Normalerweise ist es aber so das man Variablen außerhalb von Funktionen NICHT in der Funktion verwenden kann, außer diese Variablen werden explizit als Global deklariert.

          Kommentar


          • #6
            Hm somit können dann auch Variablen in .php Dateien die über include(...); aufgerufen werden nicht direkt verwendet werden. Das wirft meine Überlegungen ein CMS zu gestalten ziemlich über den Haufen .

            Kurze Frage vll. noch falls es überhaupt eine direkte Antwort gibt: Ist der Ansatz eine mysql Verbindung in jeder Datei eines CMS (login.php, registrierung.php etc.) seperat aufzubauen und wieder zu schließen dann in Ordnung? Oder ist es in diesem Fall doch geschickter auf Globals zurückzugreifen? Mit dem Hintergedanken allerdings, dass beim Aufruf einer Seite somit durchaus auch zwei Verbindungen auftreten können, wenn zum Beispiel eine zusätzl. .php Datei über include(...) eingefügt wird.

            Kommentar


            • #7
              Hm somit können dann auch Variablen in .php Dateien die über include(...); aufgerufen werden nicht direkt verwendet werden.
              Doch.

              Globale Variablen sind immer eine schlechte Idee. Du kannst auch zwei Verbindungen parallel nutzen. Die entsprechenden Funktionen liefern dir beim Verbindungsaufbau eine Verbindungskennung zurück, die du den Datenbankfunktionen übergeben kannst.
              http://hallophp.de

              Kommentar


              • #8
                Sorry meinte lokale Variablen. Das dachte ich mir auch aber dann muss ich die Variable doch irgendwie übergeben.

                Ich hab jetzt schnell gegoogelt und in Foren wird beschrieben dass include den akt. Scope benutzt. Ich habs jetzt aber getestet wenn ich ne Variable vor include("test.php") deklariere ist sie in test.php nicht mehr deklariert.

                Kommentar


                • #9
                  Doch. Versuchst du etwa wieder, die Variable in einer Funktion zu benutzen?
                  http://hallophp.de

                  Kommentar


                  • #10
                    Nicht wirklich... aber ich hab jetzt zwei Test Dateien erstellt und es funktioniert einwandfrei. Der Fehler liegt in meinen Dateien irgendwo anders - ich werds schon noch rausfinden. Dann mal vielen Dank für eure Hilfe und die Erläuterungen, jetzt bin ich um einiges schlauer.

                    Kommentar


                    • #11
                      Eine andere Datei includen und der Variablenscope IN einer Funktion sind zwei verschiedene Paar Schuhe! Du solltest definitiv nochmal den Artikel im Manual zu Scopes durchlesen!

                      PHP: Geltungsbereich von Variablen - Manual

                      Kommentar


                      • #12
                        Ich weiß es eigentlich, ich weiß nur nicht wo mir der Kopf stand - dass ich da so falsch gedacht habe. Vielen Dank.

                        Kommentar


                        • #13
                          DAS hier ist übrigens eine GANZ schlechte Idee:

                          if(isset($_GET['seite'])) ladeSeite($_GET['seite']);

                          wenn der Scriptaufruf z.B. dieser ist:
                          ...index.php?seite=http://example.org/boeses_script
                          PHP-Code:
                          if ($var != 0) {
                            
                          $var 0;

                          Kommentar


                          • #14
                            Zitat von Wolla Beitrag anzeigen
                            DAS hier ist übrigens eine GANZ schlechte Idee:

                            if(isset($_GET['seite'])) ladeSeite($_GET['seite']);
                            Das kommt darauf an, was ladeSeite eigentlich macht.

                            Bei naivem include wäre das natürlich wirklich schlecht; aber da er auch dort erst mal die DB nutzen will, ist das vielleicht gar nicht der Fall.

                            Kommentar


                            • #15
                              Zitat von Wolla Beitrag anzeigen
                              DAS hier ist übrigens eine GANZ schlechte Idee:

                              if(isset($_GET['seite'])) ladeSeite($_GET['seite']);

                              wenn der Scriptaufruf z.B. dieser ist:
                              ...index.php?seite=http://example.org/boeses_script
                              Keine Angst... der Code sieht ganz anders aus als du vermutest (hab ja die Fkt nich angezeigt ). Ich bin eig. nicht total unerfahren - dennoch passierts manchmal dass ich kurzzeitig einen brutalen Logikfehler - so wie in diesem Thread weiter oben - hab. Aber solang das alles Hobby-mäßig für mich selbst ist, sag ich mal, isses mir egal .

                              Kommentar

                              Lädt...
                              X