schwarze Piste: Textfile auslesen ... irgendwie

Tachchen!

Da es ja fast schon peinlich ist, wie wenig Ahnung ich von PHP habe,
habe ich beschlossen, mir ein simples Einsteigerprojekt zu suchen
und wenigstens einfache Sachen in PHP zu lernen.
(Es besteht also die Gefahr, dass ich in naher Zukunft viele dumme Fragen stelle ;-))

Ich fotografiere selbst und habe auch eine Homepage dazu.
Was lag also näher, als eine Kommentarfunktion für jedes Bild zu entwerfen?

Bislang ist es mir gelungen, aus jedem Kommentar eine Zeile in einem
Textfile zu erstellen die dann folgende Struktur hat:

URL von der aus gepostet wurde|Name|Mailadresse|noch unformatierter Kommentar

Jetzt stehe ich vor der Frage, wie ich das ganze nun auslese.
Ich finde zwar überall Anleitungen, wie ich einzelne Zeilen des Textfiles
ausgebe, aber ich habe genau keine Idee, wie ich erstens die einzelnen
"Abschnitte" trenne und zweitens den ersten Abschnitt gar nicht ausgebe
und ihn stattdessen nutze, die Kommentare einer Seite/einem Bild zuzuordnen.

Dann mir da mal jemand einen "heißen Tipp" geben?

Gruß

Die schwarze Piste

