Enrico: "Filename cannot be empty" -> Verzeichnisproblem?

Mahlzeit,

ich komme bei meinem Gästebuch-Skript nicht weiter, weil mir stetig die Warnung "file() [function.file]: Filename cannot be empty in C:\xampplite\htdocs\Dateien\php\Gaestebuch\inc_Funktionen.inc on line 20" ausgegeben wird.

Folgende Verzeichnisstruktur habe ich lokal angelegt, da ich ja noch ganz am Anfang der Entwicklung stehe:

Datei "Gaestebuch.php"
   |
   +- "Ordner "Gaestebuch"
      |
      +- Datei "inc_Einstellungen.inc"
      |
      +- Datei "inc_Funktionen.inc"
      |
      +- Datei "txt_Eintraege.txt"

In der Datei "Gaestebuch.php", die beim Sprung in unser Gästebuch als erste Datei aufgerufen wird, binde ich die notwendigen Dateien ein und bereite die eingelesenen Einträge für die Ausgabe vor:

include ("Gaestebuch/inc_Einstellungen.inc");
   include ("Gaestebuch/inc_Funktionen.inc");

Eintraege_aufbereiten ();

In der Datei "inc_Einstellungen.inc" lege ich u.a. den Pfad auf die Datei mit den Einträgen:

$Datei_Eintraege = "Gaestebuch/txt_Eintraege.txt";

Die Datei "inc_Funktionen.inc" beinhaltet, wenn alles fertig ist, alle Funktionen, die für den Betrieb unseres Gästebuches erforderlich sind, u.a. auch die Funktion "Eintraege_aufbereiten ()", in der in der markierten Zeile obige Warnung ausgegeben wird:

function Eintraege_aufbereiten ()
   {
==>   $Eintraege = array_reverse (file ($Datei_Eintraege)); <==

$Anzahl_Eintraege = count ($Datei_Eintraege);

for ($Reihe = 0; $Reihe < $Anzahl_Eintraege; $Reihe++)
      {
         $Spalte = explode ("|", $Eintraege [$Reihe]);

$Name     = $Einzelne_Spalten [0];
         $Datum    = $Einzelne_Spalten [1];
         $Uhrzeit  = $Einzelne_Spalten [2];
         $Eintrag  = $Einzelne_Spalten [3];
         $eMail    = $Einzelne_Spalten [4];
         $Homepage = $Einzelne_Spalten [5];

$Klasse_eMail    = ($eMail == "")    ? "Keine_eMail"    : "eMail";
         $Klasse_Homepage = ($Homepage == "") ? "Keine_Homepage" : "Homepage";

echo <<<EOT

<table>
               <tr>
                  <td class="Eintrag_Abschnitt_Oben"></td>
               </tr>
               <tr>
                  <td class="Eintrag">$Eintrag</td>
               </tr>
               <tr>
                  <td class="Eintrag_Abschnitt_Unten"></td>
               </tr>
               <tr>
                  <td class="Rechtsbuendig">$Name</td>
               </tr>
               <tr>
                  <td class="Rechtsbuendig">$Datum</td>
               </tr>
               <tr>
                  <td class="Rechtsbuendig">$Uhrzeit Uhr</td>
               </tr>
            </table>

EOT;
      }
   }

Ich vermute, dass hier ein Problem mit den Pfad-Angaben vorliegt, wobei das auch nicht ganz zutreffend sein kann, denn sonst hätte die Datei "Gaestebuch.php" die zu includierenden Dateien ja nicht gefunden, also wird zunächst "inc_Einstellungen.inc" geladen und ausgeführt.

Werden die Pfad-Angaben von der "Root"-Datei, hier "Gaestebuch.php" abgearbeitet oder wie geht PHP hier vor?
Warum wird die Variable "$Datei_Eintraege" als leer interpretiert?

Ich habe deshalb kein vorgefertigtes Skript verwendet, weil ich ja etwas lernen und nicht nur einbinden möchte.

Vielen Dank für eure Mithilfe.

