tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
12
ZUGRIFFE
428
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    _Sunny_ _Sunny_ ist offline Rookie
    Registriert seit
    Jul 2010
    Beiträge
    5
    Hallo zusammen.

    Ich habe ein Problem in einem Skript, wo ich die Ursache nicht so recht finden kann. Kurze Erklärung, was dieses Skript macht: Es werden Dateinamen in einem Verzeichnis ausgelesen und mit einer vorhandenen Ersetzliste verglichen. Ist die Datei als Name in dieser Liste vorhanden, wird der Ersatzname daraus genommen und später das ganze als Links dargestellt.

    Wird nun diese Seite aufgerufen, die dieses Skript enthält, bekomme ich nur folgenden Fehler angezeigt:
    Warning: readdir(): 4 is not a valid Directory resource in /var/www/vhosts/wh1022.ath.cx/httpdocs/blatest/index.php on line 18
    Das ist der Quellcode dazu:
    PHP-Code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Unbenanntes Dokument</title>
    </head>
    <body>
    <?php
    $file 
    file('replaces.txt');
    foreach(
    $file as $replace)
    {
       list(
    $find,$replace) = explode(" => ",trim($replace));
       
    $replaces[$find] = $replace;
    }
    $dir opendir("tempss");
    if (
    $dir)
    {
      while(
    $file readdir($dir))
      {
        if (
    $file != '.' && $file != '..')
        {
          if (empty(
    $replaces[$file]))
            
    $name $replaces[$file];
          else
            
    $name $file;
          echo 
    "<a href=\"".$file."\">".$name."</a><br>";
        }
        
    closedir($dir);
      }
    }
    echo 
    "1: $file<br>";
    echo 
    "2: $dir<br>";
    echo 
    "3: $replace<br>";
    echo 
    "4: $replaces<br>";
    echo 
    "5: $find<br>";
    echo 
    "6: $name";
    ?>
    </body>
    </html>
    Zeile 18 ist in diesem Fall:
    PHP-Code:
      while($file readdir($dir)) 
    Im Moment befinde ich mich noch in der Testpahse, weshalb ich dies nur in eine unschöne Seite verpackt habe.
    Könnt ihr mir sagen, wo da der Fehler ist?
     

  2. #2
    Avatar von ComFreek
    ComFreek ComFreek ist gerade online [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.364
    Blog-Einträge
    4
    Die Funktion opendir ist eindeutig fehlgeschlagen.
    Vielleicht existiert das Verzeichnis garnicht.
     
    mfg ComFreek

    Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
    Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
    [PHP] Überprüfen, ob Website erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  3. #3
    Tim Bureck Tim Bureck ist offline Mitglied Platin
    Registriert seit
    Apr 2009
    Ort
    Düsseldorf (NRW)
    Beiträge
    508
    Das Problem liegt m.E. eher darin, dass in der while-Schleife am Ende closedir() aufgerufen wird. Dann ist das Handle futsch und readdir() funktioniert nicht mehr. Würde opendir() nicht funktioniert, würde das if($dir) das ja abfangen
     

  4. #4
    Avatar von tombe
    tombe tombe ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2004
    Ort
    Möglingen (BaWü)
    Beiträge
    3.109
    Kann es sein das die Pfadangabe für "tempss" u.a. falsch ist.

    Wenn ich folgende Änderung vornehme erscheint zumindest kein Fehler mehr:

    PHP-Code:
    $dir opendir("./tempss/");
    if (
    is_dir($dir)) 
    Habe es allerdings ohne Dateien im Verzeichnis getestet. Ob die Funktion selbst so richtig funktioniert weiß ich nicht.
     
    Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.

    Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.

  5. #5
    Tim Bureck Tim Bureck ist offline Mitglied Platin
    Registriert seit
    Apr 2009
    Ort
    Düsseldorf (NRW)
    Beiträge
    508
    Naja, wenn ich cd tempss eingebe, gelange ich ja auch ins Verzeichnis. Und letztendlich genau das macht opendir() ja erstmal. Die Abfrage is_dir($dir) kannst du dir auch sparen, da opendir() das auch prüft. Und ohne Dateien geht er ja erst gar nicht in die while-Schleife
     

  6. #6
    Avatar von rd4eva
    rd4eva rd4eva ist offline Mitglied Brillant
    Registriert seit
    Feb 2003
    Beiträge
    756
    Das Problem liegt m.E. eher darin, dass in der while-Schleife am Ende closedir()
    Tim hat Recht. closedir() gehört ausserhalb der while Schleife.

    Wenn opendir nicht funktionieren würde hätte es vermutlich sowieso einen Fehler geworfen und noch dazu gibt opendir im Fehlerfall false zurück, folglich wäre das script dann nie beim readdir() angekommen.

    //edit

    Die while Bedingung solltest du übrigens eher so schreiben:
    PHP-Code:
    while(false !== ($file readdir($dir))) 
    Den Grund dafür findest du in der readdir doku.
    Diese Funktion kann sowohl das boolsche FALSE zurückliefern, als auch einen nicht-boolschen Wert, wie zum Beispiel 0 oder "", der von einem einfachen if-Statement als FALSE ausgewertet wird. Weitere Informationen entnehmen Sie bitte dem Abschnitt über die boolschen Typen. Benutzen Sie deshalb den === Operator, um den Rückgabewert dieser Funktion zu überprüfen.
    Geändert von rd4eva (21.07.10 um 14:17 Uhr)
     
    In order to understand recursion, one must first understand recursion.

  7. #7
    Avatar von ComFreek
    ComFreek ComFreek ist gerade online [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.364
    Blog-Einträge
    4
    Zitat Zitat von Tim Bureck Beitrag anzeigen
    Das Problem liegt m.E. eher darin, dass in der while-Schleife am Ende closedir() aufgerufen wird.
    Das hatte ich übersehen.
     
    mfg ComFreek

    Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
    Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
    [PHP] Überprüfen, ob Website erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  8. #8
    _Sunny_ _Sunny_ ist offline Rookie
    Registriert seit
    Jul 2010
    Beiträge
    5
    Danke euch für eure schnellen und hilfreichen Antworten.
    Ich habe das Ganze jetzt soweit geändert, dass erstmal überhaupt Links erscheinen (auch wenn deren Namen noch nicht richtig sind). Funktionsfähig ist das mit diesem Script:
    PHP-Code:
    <?php
    $file 
    file('replaces.txt');
    foreach(
    $file as $replace)
    {
       list(
    $find,$replace) = explode(" => ",trim($replace));
       
    $replaces[$find] = $replace;
    }
    $dir opendir("./tempss/");

      while(
    $file readdir($dir))
      {
        if (
    $file != '.' && $file != '..')
        {
          if (empty(
    $replaces[$file]))
            
    $name $replaces[$file];
          else
            
    $name $file;
          echo 
    "<a href=\"".$file."\">".$name."</a><br>";
        }
      }
        
    closedir($dir);
    ?>
    Ändere ich jetzt aber die Zeile der while-Schleife so um, wie rd4eva es vorgeschlagen hat, bekomme ich erneut eine Fehlermeldung angezeigt:
    Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0

    Fatal error: Unknown: Failed opening required '/var/www/vhosts/wh1022.ath.cx/httpdocs/blatest/index.php' (include_path='.:') in Unknown on line 0
    An den Rechten kann es eigentlich nicht liegen, ich habe dem gesamten Ordner sowie den Unterordner mit Chmod 777 Vollzugriff gegeben.
     

  9. #9
    Tim Bureck Tim Bureck ist offline Mitglied Platin
    Registriert seit
    Apr 2009
    Ort
    Düsseldorf (NRW)
    Beiträge
    508
    Den Gedanken mit dem !== false hatte ich auch, allerdings dachte ich mir, dass jene Ausdrücke, die PHP als false wertet doch für einen Dateinamen eher unwahrscheinlich sind. Wenn deine Dateien also nicht 0 oder false heißen, kannst du die normale Abfrage lassen. Weshalb da allerdings dann diese Fehlermeldung kommt, während es mit der "einfachen" Bedingung funktioniert, kann ich auch nicht sagen...
     

  10. #10
    Avatar von rd4eva
    rd4eva rd4eva ist offline Mitglied Brillant
    Registriert seit
    Feb 2003
    Beiträge
    756
    die PHP als false wertet doch für einen Dateinamen eher unwahrscheinlich sind.
    Grundsätzlich gebe ich dir da recht. Allerdings sollte man nicht vergessen das es nicht nur um Dateinamen sondern auch Ordnernamen geht. Und ein Ordner der 0 heisst ist jedenfalls mMn schon nicht mehr so unwahrscheinlich.

    Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0
    Fatal error: Unknown: Failed opening required '/var/www/vhosts/wh1022.ath.cx/httpdocs/blatest/index.php' (include_path='.:') in Unknown on line 0
    Das kann ich mir ehrlich gesagt auch nur schwer erklären.
    Wem hast du denn Vollzugriff verpasst? Ich frage das deshalb weil der Webserver oft als autarker Benutzer läuft. Diesem müsstest du dann den Vollzugriff verpassen.
     
    In order to understand recursion, one must first understand recursion.

  11. #11
    Tim Bureck Tim Bureck ist offline Mitglied Platin
    Registriert seit
    Apr 2009
    Ort
    Düsseldorf (NRW)
    Beiträge
    508
    Zitat Zitat von rd4eva Beitrag anzeigen
    Grundsätzlich gebe ich dir da recht. Allerdings sollte man nicht vergessen das es nicht nur um Dateinamen sondern auch Ordnernamen geht. Und ein Ordner der 0 heisst ist jedenfalls mMn schon nicht mehr so unwahrscheinlich.
    Wohl nicht mehr so unwahrscheinlich wie bei Dateinamen. Deshalb sollte er in seinem Fall erstmal wissen, was in dem Ordner so drin sein kann, bis das andere Problem gelöst ist und man es sauber lösen kann.

    Zitat Zitat von rd4eva Beitrag anzeigen
    Das kann ich mir ehrlich gesagt auch nur schwer erklären.
    Wem hast du denn Vollzugriff verpasst? Ich frage das deshalb weil der Webserver oft als autarker Benutzer läuft. Diesem müsstest du dann den Vollzugriff verpassen.
    An den Rechten kann es eigentlich nicht liegen, ich habe dem gesamten Ordner sowie den Unterordner mit Chmod 777 Vollzugriff gegeben.
    Es hängt schon irgendwie mit den Rechten zusammen, die Frage ist nur die Rechte auf was. Das gibt die Fehlermeldung ja leider nicht her. Die zweite Fehlermeldung verstehe ich gerade überhaupt nicht... Ist das Script, das du geposted hast, die index.php oder gibt es noch weitere php-Dateien, in denen du ein bisschen rumincludest?
     

  12. #12
    Avatar von zer0
    zer0 zer0 ist offline Mitglied Brokat
    Registriert seit
    Oct 2009
    Beiträge
    323
    Zitat Zitat von _Sunny_ Beitrag anzeigen
    An den Rechten kann es eigentlich nicht liegen, ich habe dem gesamten Ordner sowie den Unterordner mit Chmod 777 Vollzugriff gegeben.
    Auch dem PHP Script? :P
     

  13. #13
    _Sunny_ _Sunny_ ist offline Rookie
    Registriert seit
    Jul 2010
    Beiträge
    5
    Am Ende lag es dann an den Rechten der PHP. Da andere Dateien auch ohne Probleme funktionieren, dachte ich, dass es daran nicht liegen kann. Habe jetzt die Rechte dieser PHP verändert (die waren auf 000) und mit den richtigen Rechten funktioniert es dann auch.

    Am Ende werden in den Ordner nur normale Dateien kommen.
    So an sich funktioniert jetzt das Skript, es gibt nur noch zwei Dinge, die geändert werden müssen: Die Links haben noch den gleichen Namen wie die Dateien selber, es wird noch nichts ersetzt.
    Aber das sollte kein Thema sein, das zu ändern. Und der Link ist noch verkehrt. Hier muss nur noch im Link selbst was geändert werden.

    Das Hauptproblem ist aber gelöst, dafür danke ich euch.
     

Ähnliche Themen

  1. Verzeichnis rekursiv auslesen, readdir-Fehler?
    Von Stephan Liebig im Forum PHP
    Antworten: 3
    Letzter Beitrag: 22.03.10, 15:45
  2. Kein Zugang ohne gültiges Passwort ! Please Help
    Von Roma3 im Forum Visual Basic 6.0
    Antworten: 6
    Letzter Beitrag: 14.05.08, 17:52
  3. Kein gültiges DateTime für Update
    Von Deletemaster im Forum .NET Datenverwaltung
    Antworten: 2
    Letzter Beitrag: 08.03.07, 22:24
  4. Antworten: 0
    Letzter Beitrag: 13.02.07, 02:40
  5. Kein gültiges Argument? Wieso?
    Von Nimroy im Forum PHP
    Antworten: 3
    Letzter Beitrag: 17.03.04, 21:49