--
ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
Smartbytes Webdesign in Oberhausen
  1. Hello,

    Dann mir da mal jemand einen "heißen Tipp" geben?

    Wir könnten einen übnerlangen Thread beginnen in Ergänzung zu dem, den ich mal mit Dennis hatte hier. Seine Seite und die "Flatbox" sind da für Dich vielleicht auch ein gute Anleitung
    http://tutorial.riehle-web.com/scripts/#flatbox

    Unser Thread würde allerdings unter dieser Etage einsteigen, und einfach die unterschiedlichen Arten der Datenverwaltung in Binary-/ Textdateien mittels PHP beleuchten.

    Wenn Du das willst, dann lasse es langsam losgehen...

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. Tachchen!

      Wenn Du das willst, dann lasse es langsam losgehen...

      Langsam und auf unteren Etagen kann ich! ;-)

      http://tutorial.riehle-web.com/scripts/#flatbox

      Also ich habe gerade die ersten Teile der Flatbox mal quergelesen und vor
      allem festgestellt, dass mir das zu theoretisch und zu "php-Latein" ist.

      Wenn ich das richtig verstehe, soll ich meine Art der Datenspeicherung
      mal direkt sein lassen und stattdessen "arrays abbilden".
      Abgesehen davon, dass ich mir unter "arrays abbilden" schon nur sehr
      rudimentär etwas vorstellen kann, stehe ich vor allem immer vor ganz
      praktischen Fragen wie: "Wie bekomme ich Daten vom Formular ins File?".

      Du siehst, ich mache und lese und probiere gerne herum, aber gerade bei
      PHP fehlt mir seit jeher irgendwie der Zugang, der Anfang, von dem aus
      man sich mal vorhangeln kann ...

      Gruß

      Die schwarze Piste

      --
      ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
      Smartbytes Webdesign in Oberhausen
      1. Hello,

        Also ich habe gerade die ersten Teile der Flatbox mal quergelesen und vor
        allem festgestellt, dass mir das zu theoretisch und zu "php-Latein" ist.

        Genau deshalb habe ich Dir vorgeschlagen, einen Thread zu führen, der sich eine Schicht unter dem anderen bewegen würde.

        Es geht ums Dateien gestalten, schreiben, lesen...
        Wie muss ich meine daten organisieren, um schnell darauf zugreifen zu können und sofort zu wissen, wo was steht. Oder?

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. Tachchen!

          Es geht ums Dateien gestalten, schreiben, lesen...
          Wie muss ich meine daten organisieren, um schnell darauf zugreifen zu können und sofort zu wissen, wo was steht. Oder?

          Man kann schnell und langsam zugreifen?
          Ich wäre glücklich, wenn ich irgendwie gezielt zugreifen könnte.

          In dem Zusammenhang nehme ich jeden Tipp an, wie die Daten möglichst schlau
          angelegt und dann abgefragt werden können. Nur sind unverständige Rückfargen
          von vornherein garantiert! ;-)

          Gruß

          Die schwarze Piste

          --
          ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
          Smartbytes Webdesign in Oberhausen
          1. Hello,

            Man kann schnell und langsam zugreifen?
            Ich wäre glücklich, wenn ich irgendwie gezielt zugreifen könnte.

            Da sind wir doch schon beim Thema.
            Um gezielt und ohne Umwege und Zwischenschritte zugreifen zu können, benötigst Du eine

            Random Access File

            Struktur.
            Auch die kann man mit PHP bauen, auch wenn es nicht so schön leicht wie in Pascal oder C funktioniert. PHP hat da mMn ein Manko, allerdigns habe ich die 5.x noch nicht genau untersucht. Vielleicht geht es ja jetzt auch leichter.

            Harzliche Grüße vom Berg
            http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

            1. Tachchen!

              Random Access File

              O.k., ich weiß jetzt, dass random access files meine Aufgabe dergestalt
              lösen, dass sie in fest definierte Feldgrößen hinein die Daten schreiben,
              sodass man dann gezielt auf ein solches Feld zugreifen kann.
              (Man weiß, wie groß die Felder davor sind, also kann man zum Anfang des Feldes
              dahinter springen ... richtig?)

              Und wie lege ich nun ein solches Feld an und schreibe die Daten aus meinem
              Formular dort hinein?

              Gruß

              Die schwarze Piste

              --
              ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
              Smartbytes Webdesign in Oberhausen
              1. Hello,

                [...]
                Richtig.

                Und wie lege ich nun ein solches Feld an und schreibe die Daten aus meinem
                Formular dort hinein?

                PHP kennt (sowei ich im Moment weiß) keine einfache Definitionsmöglichkeit für eigene Datenstrukturen (Records, Structures). Daher muss man etwas tricksen.

                Man legt sich einen leeren Datensatz an.

                $recordstring = str_repeat(chr(0),$recordsize);

                und dann schreibt man einfach an die Stelle in diesem Satz mittels

                $recordstring = substr($recordstring,0,$start).$daten.substr($recordstring,strlen($daten));

                Die neuen Daten rein.
                Da kann man sie nachher auch wieder rausholen.

                $daten darf natürlich nicht länger sein, als vorgesehen.

                Eventuell geht es auch einfacher, das habe ich aber noch nicht ausprobiert und im PHP-Code überprüft...

                $recordstring{$start} = $daten;

                Jenachdem, wie PHP das interpretiert, gibt es eine Fehlermeldung oder aber alle auf $start folgenden Bytes des Strings werden mit denen von $daten überschrieben.

                Win Beispiel für random Access findest Du unter

                http://selfhtml.bitworks.de --> Adressverwaltung

                Harzliche Grüße vom Berg
                http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau

                1. Hello,

                  $recordstring = substr($recordstring,0,$start).$daten.substr($recordstring,$start+strlen($daten));

                  Harzliche Grüße vom Berg
                  http://www.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau

                2. Tachchen!

                  Man legt sich einen leeren Datensatz an.

                  $recordstring = str_repeat(chr(0),$recordsize);

                  Ist das o.k., wenn ich kein Wort verstehe?

                  $recordstring ist also ein solcher Datensatz und dort steht in jedem der
                  Anzahl = $recordsize "Felder" eine 0? Das kann ich nicht richtig verstanden
                  haben, oder?

                  Gruß

                  Die schwarze Piste

                  --
                  ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
                  Smartbytes Webdesign in Oberhausen
                  1. Hello,

                    Man legt sich einen leeren Datensatz an.

                    $recordstring = str_repeat(chr(0),$recordsize);

                    Ist das o.k., wenn ich kein Wort verstehe?

                    $recordstring ist also ein solcher Datensatz und dort steht in jedem der
                    Anzahl = $recordsize "Felder" eine 0? Das kann ich nicht richtig verstanden
                    haben, oder?

                    Doch, das hat Du richtig verstanden. Es steht eine binäre 0 in allen Bytes des leeren Datensatzes.
                    Was würdest Du denn gerne reinschreiben?
                    "Nichts" kann man auf dieser niedrigen Ebene nicht darstellen.

                    Harzliche Grüße vom Berg
                    http://www.annerschbarrich.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau

                    1. Tachchen!

                      Doch, das hat Du richtig verstanden.

                      LOL, nennen wir es mal "richtig geraten".

                      Aber dann gehen bei mir auch endgültig die Lichter aus:

                      $recordstring = substr($recordstring,0,$start).$daten.substr($recordstring,strlen($daten));

                      Was soll hier passieren?
                      $recordstring soll jetzt sein ein Teil des alten $recordstrings und zwar
                      der Teil ab der 0 (die ja aber überall am Anfang steht, oder?) und von dort
                      aus Anzahl = $start Zeichen lang?
                      Und dahinter wird es noch dunkler ...

                      Gruß

                      Die schwarze Piste

                      --
                      ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
                      Smartbytes Webdesign in Oberhausen
                3. echo $begrüßung;

                  Eventuell geht es auch einfacher, das habe ich aber noch nicht ausprobiert und im PHP-Code überprüft...

                  $recordstring{$start} = $daten;

                  Hier wird nur das Zeichen an der Position $start mit dem ersten Zeichen aus $daten überschrieben.

                  Leider wird die für PHP 6 geplante Syntax $string[von, bis] wohl nicht für die Anwendung auf der linken Seite einer Zuweisung realisiert werden.

                  echo "$verabschiedung $name";

                  1. Hello,

                    $recordstring{$start} = $daten;

                    Hier wird nur das Zeichen an der Position $start mit dem ersten Zeichen aus $daten überschrieben.

                    Leider wird die für PHP 6 geplante Syntax $string[von, bis] wohl nicht für die Anwendung auf der linken Seite einer Zuweisung realisiert werden.

                    Da wäre ein ähnliches Konstrukt benötigt, wie es list() darstellt.

                    target($string,$offset,$len) = $data_string

                    und wenn $data_string länger ist, als $len, dann wird es abgeschnitten,
                    wenn $data_string kürzer ist, als $len, wird mit FILLCHAR aufgefüllt
                    wenn $data_string eigentlich eine Zahl ist, wird rechtsbündig eingefügt mit führenden NUL
                    usw.

                    Wo muss man denn seine Wünsche äußern bie den PHPlern, damit sie berücksichtigt werden?

                    Allerdings sind die wohl ziemlich arrogant und selbstüberheblich.
                    Ich habe ihnen mal einen graviereneden Denkfehler beim Umgang mit DIO und FLOCK mitgeteilt. Das hat dann dazu geführt, dass ich nach zweimaligem höflichstem Nachtrag wegen Ignoranz im Manual (UCN) mit dem eMailnamen gesperrt wurde... obwohl der Dialog über email stattgefunden hat.

                    Harzliche Grüße vom Berg
                    http://www.annerschbarrich.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau

  2. Hallo schwarze Pise,

      
    $t=file('k.txt');  
    $c=count($t);  
    for($i=0;$i<$c;$i++)  
       if(strpos($t[$i],$_SERVER['REQUEST_URI'])===0)){  
          $x=explode('|',$t[$i]);  
          for($j=1;$j<4;$j++)  
             print_dein_format($x[$j]);  
          break;  
       }  
    
    

    Gruß aus Berlin!
    eddi

    --
    Achte die Kleinigkeiten, aber liebe das Detail!
    1. Tachchen!

      O.k., nur um dir zu zeigen, wie wenig weit ich dir folgen kann:

      $t=file('k.txt');

      Hier wird meine Kommentardatei ausgelsen und es wird aus jedem Datensatz
      ein Array gemacht. Ist das korrekt?
      Also ist $t jetzt ein "Ansammlung von Arrays"?

      $c=count($t);

      count zählt jetzt die Anzahl der Arrays = Datensätze?

      for($i=0;$i<$c;$i++)

      Und ab hier mein Lieblingsthema wann immer ich mich in PHP einlsen wollte:
      Was ist i, was wollen mir die vielen "+" sagen und was soll deine Codezeile
      gerade bewirken?

      Gruß

      Die schwarze Piste

      --
      ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
      Smartbytes Webdesign in Oberhausen
      1. Re:

        $t=file('k.txt');

        Hier wird meine Kommentardatei ausgelsen und es wird aus jedem Datensatz
        ein Array gemacht. Ist das korrekt?

        korrekt

        Also ist $t jetzt ein "Ansammlung von Arrays"?

        $t ist nun ein Eindimensionales Datenfeld (array), welches einen nummerischen Index hat. Du kannst Dir Datenfelder am besten mit der Funktion print_r() veranschaulichen. (Entweder in <pre>-Tags einschließen, oder Content-Type: text/plain nutzen!)

        $c=count($t);

        count zählt jetzt die Anzahl der Arrays = Datensätze?

        korrekt

        for($i=0;$i<$c;$i++)

        Und ab hier mein Lieblingsthema wann immer ich mich in PHP einlsen wollte:
        Was ist i, was wollen mir die vielen "+" sagen und was soll deine Codezeile
        gerade bewirken?

        http://de3.php.net/manual/de/language.operators.increment.php

        for durchläuft bei Index 0 beginnend das Datenfeld (also in Deinem Fall wird Zeile für Zeile des gegelesenen Kommentarfiles im Folgenden abgearbeitet).

        Gruß aus Berlin!
        eddi

        --
        Achte die Kleinigkeiten, aber liebe das Detail!
        1. Hello,

          Hier wird meine Kommentardatei ausgelsen und es wird aus jedem Datensatz
          ein Array gemacht. Ist das korrekt?

          korrekt

          Nein, falsch.
          Es wird aus jeder Zeile ein Element des Arrays $t gemacht.
          Dieses Element muss man dann erst noch splitten in einzelne "Felder".

          foreach($t as $zeilennummer => $zeile)  ## Zeilennummer beginnt hier wahrscheinlich bei 0
            {
              $t[$zeilennummer] = explode('|', rtim($zeile));
            }

          Danach ist $t ein "Array" mit Zeilen _und_ Spalten

          Erklärung:
          Arrays in PHP sind in Wirklichkeit Bäume mit bidirektional verketteten Einzelelementen.
          Jedes Element dieser "Perlenschnur" kann also wieder Ausgangspunkt für eine "Querschnur" sein. Die kann eine beliebige Länge haben, und ihre Elemente auch wieder selber Startpunkt für weitere Verzweigungen sein usw.

          Daher kann man auch nicht einfach davon ausgehen, dass alle Elemente einer zweidimensionalen Matrix wirklich voorhanden sind.

          Foreach nimmt darauf Rücksicht, indem es nicht die Indexe incrementiert, sondern sich tatsächlich an der "perlenschnur" langhangelt. Jede "Perle" kennt ja ihren Nachfolger und ihren Vorgänger.

          Beim Ablaufen der Kette wird immer in $zeilennummer der Schlüssel des Elementes übergeben und in $zeile der Wert. Beide stehen auf dem Element selbst vermerkt. Die Elemente müssen nicht nach ihrem Schlüssel sortiert in der Kette hängen, dürfen es aber.

          Explode nimmt sich nun solch ein Element, und zerlegt es am '|' in eine neue Kette. Diese wird dann wieder an die Stelle $t[$zeilennummer] zurückgeschrieben, ersetzt also den bisher dort eingetrageneen String im Orginal-Array.

          Durch das rtrim() wird vorher das noch an der Zeile hängende Zeilenendezeichen abgeschnitten.

          Die Speicherung von daten in dieser Form unterliegt diversen Beschränkungen. Die können daher auch schon mal leicht zu Fehlern führen, wenn man sie nicht beachtet.

          Die Daten dürfen weder das Trennzeichen (bei Dir "|") enthalten, noch das Zeilenendezeichen.
          Andere Whitespaces am Ende der Zeile (Leerzeichen, Tabs, usw) werden duruch diese einfache Methode einfach weggesschnitten.

          Man muss immer die gesamte Datei lesen, mindestens aber bi hinter die gewünschte Zeile. Das ist sehr zeit- und speicherplatzraubend.

          Harzliche Grüße vom Berg
          http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau

          1. Hallo Tom,

            Hier wird meine Kommentardatei ausgelsen und es wird aus jedem Datensatz
            ein Array gemacht. Ist das korrekt?

            korrekt

            Nein, falsch.

            Da ein Datensatz (%{URL}|Name|Mailadresse|noch unformatierter Kommentar) gleichzeitig eine Zeile ist, korinthenkack ich Dir mal ein "veto" ;þ

            Grüße nach Annerschbarrich!
            eddi

            --
            Achte die Kleinigkeiten, aber liebe das Detail!
            1. Hello,

              Da ein Datensatz (%{URL}|Name|Mailadresse|noch unformatierter Kommentar) gleichzeitig eine Zeile ist, korinthenkack ich Dir mal ein "veto" ;þ

              Das kannst Du ja machen, aber aus einer Zeile (hier ggf. == Datensatz) wird trotzdem kein Array, sondern nur ein Element eines Arrays und das ist 'was ganz anderes!

              Außerdem hängt an diesem Element auch noch das "CRLF" (oder wie auch immer die Zeile begrenzt wird) dran, was ich von den PHP-Ftitzen total bescheuert finde.

              file() müsste den (optionalen) Paramter "<boolean> cut"  bekommen, der regelt, ob das CRLF gleich abgeschnitten werden soll.

              Harzliche Grüße vom Berg
              http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau

        2. Tachchen!

          for($i=0;$i<$c;$i++)

          O.k., diese Zeile nummeriert also quasi meine Datensätze durch, korrekt?

          if(strpos($t[$i],$_SERVER['REQUEST_URI'])===0))

          Und hier wird es dann endgültig lustig für mich:

          1. Auf meiner Seite gibt es einen Parse Error in dieser Zeile.

          2. Hier werden alle Datensätze ($t[$i] = alle Datensätze? - was ist $t[$i]?)
          nach dem (ersten) Vorkommen der richtigen URL durchsucht, oder?

          Gruß

          Die schwarze Piste

          --
          ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
          Smartbytes Webdesign in Oberhausen
          1. Hello,

            for($i=0;$i<$c;$i++)

            O.k., diese Zeile nummeriert also quasi meine Datensätze durch, korrekt?

            Nein.

            Sie werwendet die Indizierung der Datensätze, die von file() automatisch erzeugt wurde (bei 0 beginnende), um die Sätze wiederzufinden.

            if(strpos($t[$i],$_SERVER['REQUEST_URI'])===0))

            Was Eddi such dabei denkt, weiß ich auch nicht.
            Die aktuelle Request-URI auf das Script hat doch nichts zu tun mit der URI beim Eintragen der Daten, oder habe ich da was überlesen?

            Harzliche Grüße vom Berg
            http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

            1. Tachchen!

              O.k., diese Zeile nummeriert also quasi meine Datensätze durch, korrekt?

              Nein.

              Sie werwendet die Indizierung der Datensätze, die von file() automatisch erzeugt wurde (bei 0 beginnende), um die Sätze wiederzufinden.

              Ich werde dich ein anderes mal fragen, was genau der Unterschied ist.

              if(strpos($t[$i],$_SERVER['REQUEST_URI'])===0))

              Was Eddi such dabei denkt, weiß ich auch nicht.
              Die aktuelle Request-URI auf das Script hat doch nichts zu tun mit der URI beim Eintragen der Daten, oder habe ich da was überlesen?

              Wenn ich dich richtig verstehe, dann doch.

              Denn wenn ich beim Eintragen des Kommentars dies von der Seite
              .../ordner/big.php?file=imgs/xyz.jpg aus mache und diese URL per
              $_SERVER["PHP_SELF"].'?file='.$file in das Textfile geschrieben wird,
              dann erscheint es mir zunächst nicht unlogisch, die aktuelle URL
              abzufragen und dann gleichlautende Einträge in den Datensätzen zu suchen!?

              Gruß

              Die schwarze Piste

              --
              ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
              Smartbytes Webdesign in Oberhausen
          2. Hallo,

            bis hierher habe ich schon mit großem Interesse mitgelesen und -teils grinsend, teils anerkennend staunend- verfolgt, wie du mit der Sache zurechtkommst.

            for($i=0;$i<$c;$i++)
            O.k., diese Zeile nummeriert also quasi meine Datensätze durch, korrekt?

            Jein, du scheinst für einen Programmierer in zu großen Schritten zu denken. Diese Zeile beginnt mit der for-Anweisung eine Schleife. Alles, was in dem {eingeklammerten} Block hinter der for-Anweisung steht, wird nun mehrmals nacheinander durchlaufen. Dabei wird die Variable $i vor dem ersten Durchlauf auf Null gesetzt ($i=0); dann wird geprüft, ob die Schleife überhaupt noch einmal durchlaufen werden soll (nämlich nur dann, wenn $i<$c ist, $c war die Anzahl der Datensätze); und am Ende eines Schleifendurchlaufs wird $i um 1 erhöht ($i++ ist eine Kurzschreibweise für $i=$i+1).

            if(strpos($t[$i],$_SERVER['REQUEST_URI'])===0))
            Und hier wird es dann endgültig lustig für mich:

            1. Auf meiner Seite gibt es einen Parse Error in dieser Zeile.

            Das wundert mich nicht: Zähl mal die Klammern. Da werden zwei Klammerebenen geöffnet, aber drei wieder geschlossen. Das passt nicht.
            Was die Zeile eigentlich machen soll, ist mir aber acuh schleierhaft. Sie überprüft, ob die URL des Scripts (nämlich $_SERVER['REQUEST_URI']) irgendwo im aktuellen Datensatz vorkommt. Ergibt das einen Sinn? Ich sehe keinen.

            $t[$i] = alle Datensätze? - was ist $t[$i]?

            Da ich vorher erklärt habe, dass der Schleifenrumpf nun mehrmals durchlaufen wird und $i jedesmal um 1 weiterzählt, ist $i sozusagen ein Zeiger (eigentlich ein Index), der Schritt für Schritt durch deine Datensätze wandert. $t[$i] ist dann *ein* Datensatz, konkret: Nimm aus dem Array $t[] den Datensatz Nummer $i.

            Du schaffst das schon. Aller Anfang ist schwer, aber irgendwann schaut man sich das mal wieder an und fragt sich, warum einem etwas so Triviales mal Probleme machen konnte. ;-)

            Schönes Wochenende noch,
             Martin

            --
            F: Was ist schneller: Das Licht oder der Schall?
            A: Offensichtlich der Schall. Wenn man den Fernseher einschaltet, kommt immer erst der Ton, und dann erst das Bild.
            1. Tachchen!

              Da ich vorher erklärt habe, dass der Schleifenrumpf nun mehrmals durchlaufen wird und $i jedesmal um 1 weiterzählt, ist $i sozusagen ein Zeiger (eigentlich ein Index), der Schritt für Schritt durch deine Datensätze wandert. $t[$i] ist dann *ein* Datensatz, konkret: Nimm aus dem Array $t[] den Datensatz Nummer $i.

              Aber müsste das dann nicht immer nur der letzte Datensatz sein?
              Denn $i wurde doch in der for-Schleife solange erhöht, bis sie abbricht, oder?

              Gruß

              Die schwarze Piste

              --
              ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
              Smartbytes Webdesign in Oberhausen
              1. Hi,

                [...] $t[$i] ist dann *ein* Datensatz, konkret: Nimm aus dem Array $t[] den Datensatz Nummer $i.
                Aber müsste das dann nicht immer nur der letzte Datensatz sein?

                Nein! Du hast vergessen, was ich eingangs über die for-Schleife sagte: Der Schleifenrumpf -also alle Anweisungen innerhalb der Schleife- wird mit jedem Wert von $i einmal ausgeführt.
                Ein ganz einfaches Beispiel soll das verdeutlichen:

                for ($i=0; $i<10; $i++)
                   { echo "Runde $i<br>";
                   }

                Hier wird der Schleifenrumpf, der der Einfachheit halber nur eine Anweisung enthält, mit jedem Wert von $i=0, 1, 2, ... 9 einmal durchlaufen, so dass die Ausgabe im Browser nachher so aussieht:

                Runde 0
                  Runde 1
                  Runde 2
                  ...
                  Runde 9

                Dieses Beispiel zeigt außerdem, dass die Schleife mit dem Endwert 10 nicht mehr durchlaufen wurde, weil die Bedingung auf "kleiner" lautete, und 10 ist nicht kleiner 10. Aber weil ich mit Null begonnen habe, sind es trotzdem 10 Durchläufe. Willst du nachzählen? ;-)

                Denn $i wurde doch in der for-Schleife solange erhöht, bis sie abbricht, oder?

                Ja, aber zwischendurch wird doch der Schleifenrumpf ausgeführt. Da passiert doch was!

                Ciao,
                 Martin

                --
                Man soll den Tag nicht vor dem Abend loben.
                Und den Mann nicht vor dem Morgen.
                  (alte Volksweisheit)
                1. Tachchen!

                  Ja, aber zwischendurch wird doch der Schleifenrumpf ausgeführt. Da passiert doch was!

                  Aaalso ...

                  Durch for($i=0;$i<$c;$i++) wird der nachfolgende "Ablauf" immer wieder
                  durchlaufen, solange $i<count($t) ist. Und jedesmal wird da auch gerechnet
                  und ausgegeben, korrekt?

                  Es wird aleso bei jedem Durchlauf ein Datensatz kontrolliert auf das
                  Vorhandensein der richtigen URL und dann (wenn sie gefunden wird) der
                  Rest ausgegeben, korrekt?

                  Und sehe ich das richtig, dass ich mit der zweiten for-Schleife bestimme,
                  welche Teile des Datensatzes ausgegeben werden? Ich könnte also noch z.B.
                  die IP-Adresse speichern (möglichst vorne im Datensatz) und noch eine
                  Homepageadresse (möglichst hinten im Datensatz) und dann durch Anpassung
                  bei for($j=1;$j<6;$j++) festlegen, welche Daten ausgegeben würden?
                             ^    ^
                  Gruß

                  Die schwarze Piste

                  --
                  ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
                  Smartbytes Webdesign in Oberhausen
                  1. Hallo,

                    Aaalso ...

                    Durch for($i=0;$i<$c;$i++) wird der nachfolgende "Ablauf" immer wieder durchlaufen, solange $i<count($t) ist. Und jedesmal wird da auch gerechnet und ausgegeben, korrekt?

                    Korrekt.

                    Es wird aleso bei jedem Durchlauf ein Datensatz kontrolliert auf das Vorhandensein der richtigen URL und dann (wenn sie gefunden wird) der Rest ausgegeben, korrekt?

                    Wahrscheinlich korrekt - ich habe mir nicht im Detail angesehen, was *in* der Schleife passiert; ich wollte dir nur das Prinzip der Schleife an sich klarmachen.

                    Und sehe ich das richtig, dass ich mit der zweiten for-Schleife bestimme, welche Teile des Datensatzes ausgegeben werden? Ich könnte also noch z.B. die IP-Adresse speichern (möglichst vorne im Datensatz) und noch eine Homepageadresse (möglichst hinten im Datensatz) und dann durch Anpassung bei for($j=1;$j<6;$j++) festlegen, welche Daten ausgegeben würden?
                                      ^    ^

                    Sieht aus, als hättest du's verstanden! :-)

                    So long,
                     Martin

                    --
                    "Drogen machen gleichgültig."
                     - "Na und? Mir doch egal."
                    1. Tachchen!

                      Korrekt.

                      Strike! :)

                      Wahrscheinlich korrekt - ich habe mir nicht im Detail angesehen, was *in* der Schleife passiert; ich wollte dir nur das Prinzip der Schleife an sich klarmachen.

                      Könntest du evtl. dann mal einen Blick in die Schleife werfen?
                      Denn in der Praxis gibt mir der Spaß nur den ersten gefundenen
                      Datensatz aus.

                      Sieht aus, als hättest du's verstanden! :-)

                      Ganz so optimistisch bin ich nicht, aber: Strike II! :)

                      Gruß

                      Die schwarze Piste

                      --
                      ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
                      Smartbytes Webdesign in Oberhausen
                      1. Hi,

                        Könntest du evtl. dann mal einen Blick in die Schleife werfen? Denn in der Praxis gibt mir der Spaß nur den ersten gefundenen Datensatz aus.

                        Hmm, es geht um den Entwurf in eddis Posting? Ja, da ist ein Trick drin. :-)

                        Habe ich schon gesagt, dass ich den Zusammenhang mit $_SERVER['REQUEST_URI'] nicht ganz verstanden habe? Ich hab mal der Übersichtlichkeit halber überall Block-Klammern { } gesetzt, auch da, wo sie nicht zwingend nötig sind, und den schon erwähnten Parse Error korrigiert:

                        for ($i=0; $i<$c; $i++)
                        { if (strpos($t[$i],$_SERVER['REQUEST_URI'])===0)
                            { $x=explode('|',$t[$i]);
                              for ($j=1; $j<4; $j++)
                               { print_dein_format($x[$j]);
                               }
                              break;
                            }
                        }

                        Der Übeltäter ist hier das break. Es sorgt dafür, dass die übergeordnete for-Schleife, in der es steht, sofort beendet wird. Im Pseudocode steht da also:

                        Durchlaufe mit $i alle Einträge in $t[] beginnend bei 0
                           Wenn der Name des Scripts selbst in $t[$i] vorkommt
                             dann nimm die Zeile auseinander, gib einige Felder aus und beende die Schleife
                           Andernfalls mach mit dem nächsten Element in $t[] weiter

                        Ganz so optimistisch bin ich nicht, aber: Strike II! :)

                        :-)

                        Ciao,
                         Martin

                        --
                        Denken ist wohl die schwerste Arbeit, die es gibt. Deshalb beschäftigen sich auch nur wenige damit.
                          (Henry Ford, amerikanischer Industriepionier)
                        1. Tachchen!

                          Habe ich schon gesagt, dass ich den Zusammenhang mit $_SERVER['REQUEST_URI'] nicht ganz verstanden habe?

                          Ich hatte hier mal versucht zu erklären, warum es mir sinnvoll erscheint.

                          Der Übeltäter ist hier das break. Es sorgt dafür, dass die übergeordnete for-Schleife, in der es steht, sofort beendet wird.

                          Ja ... klappt ohne direkt viel besser. Danke.

                          Dann kann ich ja jetzt mal den Tag Revue passieren lassen, den Spaß halbwegs
                          brauchbar in meine Seite implementieren und mal schauen, welche Probleme als
                          nächstes auf mich zu kommen. :)

                          Gruß

                          Die schwarze Piste

                          --
                          ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
                          Smartbytes Webdesign in Oberhausen
      2. echo $begrüßung;

        $c=count($t);
        for($i=0;$i<$c;$i++)
        was soll deine Codezeile gerade bewirken?

        Schreiben wir sie mal etwas leserlicher:

        for ($i=0; $i<$c; $i++)

        for ist keine Funktion sondern ein Sprachkonstrukt. Eine Coding-Style-Regel (die man verwenden kann, aber nicht muss) besagt, dass man ein Leerzeichen nach for schreibt, damit es sich von Funktionsaufrufen unterscheidet, welche kein Leerzeichen zwischen Funktionsnamen und die öffnende Klammer, die die Parameterliste einleitet. Aber das nur nebenbei.

        Ein Array ist eine Ansammlung von Key-Value- oder Schlüssel-Wert-Paaren. Die Werte sind die Zeilen deiner Daten, den Schlüssel hat PHP automatisch angelegt. Er besteht aus den Zahlenwerten 0, 1, 2, ... bis n. Das n kann man durch das Zählen der Felder ermitteln. Hier im Beispiel wird es in der Variable $c abgelegt.

        Dem Sprachkonstrukt for kann man 3 Ausdrücke übergeben. [*]
        1. Der erste wird einmalig ausgeführt, wenn die for-Schleife gestartet wird.
        2. Der zweite wird vor jedem Schleifendurchlauf ausgewertet. Ergibt dieser true werden die Anweisungen im Schleifenkörper ausgeführt. Ansonsten wird die for-Schleife beendet.
        3. Nach dieser Ausführung wird der dritte Ausdruck ausgeführt und bei 2. fortgesetzt.

        Wir beginnen mit 1. und da wird der Variablen $i der Wert 0 zugewiesen. Der Name $i (bzw. nur i in anderen Sprachen) ist willkürlich gewählt, wird aber gern für diesen Zweck verwendet.
        Bei 2. ergibt der Vergleich 0 < n ein true, der Inhalt des Schleifenkörpers wird ausgeführt.
        Bei 3. wird der Incrementoperator ++ auf $i angewendet. $i bekommt damit den Wert 1 und die Ausführung geht mit 2. weiter. Irgendwann enthält $i einen Wert, der n (bzw. $c) entspricht. Das Ergebnis des zweiten Ausdrucks ist damit false und die Schleife beendet.

        Mit Hilfe der Variable $i kann im Schleifenkörper gezielt auf ein Key-Value-Paar des Arrays zugegriffen werden.

        Da unter PHP Arrays nicht nur numerische Werte als Key enthalten dürfen oder auch die Nummerierung Lücken aufweisen darf, gibt es ein weiteres Schleifenkonstrukt namens foreach, dessen Funktionsweise du aber selbst im Handbuch nachlesen kannst.

        echo "$verabschiedung $name";

        [*] Das ist zwar nicht ganz korrekt, jedoch für den Anfang ausreichend.
        Jeder dieser drei Ausdrücke kann auch aus mehreren Ausdrücken bestehen, die dann durch Komma getrennt werden. In freier Wildbahn findet man das aber eher selten.

        1. Hello,

          Ein Array ist eine Ansammlung von Key-Value- oder Schlüssel-Wert-Paaren. Die Werte sind die Zeilen deiner Daten, den Schlüssel hat PHP automatisch angelegt. Er besteht aus den Zahlenwerten 0, 1, 2, ... bis n. Das n kann man durch das Zählen der Felder ermitteln. Hier im Beispiel wird es in der Variable $c abgelegt.

          n = c-1   !

          Harzliche Grüße vom Berg
          http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau

        2. Hallo,

          Eine Coding-Style-Regel (die man verwenden kann, aber nicht muss) besagt, dass man ein Leerzeichen nach for schreibt, damit es sich von Funktionsaufrufen unterscheidet, welche kein Leerzeichen zwischen Funktionsnamen und die öffnende Klammer, die die Parameterliste einleitet.

          Sehr gute Regel. Die wende ich unbewusst schon seit vielen Jahren so an.

          Jeder dieser drei Ausdrücke kann auch aus mehreren Ausdrücken bestehen, die dann durch Komma getrennt werden. In freier Wildbahn findet man das aber eher selten.

          Wenn du meinen Code (C, PHP, JS, ganz egal) ab und zu lesen müsstest, würde dir diese Möglichkeit häufig begegnen, vor allem beim dritten Ausdruck. ;-)

          Ciao,
           Martin

          --
          Finanztipp:
          Leihen Sie sich Geld von einem Pessimisten.
          Er rechnet sowieso nicht damit, dass er es zurückbekommt.
  3. Hallo alle,

    bevor schwarze Piste hier vollends durch weitere Lösungsansätze/Erläuterungen verwirrt wird, bitte ich genau zu überlegen, ob es weiterer Helfer bedarf! (Tom und dedlfix schaffen das sicher auch allein ;)

    Ich ziehe mich ebenfalls zurück.

    Gruß aus Berlin!
    eddi

    --
    Achte die Kleinigkeiten, aber liebe das Detail!
    1. Hello,

      Ich ziehe mich ebenfalls zurück.

      Haben wir Dich etwa verscheucht?
      Das war bestimmt keine Absicht.

      Schwarze Piste möchte gerne Dateien lesen und schreiben lernen.
      Das wird aber unter PHP nicht so gut unterstützt, wie ich es mir wünschen würde.
      Schwarze Piste muss also die Theorie lernen, und kann sie in PHP nicht direkt nachvollziehen, sondern nur mit weiteren Tricks...

      Da wird doch Eddi nicht einfach keneifen jetzt? *gg*

      Harzliche Grüße vom Berg
      http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau

      1. Re:

        Haben wir Dich etwa verscheucht?

        Aber nein!

        Ich erinnere mich zum Beispiel noch an den überaus konstruktiven Thread, den Du damals mit Dennis geführt hattest (es ging um Locking von Flatefiles). Den habt ihr beide im Alleingang zu einem absolut zufriedenstellenden Ergebnis geführt.
         Allerdings bin ich schlicht der Meinung, daß viele Köchen den Brei verderben. Ein Mehr an Drifts, geht oftmals auch mit einem Verlußt des Überblicks für den Fragenden einher. Schwarze Piste hat klargestellt, daß es für ihn Neuland ist, in das er sich gerne einarbeiten will, aber je Detailierter ihm Fragen anhand _eines_ Lösungsansatzes erklärt wird, desto eher sehe ich, daß er zum Einen den Überblick behält und zum Anderen sich besser darin üben kann, eine gesetzte Aufgabenstellung mit Anleitung zu durchdenken, zu gliedern und Stück für Stück zu lösen.

        Da wird doch Eddi nicht einfach keneifen jetzt? *gg*

        Doch das tut er - und zwar in Einsicht, daß es für den Fragenden so leichter ist.

        Gruß aus Berlin!
        eddi

        --
        Achte die Kleinigkeiten, aber liebe das Detail!
  4. Tachchen!

    So ... ich sage auf jeden Fall und ganz gleich, wie erfolgreich ich mich
    hier heute noch dumm anstelle, schon einmal danke allen Helfern, die sich
    hier mit mit einer Engelsgeduld um mein Einstiegsrogrammierheil bemüht haben.

    Danke!

    Das soll nicht heißen, dass ich weg bin, aber ich wollte sicher sein,
    dass alle das noch mitbekommen und niemand an Ende vergessen wird. ;-)

    Gruß

    Die schwarze Piste

    --
    ie:{ fl:( br:^ va:) ls:# fo:) rl:( n4:& ss:{ de:] js:| ch:? mo:) zu:$
    Smartbytes Webdesign in Oberhausen