Gruß
Enrico

  1. Hi,

    function Eintraege_aufbereiten ()
       {
    ==>   $Eintraege = array_reverse (file ($Datei_Eintraege)); <==

    An dieser Stelle ist eine Variable namens $Datei_Eintraege nicht vorhanden.
    Du hast ein Problem mit dem Gültigkeitsbereich von Variablen, dem sog. Scope.

    Stelle bitte das error_reporting auf E_ALL, dann kann PHP dich darauf hinweisen, wenn du auf Variablen zuzugreifen versuchst, die es an der Stelle gar nicht gibt.

    $Anzahl_Eintraege = count ($Datei_Eintraege);

    In dieser nachfolgenden Zeile möchtest du übrigens die Anzahl der Elemente von $Eintraege zählen.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. Hi!

    function Eintraege_aufbereiten ()
       {
    ==>   $Eintraege = array_reverse (file ($Datei_Eintraege)); <==

    Stell das error_reporting auf E_ALL (und display_errors auf on) beim Entwickeln, mach Kontrollausgaben mit var_dump() und lies (nochmal) über den Geltungsbereich von Variablen nach.

    Lo!

    1. Hallo dedlfix & ChrisB,

      lies (nochmal) über den Geltungsbereich von Variablen nach.

      Ok, "global $Datei_Eintraege;" innerhalb meiner Funktion hat die Warnung entkräftigt.

      Ich habe die Verzeichnisstruktur nun reduziert, alle Variablen in meiner Einstiegsdatei "Gaestebuch.php" definiert und im Ordner "Gaestebuch", der sich direkt unterhalb der Einstiegsdatei befindet, nur noch die Textdateien, u.a. auch .

      Was ich allerdings nicht raffe, ist die nun folgende Warnung "file(Gaestebuch/txt_Eintraege.txt) [function.file]: failed to open stream: No such file or directory in C:\xampplite\htdocs\Dateien\php\Gaestebuch.php on line 62"

      Zeile 62 ist die folgende:

      global $Datei_Eintraege;

      Die Variable habe ich wie folgt belegt:

      $Datei_Eintraege = "Gaestebuch/txt_Eintraege.txt";

      Die Textdatei existiert aber in genau der Schreibweise im Ordner "Gaestebuch", ich habe den Namen extra in's Skript reinkopiert, auch beim Ordnernamen habe ich mich nicht verschrieben:

      <?php

      error_reporting (E_ALL);

      /*
             * /////////////////////////
             * //                     //
             * //  V A R I A B L E N  //
             * //                     //
             * /////////////////////////
             *
             */

      $Datei_Eintraege = "Gaestebuch/txt_Eintraege.txt";

      usw. usw. usw.

      /*
             * ///////////////////////////////
             * //                           //
             * //  H A U P T R O U T I N E  //
             * //                           //
             * ///////////////////////////////
             *
             */

      Eintraege_aufbereiten ();

      /*
             * ///////////////////////////////////
             * //                               //
             * //  H A U P T F U N T I O N E N  //
             * //                               //
             * ///////////////////////////////////
             *
             */

      /*
             *
             * EINTRÄGE AUFBEREITEN
             *
             */

      function Eintraege_aufbereiten ()
            {
               global $Datei_Eintraege;

      $Eintraege = array_reverse (file ($Datei_Eintraege));

      $Anzahl_Eintraege = count ($Eintraege);

      for ($Zeile = 0; $Zeile < $Anzahl_Eintraege; $Zeile++)
               {
                  $Spalte = explode ("|", $Eintraege [$Zeile]);

      $Name     = $Einzelne_Spalten [0];
                  $Datum    = $Einzelne_Spalten [1];
                  $Uhrzeit  = $Einzelne_Spalten [2];
                  $Eintrag  = $Einzelne_Spalten [3];
                  $eMail    = $Einzelne_Spalten [4];
                  $Homepage = $Einzelne_Spalten [5];

      $Klasse_eMail    = ($eMail == "")    ? "Keine_eMail"    : "eMail";
                  $Klasse_Homepage = ($Homepage == "") ? "Keine_Homepage" : "Homepage";

      echo <<<EOT

      <table>
                        <tr>
                           <td class="Eintrag_Abschnitt_Oben"></td>
                        </tr>
                        <tr>
                           <td class="Eintrag">$Eintrag</td>
                        </tr>
                        <tr>
                           <td class="Eintrag_Abschnitt_Unten"></td>
                        </tr>
                        <tr>
                           <td class="Rechtsbuendig">$Name</td>
                        </tr>
                        <tr>
                           <td class="Rechtsbuendig">$Datum</td>
                        </tr>
                        <tr>
                           <td class="Rechtsbuendig">$Uhrzeit Uhr</td>
                        </tr>
                     </table>

      EOT;
               }
            }

      /*
             * =========================================================================================================================
             */

      /*
             * /////////////////////////////////////
             * //                                 //
             * //  U N T E R F U N K T I O N E N  //
             * //                                 //
             * /////////////////////////////////////
             *
             */

      usw. usw. usw.

      ?>

      1. Hallo dedlfix & ChrisB,

        ich habe nun festgestellt, dass gar keine txt-Dateien gefunden und eingelesen werden, auch nicht, wenn sie sich auf gleicher Ebene wie die Datei "gaestebuch.php" befinden.

        Kann es sowas wirklich geben?

        Ich kann mir nicht vorstellen, dass ich bei XAMPP extra noch etwas angeben/anpassen muss, um auf Dateien zugreifen zu können.

        An meinem Listening-Port 8080 kann es auch nicht liegen, da ich php ja grundsätzlich ausführen kann.

        Ich dreh' noch durch...

        Gruß
        Enrico

  3. Mann, Mann, Mann, wenn man natürlich von der Gästebuch-Datei ausgeht und nicht von der Datei, die die Gästebuch-Datei *einbindet*, dann kann es ja nicht klappen ;-)

    Viele Grüsse
    Enrico