tomtom: is_file und file_exists funktionieren nicht richtig

Hallo.
Ich habe ein Problem mit den Befehlen is_file und file_exists.

Inhalt des Ordners:

  • test.php
  • test.pdf
  • test.txt
  • funktion.php

Wenn ich jetzt in der Datei funktion.php die Befehle is_file und/oder file_exists auf die Dateien test.php und test.pdf ausführe, klappt das nur mit der PHP Datei. Die PDF und TXT werden nicht erkannt.

Ist hier eine Konfiguration am Server falsch?

Auf meinem lokalen Apache läufts doch auf dem WWW-Apache läufts nicht...

Ich weiß nicht weiter. Bitte helft. DANKE!
Tom

  1. Moin!

    Ich weiß nicht weiter. Bitte helft. DANKE!

    Lies </hilfe/charta.htm#tipps-fuer-fragende> - alle vier Punkte beachten!

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Aha. Das sind also die vier Punkte, die ich beachten soll:

      (1) Geben Sie eine möglichst exakte Problembeschreibung, mit Auswahl eines passenden Themenbereiches und Titels bekannt. Funzt nicht ist keine Problembeschreibung.

      Ok, meine Überschrift war vielleicht nicht gut gewählt. Aber: da die Funktionen true oder false zurückgeben, kann ich auch nicht mehr dazu sagen, wie geht oder geht nicht...

      (2) Geben Sie besondere Umgebungsbedingungen wie Browser und Betriebssystem etc. bekannt. Für ein Intranet gelten z.B. andere Maßstäbe als für im World Wide Web veröffentlichte Seiten.

      Habe ich: lokal und im www, jeweils auf Apache (genau: Apache 2). Browser, BS... spielen keine Rolle. Der Fehler entsteht ja nicht im Browser, wenn ich die Funktionen ausführe.

      (3) Machen Sie den problematischen Quellcode öffentlich. Entweder im Posting selbst oder mittels Link auf die betreffende Seite. Funktionierende Glaskugeln sind eine Rarität und bloßes Rätselraten erschwert eine schnelle und gute Hilfe. Gerne wird es gesehen, wenn der Quellcode auf die für das Problem notwendigen Stellen reduziert wird, schließlich hat kaum jemand Lust, sich in hunderte Zeilen unnötigen Code einzuarbeiten.

      Wie die Funktionen aufgerufen werden, habe ich mal vorausgesetzt. Aber:
      [php]
      if (file_exists("test.pdf")) echo "JA";
      else echo "NEIN";
      if (is_file("test.pdf")) echo "JA";
      else echo "NEIN";
      [/php]
      Der Code gibt in beiden Fällen (Funktionen) "NEIN" aus.

      (4) Schildern Sie, was Sie bisher zur Lösung des Problems unternommen haben. Es hilft Ihnen ja nicht, wenn Sie Tipps bekommen, die Sie bereits selbst ausprobiert haben.

      Was habe ich probiert.
      Ich habe den Pfad in allen Varianten angegeben "/",  "./" und ""
      Es mit verschiedenen Datenen versucht.. => nur mit PHP Dateien klappts...
      *AHA* Die schreibweise der Funktion stimmt also. Die Pfadangabe auch. Nur sobald ich von test.php auf test.pdf oder test.bmp ändere geht nicht mehr. Es kommt FALSE statt TRUE. Dateien sind alle vorhanden, alle Rechte sind gleich.

      So, Sven, was sagst Du nun? Ne Lösung?

      1. hi,

        So, Sven, was sagst Du nun?

        _Ich_ zumindest würde erst mal sagen, plustere dich bitte nicht so auf.
        Svens Hinweis war berechtigt, weil deine Problembeschreibung einfach zu wenig Informationen enthielt, um das Problem ansatzweise nachvollziehbar zu machen.

        Wie die Funktionen aufgerufen werden, habe ich mal vorausgesetzt.

        Ja, dass wir wissen, wie das theoretisch geht, darfst du getrost vorausetzen.
        Allerdings erlebt man hier jeden Tag, was für eine Menge an Unsinn offenbar möglich ist, wenn die Leute versuchen Theorie in Praxis umzusetzen. Um also ausschließen zu können, dass du da einen Fehler gemacht oder andere "Einflüsse" übersehen hast, müssen wir zumindest wissen, was du gemacht hast.

        *AHA* Die schreibweise der Funktion stimmt also. Die Pfadangabe auch. Nur sobald ich von test.php auf test.pdf oder test.bmp ändere geht nicht mehr. Es kommt FALSE statt TRUE. Dateien sind alle vorhanden, alle Rechte sind gleich.

        Wie hast du das überprüft?
        Bist du _sicher_, dass die Pfade und Schreibweisen zu _100%_ identisch sind? (bspw. auch in Punkto Groß-/Kleinschreibung)

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. *AHA* Die schreibweise der Funktion stimmt also. Die Pfadangabe auch. Nur sobald ich von test.php auf test.pdf oder test.bmp ändere geht nicht mehr. Es kommt FALSE statt TRUE. Dateien sind alle vorhanden, alle Rechte sind gleich.

          Wie hast du das überprüft?
          Bist du _sicher_, dass die Pfade und Schreibweisen zu _100%_ identisch sind? (bspw. auch in Punkto Groß-/Kleinschreibung)

          In Punkto Groß-/Kleinschreibung bin ich mir 100% sicher, da alles klein geschrieben ist.

          Wie ich das mit den Pfaden überprüft habe? Also es ist alles im selben Ordner: die PDF, BMP, TXT und die PHP die das Skript enthält.

          <?php
          if (is_file("test.txt")) echo "JA"; else echo "Nein";
          if (is_file("/test.txt")) echo "JA"; else echo "Nein";
          if (is_file("./test.txt")) echo "JA"; else echo "Nein";
          ?>
          liefert 3x das Resultat Nein. Das gleiche mit file_exists()!

          BS Server: SUSE 9.1
          PHP Version: 5

      2. Moin!

        (1) Geben Sie eine möglichst exakte Problembeschreibung, mit Auswahl eines passenden Themenbereiches und Titels bekannt. Funzt nicht ist keine Problembeschreibung.

        Ok, meine Überschrift war vielleicht nicht gut gewählt. Aber: da die Funktionen true oder false zurückgeben, kann ich auch nicht mehr dazu sagen, wie geht oder geht nicht...

        Eine "möglichst exakte Problembeschreibung" sollte den potentiellen Antworter im Zweifel genau in die Lage versetzen, das Problem lokal nachstellen zu können.

        Das kann ich aber nicht, wenn ich z.B. keinen Quelltext sehe (Mindestbedingung 1), und die Gewißheit über die sonstigen Umgebungsbedingungen dürfte ebenfalls nicht verkehrt sein. Unter dem Strich: Ein Zuviel an vernünftigen Informationen ist sicherlich weitaus weniger schädlich, als ein Zuwenig. Immerhin steht deine Anfrage hier schon über zwei Stunden rum, ohne Interesse geweckt zu haben. Und wenn ich dann das Zuwenig an Information bemängele, sollte das vielleicht zu denken geben und die Nachlieferung veranlassen.

        (2) Geben Sie besondere Umgebungsbedingungen wie Browser und Betriebssystem etc. bekannt. Für ein Intranet gelten z.B. andere Maßstäbe als für im World Wide Web veröffentlichte Seiten.

        Habe ich: lokal und im www, jeweils auf Apache (genau: Apache 2). Browser, BS... spielen keine Rolle. Der Fehler entsteht ja nicht im Browser, wenn ich die Funktionen ausführe.

        Aber selbstverständlich spielt das Betriebssystem eine Rolle. Nämlich das vom Server! Ich hätte nämlich einige Theorien für dein Problem, aber die kann ich natürlich nur verifizieren, wenn ich weiß, was du so verwendest.

        Und die PHP-Version zu wissen wäre auch nicht falsch. Kann ja immerhin sein, dass du eine ganz veraltete Version hast, in der Bugs enthalten sind.

        (3) Machen Sie den problematischen Quellcode öffentlich. Entweder im Posting selbst oder mittels Link auf die betreffende Seite. Funktionierende Glaskugeln sind eine Rarität und bloßes Rätselraten erschwert eine schnelle und gute Hilfe. Gerne wird es gesehen, wenn der Quellcode auf die für das Problem notwendigen Stellen reduziert wird, schließlich hat kaum jemand Lust, sich in hunderte Zeilen unnötigen Code einzuarbeiten.

        Wie die Funktionen aufgerufen werden, habe ich mal vorausgesetzt.  Aber:

          
        
        > if (file_exists("test.pdf")) echo "JA";  
        > else echo "NEIN";  
        > if (is_file("test.pdf")) echo "JA";  
        > else echo "NEIN";  
        
        

        Der Code gibt in beiden Fällen (Funktionen) "NEIN" aus.

        Natürlich weiß ICH, wie man die Funktionen aufruft. Aber ich habe ja auch kein Problem, scheinbar existierende Dateien damit zu finden, das Problem hast DU. Mit DEINEM Code. Und wenn dieser Code ein Problem hat, dann würde ich ihn gerne kennen und offensichtliche Fehler ausschließen. Das ist keine unzumutbare Gängelung, sondern zwingend notwendig.

        Du fragst ja auch nicht in der Autowerkstatt den Meister: "Ich hab bei mir im Auto das Blinkerlicht ausgetauscht, und jetzt geht das Bremslicht nicht mehr", und auf die Aussage "Kann ich mir das Auto mal ansehen" antwortest du "Also, ich dachte, wie ein Auto aussieht, sollte klar sein."

        (4) Schildern Sie, was Sie bisher zur Lösung des Problems unternommen haben. Es hilft Ihnen ja nicht, wenn Sie Tipps bekommen, die Sie bereits selbst ausprobiert haben.

        Was habe ich probiert.
        Ich habe den Pfad in allen Varianten angegeben "/",  "./" und ""
        Es mit verschiedenen Datenen versucht.. => nur mit PHP Dateien klappts...
        *AHA* Die schreibweise der Funktion stimmt also. Die Pfadangabe auch. Nur sobald ich von test.php auf test.pdf oder test.bmp ändere geht nicht mehr. Es kommt FALSE statt TRUE. Dateien sind alle vorhanden, alle Rechte sind gleich.

        Die Sache ist die: Dein hingeschriebener Testcode oben enthält alle diese Informationen nicht. Und so, wie du es hier verärgert hingeschrieben hast, ist das auch nicht wirklich hilfreich.

        So, Sven, was sagst Du nun? Ne Lösung?

        Ich hätte eigentlich (das wäre außerdem wesentlich kürzer gewesen) erwartet, dass du tatsächlich ein Testskript in dein Verzeichnis schreibst, welches sämtliche geprüften Varianten von is_file-Zugriffen auf test.php und test.pdf enthält - inklusive des Ergebnisses:

          
        <?php  
        echo "<pre>";  
        echo (is_file("test.php")?"php: ja":"php: nein")."\n"; // ja  
        echo (is_file("test.pdf")?"pdf: ja":"pdf: nein")."\n"; // nein  
        //... weitere Pfadvariationen, wenn nötig  
        echo "</pre>";  
        ?>  
        
        

        Außerdem wäre es gut, wenn du die Dateinamen verifizieren würdest:

          
        <?php  
        error_reporting(E_ALL);  
        $handle=opendir ('.');  
        echo "<pre>Verzeichnis-Handle: $handle\n";  
        echo "Dateien:\n";  
        while (false !== ($file = readdir ($handle))) {  
           echo "$file\n";  
        }  
        closedir($handle);  
        echo "</pre>";  
        ?>  
        
        

        Die Ergebnisse beider Skripte (ins gleiche Verzeichnis, ist ja klar) bitte mal posten.

        - Sven Rautenberg

        --
        My sssignature, my preciousssss!
        1. ich habs jetzt anders gelöst:

          <?php
          if (fopen("test.txt","r")) echo "JA";
          else echo "NEIN";
          ?>

          Wenn ich das im body Tag stehen habe, kommt endlich das JA, sobald die Datei test.txt existiert - und NEIN wenn ich sie wieder entferne.

          Warum das mit is_file() und file_exists() nicht klappt, hab ich immer noch nicht raus...

          1. Hallo tomtom.

            Warum das mit is_file() und file_exists() nicht klappt, hab ich immer noch nicht raus...

            Hast du einmal ein $_SERVER['DOCUMENT_ROOT'] (natürlich zuzüglich eventueller Unterverzeichnisse) bei der Pfadangabe voran gestellt?

            Einen schönen Montag noch.

            Gruß, Ashura

          2. Moin!

            Warum das mit is_file() und file_exists() nicht klappt, hab ich immer noch nicht raus...

            Wäre es zuviel verlangt, wenn du die Ausgabe dieses Skriptes posten würdest?

              
            <?php  
            error_reporting(E_ALL);  
            $handle=opendir ('.');  
            echo "<pre>Verzeichnis-Handle: $handle\n";  
            echo "Dateien:\n";  
            while (false !== ($file = readdir ($handle))) {  
               echo "$file - ".  
                (is_file($file)? "is_file":"no_file").  
                " - ".  
                (file_exists($file)?"exists":"nil")."\n";  
            }  
            closedir($handle);  
            echo "</pre>";  
            ?>  
            
            

            Außerdem wäre die vollständige PHP-Versionsnummer interessant - nur für den Fall, dass es sich hier um einen PHP-Bug handelt, der gemeldet und gefixt werden sollte.

            - Sven Rautenberg

            --
            My sssignature, my preciousssss!