enrico: Datei einlesen und Inhalt ausgeben klappt nicht mehr

Hallo und guten Morgen,

das kommt davon, wenn man seinen Code umstellt, ohne die Dateien vorher zu sichern:

Das Einlesen und/oder die Ausgabe meiner DVD-Verwaltung funktioniert nicht mehr wie gewünscht.

Die Datei "Index.php" stellt das umfassende Gerüst dar:

<html>
      <head>
         ... usw ...
      </head>
      <body>
         ... usw ...
         <div id="Anzeige">

<?php

include ("Listenausgabe_Variablen.php");
               include ("Listenausgabe_Funktionen.php");
               include ("Listenausgabe_Steuerung.php");

?>

</div>
         ... usw ...
      </body>
   </html>

Hier die Inhalte der eingebundenen Dateien:

Listenausgabe_Variablen.php:

$Sammlung      = "../SAMMLUNG/Sammlung.txt";
   $Sammlung_Temp = "../SAMMLUNG/Sammlung_Temp.txt";

Listenausgabe_Funktionen.php:

function Datei_einlesen ($Dateiname)
   {
      $Dateizeiger = fopen ($Dateiname, "r");

if ($Dateizeiger)
      {
         while (!feof ($Dateizeiger))
         {
            $Spalte = explode("|", fgets ($Dateizeiger));

$Inhalt = array(
               'Nr'     => $Spalte[0],
               'Titel'  => $Spalte[1],
               'Inhalt' => $Spalte[2],
               'Genre'  => $Spalte[3],
               'FSK'    => $Spalte[4]
            );
         }
      }

fclose ($Dateizeiger);

return $Inhalt;
   }

function Liste_ausgeben ($Inhalt)
   {
      for ($i = 0; $i < count ($Inhalt); $i++)
      {
         ...usw...
         echo $Inhalt[$i]["Nr"];
         echo $Inhalt[$i]["Titel"];
         echo $Inhalt[$i]["Genre"]
         echo $Inhalt[$i]["FSK"];
         ...usw...
      }
   }

Listenausgabe_Steuerung.php:

$Aktion = $_REQUEST ["Aktion"];

switch ($Aktion)
   {
      case "Alle_Filme":
      {
         $Inhalt = Datei_einlesen ($Sammlung);
         Liste_ausgeben ($Inhalt);

break;
      }

...usw...

default:
      {
         $Inhalt = Datei_einlesen ($Sammlung);
         Liste_ausgeben ($Inhalt);

break;
      }
   }

Die Variable "$Aktion" wird in der Index.php über Zuweisungen direkt beim Link belegt:

<a href="?Aktion=..." ...usw...>

Wenn ich mir mit "var_dump ($Inhalt);" den Inhalt der Variable "$Inhalt" anzeigen lasse, dann
erhalte ich folgende Bildschirmausgabe:

array(5)
   {
      ["Nr"]     => string(2)   "29"
      ["Titel"]  => string(17)  "STIRB LANGSAM 4.0"
      ["Inhalt"] => string(480) "Eine neue Art von Terrorismus ..."
      ["Genre"]  => string(6)   "Action"
      ["FSK"]    => string(2)   "16"
   }

Dies sagt mir, dass, warum weiß ich nicht, nur der allerletzte Datensatz der Datei "Sammlung.txt"
eingelesen wurde.

Woran liegt es, dass die Datei nicht komplett eingelesen wird?

Vielen Dank für Eure Mithilfe...

