Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Probleme mit require_once Verschachtelung

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Probleme mit require_once Verschachtelung

    Ich habe folgende 4 Scripts auf meiner Webseite benutzt:

    index.php :
    PHP-Code:
    <?php
        
    require_once("includes/config.php");
        require_once(
    "includes/functions.php");
        require_once(
    "includes/db_connect.php");
    config.php :
    PHP-Code:
    <?php
       define
    ("HOST""localhost");
       
    define("USER""*benutzername*");
       
    define("PASSWORD""*passwort*");
       
    define("DATABASE""*name*");
       
    define("SECURE"FALSE);
    functions.php :

    eher nicht von Belang, da hier kein Fehler beim parsen angezeigt wird.
    (Auf Wunsch sende ich das dennoch gerne per PM)

    db_connect.php :
    PHP-Code:
    <?php
    $mysqli 
    = new mysqli(HOSTUSERPASSWORDDATABASE);
    Mein Problem liegt nun darin, dass der Server immer ausgibt, dass er in der db_connect.php die constanten (USER, DATABASE, usw.) nicht findet (Ja, die Dateipfade stimmen ).
    Zwei der logs :

    [Sat Nov 29 21:29:41 2014] [warn] [client 2.162.206.214] mod_fcgid: stderr: PHP Notice: Use of undefined constant HOST - assumed 'HOST' in /var/www/vhosts/ljay.de/httpdocs/new/includes/db_connect.php on line 2

    [Sat Nov 29 21:29:41 2014] [warn] [client 2.162.206.214] mod_fcgid: stderr: PHP Notice: Use of undefined constant USER - assumed 'USER' in /var/www/vhosts/ljay.de/httpdocs/new/includes/db_connect.php on line 2



    Nun zu der eigentlichen Frage:
    Liegt es an den Eigenschaften der require_once() Funktion, dass die eine eingebundene Datei nicht auf die Variablen der anderen (zuerst eingebundenen Datei) zugreifen kann?
    Und : Wie kann ich das beheben und dabei die Kompartimentierung möglichst beibehalten?

  • #2
    Wenn das Script so aufgebaut ist wie dargestellt, dann kann das eigentlich nicht sein. Sicher, dass du wirklich immer über die index.php gehst? Und auch wenn die Pfade korrekt gesetzt sind: Kannst du mal folgendes probieren?

    PHP-Code:
    <?php 
    require_once(__DIR__."/includes/config.php"); 
    require_once(
    __DIR__."/includes/functions.php"); 
    require_once(
    __DIR__."/includes/db_connect.php");
    Das setzt die Pfade absolut - ganz egal in welchem Verzeichnis du dich aktuell tatsächlich befindest: getcwd()

    Kommentar


    • #3
      Vielen Dank für die schnelle Antwort.
      Ausprobieren kann ich das erst morgen, weil ich nur am Handy bin...
      Aber ich bin mir auch zu 99,9% sicher, dass ich über die index.php gehe.
      Ich hatte eher das Gefül, dass der Interpreter (oder wie man das in php nennt) nur jede Datei einzeln anguckt ( hört sich eventuell n bisschen dumm an, aber ich bin grad müde) und dann nich mit einbezieht, dass er die erforderlichen Variablen aus einem bereits eingebundenen Script kriegt.

      Kommentar


      • #4
        Was für Variablen eigentlich? Wie du es hier schilderst, geht es um Konstanten. Vielleicht liegt da der Fehler?

        Ich hatte eher das Gefül, dass der Interpreter [… ] nur jede Datei einzeln anguckt […] und dann nich mit einbezieht, dass er die erforderlichen Variablen aus einem bereits eingebundenen Script kriegt.
        Ne. Das ist höchstens eine Frage von Geltungsbereichen.

        - http://php.net/manual/en/language.variables.scope.php

        Prinzipiell kannst du es dir so vorstellen, als würde der eingebundene Code im einbindenden Code stehen.

        Kommentar


        • #5
          Ach so ja sry bin ein bisschen durcheinander gewesen mit den Bezeichnungen
          Prinzipiell kannst du es dir so vorstellen, als würde der eingebundene Code im einbindenden Code stehen.
          Das hab ich gehofft
          Kannst du mal folgendes probieren?
          PHP-Code:
          <?php 
          require_once(__DIR__."/includes/config.php"); 
          require_once(
          __DIR__."/includes/functions.php"); 
          require_once(
          __DIR__."/includes/db_connect.php");
          Das hats auch nicht verbessert

          Wieso kann den die db_connect.php nicht auf HOST
          zugreifen, wenn die Definition hierfür doch quasi im Code steht?

          EDIT : Ich schreib die Konstanten mal als Variablen und setze sie dann global.
          EDIT #2 : Der Artikel zur variable scope hat mir sehr geholfen Danke. Mit Variablen und globals funktioniert es jetzt.

          Kommentar


          • #6
            global gilt meistens als eher suboptimale Lösung, ich würde also eher mal prüfen, warum es denn ohne nicht funktioniert.
            Hast du schonmal die require_once()'s/require's/includes()'s rausgenommen und diesen Teil des Scripts direkt in die index.php genommen?
            PHP-Code:
            <?php 
            define
            ("HOST""localhost"); 
            define("USER""*benutzername*"); 
            define("PASSWORD""*passwort*"); 
            define("DATABASE""*name*"); 
            define("SECURE"FALSE);
            $mysqli = new mysqli(HOSTUSERPASSWORDDATABASE);
            Rufst du vielleicht irgendwo in deinen Funktionen nochmal eine neue mysqli-Instanz auf ohne deine Konstanten zu übergeben?


            Noch zu globals, kannst ja auch noch ein bisschen googlen, muss zugeben, ich bin da mit der Suche nach "php global bad" rangegangen.
            Diskussion: http://stackoverflow.com/questions/5...l-in-functions
            Blog: http://sheriframadan.com/2011/07/why...bal-state-bad/
            [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
            [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

            Kommentar


            • #7
              Danke euch allen ihr habt mir sehr geholfen
              @VPh: Ich werd mir das noch mal ansehen

              Kommentar

              Lädt...
              X