Ankündigung

Einklappen
Keine Ankündigung bisher.

Pfad mit realpath ermittelt existiert nicht...

Einklappen

Neue Werbung 2019

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

  • Pfad mit realpath ermittelt existiert nicht...

    Hi,

    ich hole mir mit realpath() den absoluten Pfad zu einer Datei die ich relativ angebe. So weit ich das sehen kann ist der Pfad auch korrekt. Wenn ich nun diesen absoluten Pfad mit require_once() in die Seite einbinden möchte, erhalte ich folgende Meldung:

    PHP-Code:
    require_once("D:\CapSystems\web\ListProducts\3.0\includes\lpx-class-listproducts.php"); 

    Warning: require_once() [function.require-once]: Unable to access D:\CapSystems\web\ListProducts.0\includes\lpx-class-listproducts.php in D:\CapSystems\web\ListProducts\3.0\includes\test-lp.php on line 14

    Warning: require_once(D:\CapSystems\web\ListProducts.0\incl udes\lpx-class-listproducts.php) [function.require-once]: failed to open stream: No such file or directory in D:\CapSystems\web\ListProducts\3.0\includes\test-lp.php on line 14

    Fatal error: require_once() [function.require]: Failed opening required 'D:\CapSystems\web\ListProducts.0\includes\lpx-class-listproducts.php' (include_path='.;D:\xampp\php\PEAR') in D:\CapSystems\web\ListProducts\3.0\includes\test-lp.php on line 14
    So wird der Pfad ermittelt:
    PHP-Code:
          $filename realpath('includes/lpx-class-listproducts.php'); 
    Dieser Code befindet sich in lpx-class-listproducts.php in einer Public-Klassen-Methode. Die Klasse wird in einer Datei (generator.php in einem Verzeichnis weiter oben) instantiiert und die Methode aufgrufen.
    Auch file_exists liefert false:
    PHP-Code:
    if(file_exists("D:\CapSystems\web\ListProducts\3.0\includes\lpx-class-listproducts.php")) {
      die(
    'existiert');
    } else {
      die(
    'nee');

    Die Datei existiert aber 100%ig.

    Mein Document-Root ist: D:/CapSystems/web/
    PHP-Code:
    echo($_SERVER["DOCUMENT_ROOT"]); 
    Wenn ich den Pfad wie folgt angebe, kommt die selbe Meldung wie oben:
    ListProducts/3.0/includes/lpx-class-listproducts.php
    /ListProducts/3.0/includes/lpx-class-listproducts.php
    ./ListProducts/3.0/includes/lpx-class-listproducts.php
    ListProducts\3.0\includes\lpx-class-listproducts.php
    etc...
    Wo liegt das Problem?

    Der Server ist das XAMPP-Rundum-Sorglos-Paket von apache-friends.org und läuft auf Windows Vista.

    EDIT: Ich habe jetzt den Fehler gefunden: Der Pfad darf nicht in Anführungszeichen stehen, wenn ich die einfachen ' verwende, wird die Datei wunderbar eingebunden. Wie kann ich den Pfad so umwandeln, dass er auch mit Anführungszeichen ( " ) korrekt eingebunden werden kann?

    EDIT2: Nicht gerade schön, funktioniert aber:
    PHP-Code:
          $filename str_replace('\\''/'$filename); 
    Schöne Grüße,
    Andreas


  • #2
    Du könntest die Backslashes auch einfach ordentlich escapen:

    PHP-Code:
     require_once("D:\\CapSystems\\web\\ListProducts\\3.0\\includes\\lpx-class-listproducts.php"); 
    Gerade bei Strings in doppelten Anführungszeichen, in denen ja mehr Steuerzeichen erlaubt sind, ist das wichtig. Wobei ich mich frage, was du gegen einfache Anführungszeichen hast, ich sehe in deinem Code keinen Grund, doppelte zu benutzen.
    @fschmengler - @fschmengler - @schmengler
    PHP Blog - Magento Entwicklung - CSS Ribbon Generator

    Kommentar


    • #3
      Zitat von fab Beitrag anzeigen
      ... Wobei ich mich frage, was du gegen einfache Anführungszeichen hast, ich sehe in deinem Code keinen Grund, doppelte zu benutzen.
      Das liegt an dem alten Aberglauben, dass Windows nicht mit Forward-Slashes als Verzeichnistrennern umgehen könnte. Der stammt zwar aus grauer Vorzeit, als es noch Menschen gab, die mit der MS-DOS-Kommandozeile arbeiten mussten, hält sich aber bis heute.
      Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

      Kommentar


      • #4
        Er redet von Quotes, nich von Slashes.
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Zitat von nikosch Beitrag anzeigen
          Er redet von Quotes, nich von Slashes.
          Stimmt.
          Aber auch beim Verwenden von Single-Quotes müssen manche Backslashes escaped werden. Das Beachten dieser Regeln spart man sich beim Verwenden von Forward-Slashes.
          Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

          Kommentar


          • #6
            Aber auch beim Verwenden von Single-Quotes müssen manche Backslashes escaped werden
            Eigentlich nur der Begrenzer selbst, also '.
            --

            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


            --

            Kommentar


            • #7
              Zitat von nikosch Beitrag anzeigen
              Eigentlich nur der Begrenzer selbst, also '.
              Und uneigentlich auch noch Backslashes vor "'", die nicht das Ende der Zeichenkette darstellen.

              ... warum sollte man sich solchen Unsinn merken, wenn man ihn einfach ignorieren kann?
              Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

              Kommentar


              • #8
                ... warum sollte man sich solchen Unsinn merken, wenn man ihn einfach ignorieren kann?
                Weil es besser ist, Sachen zu begreifen, statt sie sich einfach nur zu merken.
                --

                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                --

                Kommentar


                • #9
                  Zitat von nikosch Beitrag anzeigen
                  Weil es besser ist, Sachen zu begreifen, statt sie sich einfach nur zu merken.
                  Was willst du an spezifischen Escaping-Regeln, aufgestellt für lediglich einen bestimmten Parser, begreifen? Die kann man sich nur merken (also auswendig lernen). Hantiert man neben PHP noch mit anderen Sprachen, ist das hier "begriffene" Wissen wertlos, weil woanders andere und meiner (unerheblichen) Meinung nach oft konsistentere Regeln gelten.
                  Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                  Kommentar


                  • #10
                    Was willst du an spezifischen Escaping-Regeln, aufgestellt für lediglich einen bestimmten Parser, begreifen?
                    Auch falls Dir das nicht aufgefallen ist, gehorchen diese Escapings bestimmten Regeln.
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar


                    • #11
                      Zitat von nikosch Beitrag anzeigen
                      Auch falls Dir das nicht aufgefallen ist, gehorchen diese Escapings bestimmten Regeln.
                      Yep, und Regeln lernt man (auswendig), oder schlägt sie nach, aber man muss sie nicht begreifen.

                      Und wer mit mehr als PHP zu tun hat, wird, um den Lernaufwand gering zu halten, die Kollisionshäufigkeit minimal halten. Der Backslash ist ein solches Zeichen, das sehr oft eine Sonderbedeutung hat (außerhalb der PHP-Parser-Single-Hochkomma-Welt auch mitten in String-Literalen), deshalb vermeide ich seine Benutzung, wo er sowieso nicht gebraucht wird. Pfad-Angaben sind so eine Anwendung. Abgesehen vom MS-DOS-Kommandozeileninterpreter kommt man fast überall ohne ihn aus, weil da der normale (Forward-)Slash der de-facto-Verzeichnisebenen-Trenner ist.
                      Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                      Kommentar


                      • #12
                        Und wer mit mehr als PHP zu tun hat, wird, um den Lernaufwand gering zu halten, die Kollisionshäufigkeit minimal halten.
                        Und wer später noch seine Pattern verstehen will, wird nicht alles pauschal quoten, nur weil der Ausdruck das verzeiht.

                        Regeln lernt man (auswendig), oder schlägt sie nach, aber man muss sie nicht begreifen.
                        Nicht alles ist aufzählbar und damit auswendig lernbar. Viele Dinge in der Programmierung sind beliebig kombinierbar. Deswegen muss man solche Sachen verstehen (bspw. das Prinzip des Ausdrucks in der Proghrammierung) um sie beliebig anwenden zu können.
                        --

                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                        --

                        Kommentar


                        • #13
                          Zitat von nikosch Beitrag anzeigen
                          Und wer später noch seine Pattern verstehen will, wird nicht alles pauschal quoten, nur weil der Ausdruck das verzeiht.
                          Welche Pattern? String-Konstanten oder -Literale entstehen üblicherweise, indem man die entsprechenden Zeichen zwischen entsprechenden Begrenzungszeichen eintippt oder von irgendwoher (bspw. aus einem anderen Script) kopiert. Unnötiges "Escapen" oder Falsch-Interpretation durch den Compiler vermeidet man, wenn man hierbei die Zeichen innerhalb des Strings bewusst "kollisionsarm" wählt. Bei Pfadangaben ist das möglich, weil die auf fast allen Betriebssystemen auf die gleiche Weise angegeben werden könnnen.

                          Nicht alles ist aufzählbar und damit auswendig lernbar.
                          Die üblichen Escaping-Regeln sind aufzählbar. Und man muss sie auswendig lernen, sonst steht man vor genau den Problemen, die solche Threads wie diesen hier verursachen. ... also zumindest den Anfang davon, nicht die Korinthenkackerei hier am Ende dieses Threads.

                          Viele Dinge in der Programmierung sind beliebig kombinierbar. Deswegen muss man solche Sachen verstehen (bspw. das Prinzip des Ausdrucks in der Proghrammierung) um sie beliebig anwenden zu können.
                          Nochmal: Escaping-Regeln für String-Literale sind nicht beliebig kombinierbar, unter anderem, weil sie willkürlich mit der Entwicklung der jeweiligen Programmiersprache entstanden sind. Wo viele Sprachen sich ziemlich ähnlich sind, hat PHP seine etwas eigenwilligen Regeln, die muss man kennen, sonst bekommt man über kurz oder lang Probleme.
                          Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                          Kommentar


                          • #14
                            Wie auch immer. Ich finde diese Regeln (bspw. das Parsingverhalten und damit auch das Escapingverhalten innerhalb von verschiedenen Quotes) nicht willkürlich sondern sehr logisch und aus einander herleitbar. Deswegen versuche ich die Sachen zu verstehen, statt sie auswendig zu lernen.

                            Beispiel
                            PHP parst (nur) in doppelten Hochkommata Variablen (das muss man wissen vulgo „lernen“)
                            In Strings gibt es die Möglichkeit, Sonderzeichen mit Backslash auszukommentieren („lernen“)
                            Daraus folgt (verstehen, ableiten, !lernen):
                            - Will man $var in doppelten Hochkommata ausschreiben, muss man $ escapen, weil $ eine Sonderrolle im Variablenbezeichner zukommt. Mit \ als Escapezeichen ergibt sich also: "\$var"
                            - Will man $var in einfachen Hochkommata ausschreiben, muss man $ nicht escapen, weil $ zwar eine Sonderrolle im Variablenbezeichner zukommt, Variablen in einfachen Quotes aber ohnehin nicht geparst werden. Also ergibt sich: '$var'
                            - Will man \ in Hochkommata ausschreiben, muss man es escapen, weil es eine Sonderrolle einnimmt (eben als Escapezeichen). Folglich schreibt man " \\Foo Bar"
                            --

                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                            --

                            Kommentar

                            Lädt...
                            X