Problem mit Readdir (kein gültiges Verzeichnis)

_Sunny_

Grünschnabel
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:
<!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:
  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?
 
Die Funktion opendir ist eindeutig fehlgeschlagen.
Vielleicht existiert das Verzeichnis garnicht.
 
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
 
Kann es sein das die Pfadangabe für "tempss" u.a. falsch ist.

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

PHP:
$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.
 
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 ;)
 
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:
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.
 
Zuletzt bearbeitet:
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:
<?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.
 
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...
 
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.
 
Zurück