Gruß
Enrico

  1. Mahlzeit,

    $Inhalt = array(
                   'Nr'     => $Spalte[0],
                   'Titel'  => $Spalte[1],
                   'Inhalt' => $Spalte[2],
                   'Genre'  => $Spalte[3],
                   'FSK'    => $Spalte[4]
                );

    Hier weist Du der Variablen $Inhalt EIN eindimensionales Array zu ... und im nächsten Schleifendurchlauf überschreibst Du es wieder.

    }
          }

    fclose ($Dateizeiger);

    Hier solltest Du sinnvollerweise mal ein var_dump() machen. :-)

    return $Inhalt;
       }

    function Liste_ausgeben ($Inhalt)
       {
          for ($i = 0; $i < count ($Inhalt); $i++)
          {
             ...usw...
             echo $Inhalt[$i]["Nr"];

    Hier bist Du anscheinend der Meinung, $Inhalt wäre ein mehrdimensionales Array. Ist es aber nicht. :-)

    $Inhalt = Datei_einlesen ($Sammlung);

    Grundsätzlich ist es keine gute Idee, globale und lokale Variablen mit gleichem Namen zu benutzen - da kommt man sonst sehr leicht durcheinander.

    Dies sagt mir, dass, warum weiß ich nicht, nur der allerletzte Datensatz der Datei "Sammlung.txt"
    eingelesen wurde.

    Nein. Das sagt Dir, dass nur der letzte Datensatz im Array $Inhalt enthalten ist. :-)

    Woran liegt es, dass die Datei nicht komplett eingelesen wird?

    Wird sie doch - Du überschreibst nur jeden einzelnen Datensatz mit dem folgenden.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Hallo mbr & EKKi,

      Mensch, das war's...

      Flink die beiden eckigen Klammern ergänzt und schon klappt es wieder :-))

      Vielen lieben Dank Euch beiden.

      Gruß
      Enrico

      1. Hi,

        Flink die beiden eckigen Klammern ergänzt und schon klappt es wieder :-))

        Ja - bis zum naechsten Murks ...

        Waere vielleicht ganz gut, wenn du
        a) langsam mal lernen wuerdest zu analysieren, was dein eigener Code macht, und
        b) ihn auch entsprechend kommentierst - insb. auch, wenn du Aenderungen vornimmst, so dass du deren Auswirkungen auch anschliessend noch nachvollziehen kannst.

        MfG ChrisB

        --
        "The Internet: Technological marvel of marvels - but if you don't know *what* you're lookin' for on the Internet, it is nothing but a time-sucking vortex from hell."
      2. echo $begrüßung;

        Flink die beiden eckigen Klammern ergänzt und schon klappt es wieder :-))

        Es klappt, ist aber dennoch fehlerhaft. Wenn die Datei leer ist oder nicht geöffnet werden konnte, ist die Variablen $Inhalt nicht vorhanden, wenn du zum Ende der Funktion kommst und sie zurückgeben willst. PHP gibt dann stattdessen ein NULL zurück. Schreibvorgängen in bedingten Programmteilen (if, while, for, foreach) sollte immer ein definiertes Anlegen der Variable in einem vorherigen, unbedingten Teil erfolgen, damit bei nicht erfüllter Bedingung die Variable garantiert vorhanden und mit einem Default-Wert belegt ist. In deinem Fall wäre ein leeres Array als Default-Wert angebracht. Weiterhin ist es günstiger, foreach zu verwenden, wenn du ein Array von vorn bis hinten durchlaufen willst. Damit sparst du dir das Hantieren mit der Hilfsvariable $i und das Aufrufen der count()-Funktion bei jedem Schleifendurchlauf.

        Deinen Fehler hättest du auch selbst mit Hilfe von Kontrollausgaben erkennen können. Kontrollausgaben sind eins der wichtigsten Hilfsmittel zur Fehlersuche. Wenn eine Abfrageschleife ein unerwartetes Ergebnis liefert, dann kann man innerhalb der Schleife vor und nach jeder Änderung eines Wertes eine Kontrollausgabe der beteiligten Variablen einfügen.

        echo "$verabschiedung $name";

  2. Hallo Enrico

    hier

    if ($Dateizeiger)
          {
             while (!feof ($Dateizeiger))
             {
                $Spalte = explode("|", fgets ($Dateizeiger));

    $Inhalt = array(
                   'Nr'     => $Spalte[0],
                   'Titel'  => $Spalte[1],
                   'Inhalt' => $Spalte[2],
                   'Genre'  => $Spalte[3],
                   'FSK'    => $Spalte[4]
                );
             }
          }

    liest du in einer Schleife die Dateiinhalte aus. Dabei überschreibst(!) du jedesmal das Array $Inhalt. Am Ende ist dann der letzte Datensatz dort gespeichert. Vorschlag (quick & dirty):
    Benutze folgende Zeilen:

      
    $Inhalt[] = array(  
                    'Nr'     => $Spalte[0],  
                    'Titel'  => $Spalte[1],  
                    'Inhalt' => $Spalte[2],  
                    'Genre'  => $Spalte[3],  
                    'FSK'    => $Spalte[4]  
                 );  
    
    

    Das sollte dir ein zweidimensionales Array geben. In $Inhalt[0] stehen die daten des ersten Datensatzes, in $inhalt[1] die Daten des zweiten Datensatzes, usw... Bitte beachten, dass der Index 0 basiert ist. Das heißt: die Daten des n-ten Datensatzes stehen in $Inhalt[n-1].
    Liebe Grüße mbr