# php - Zeilen zählen und ausgeben



## Dj_PD (27. August 2004)

*php - bestimmte Zeilen lesen und ausgeben*

Hallo,

Nachdem ich als Neuling mein erstes Script nun fertig habe, ein Multicounter mit Text oder Grafikeinrichtung und mit IP-Sperre, habe ich mich an mein 2tes Script gemacht.
Ein Gästebuch mit Smilies und es soll auch noch ein Adminbereich dort rein.
Ich brauch aber bei diesem Script Eure Hilfe, den ich komme gedanklich nicht mehr mit.
Also als erstes habe ich mal die Standardsachen gemacht, eintragen und index.
Jetzt möchte ich das Script aber erweitern, mit einem Zähler.
Also so das das Script in der index.php vor den Einträgen eine Nummer stehen hat, das anzeigt wer als erstes und wer als zweites usw. gepostet hat.
Hier der erste Code (so sieht es jetzt aus(eintragen.php)):

```
... (Code zum eintragen)
else{
   replace();
   $datei = "gbook.gb";
   $input = "$datum|$name|$email|$www|$eintrag|$ipn";
   $fp = fopen($datei, "r");
   while(!feof($fp)) {
      $eintraege = fgets($fp, 500);
      $input .= $eintraege;
   }
   fclose($fp);

   $fp = fopen($datei, "w+");
   fputs($fp, $input);

   if(fclose($fp)) {
?>
```
Ich möchte jetzt 3 Sachen noch da rein haben, einmal $komentar, $Link und $usernummer
$komentar und $link habe ich schon mit einem versteckten feld (hiddenfeld) rein gemacht. Die beiden möchte ich später in meinem Admin-Bereich haben, damit ich ein Komentar zufügen kann.
Jetzt kommt aber das was mir ziemlich schwer erscheint.
"$usernummer"
Ich möchte das das Script die Datei ausließt und schaut wieviel Einträge die Datei "gbook.gb" hat und dann soll er den Wert um eins erweitern, da ja ein neuer User ins Gästebuch schreibt, also ist er eine Nummer weiter. Das heißt, wenn gbook.gb sagen wir mal 3 Einträge (Zeilen) hat mit

```
$usernum|$datum|$name|$email|$www|$eintrag|$ipn|$komment|$link
$usernum|$datum|$name|$email|$www|$eintrag|$ipn|$komment|$link
$usernum|$datum|$name|$email|$www|$eintrag|$ipn|$komment|$link
```
also so ca.

```
1|26.08.2004|Egon|egon@egon.de|www.www.de|123.456.78||
2|27.08.2004|Helga|helga@helga.de|www.helga.de|125.456.87.52||
3|27.08.2004|heiz|heinz@heinz.de|www.heinz.de|256.656.65.65||

Also der erste bekommt 1, der zweite 2, usw.
```

soll er diese Zeilen countern und dann den Wert (in diesem Fall 3) um eins erhöhen. So das der Wert 4 raus kommt.
Dies soll er dann in $usernummer einspeichern.
Nur wie schaffe ich das das er das auch so macht?

So soll der Code dann aussehen:

```
... (Code zum eintragen)
else{
   replace();
   $datei = "gbook.gb";
   $input = "$usernum|$datum|$name|$email|$www|$eintrag|$ipn|$komment|$link";
   $fp = fopen($datei, "r");
   while(!feof($fp)) {
      $eintraege = fgets($fp, 500);
      $input .= $eintraege;
   }
   fclose($fp);

   $fp = fopen($datei, "w+");
   fputs($fp, $input);

   if(fclose($fp)) {
?>
```

Kann mir vielleicht jemand eine kleine Hilfe geben.
Ich würde mich über jede Antwort freuen und wenn ihr noch Auskünfte braucht schreibt mir.
Ich habe mir das mit der Nummer bzw. dem Zähler leichter vorgestellt.
Ich möchte den Zähler rein haben damit ich später in meinem Admin-Bereich besser die Beiträge edieren kann, so das ich dem Script sage das er mir alle Einträge erst einmal per Nummer einzeigen soll und wenn ich dann auf die Nummer drücke das er die Daten die ja in der Datei neben der Nummer sind in Feldern anzeigen soll so das ich Sie ändern kann oder da ich ja 2 Variablen mehr habe ($komment und $link) das ich z.B. ein Komentar zufügen kann.
Ich weiß zwar noch nicht ob mein Gedanke so richtig ist, aber vielleicht kann mir ja auch jemand zu dieser kurzen Überlegung etwas weiterhelfen.

Vielen lieben Dank schonmal jetzt,
Gruss
Dj P.D.

P.S.: Wäre es gut wenn ich bei 

```
$input = "$usernum|$datum|$name|$email|$www|$eintrag|$ipn|$komment|$link";
```
 zum Schluss ein \n angebe?


----------



## Sven Mintel (27. August 2004)

> P.S.: Wäre es gut wenn zum Schluss ein \n angebe?


...eher nicht.

Du hättest dann eine leere Zeile.
Ohne leere Zeilen kommst du recht einfach an die exakte Anzahl der Einträge:

```
$gb=file('guestbook.gb');
$usernummer=(count($gb)+1);
```


----------



## Dj_PD (30. August 2004)

Herzlichen Dank fatalus,

Ich werde das man so versuchen, wie du es gesagt hast. Ich hoffe es funktioniert.
also so quasi:

```
<?php
}
elseif($submit && $fehler == 1) {
   echo $fehlermeldungStart;
   echo $fehlermeldung;
   echo $fehlermeldungEnde;
}
else{
   $gbb = file('guestbook.gb');
   $usernum =(count($gbb)+1);
   replace();
   $datei = "gbook.gb";
   $input = "$usernum|$datum|$name|$email|$www|$eintrag|$ipn|$komment|$link";
   $fp = fopen($datei, "r");
   while(!feof($fp)) {
      $eintraege = fgets($fp, 500);
      $input .= $eintraege;
   }
   fclose($fp);

   $fp = fopen($datei, "w+");
   fputs($fp, $input);

   if(fclose($fp)) {
?>
```

Ich habe aber nochmal kurz eine andere Frage bezüglich dem Auslesen dieser Datei.
Ich lese die Datei wie folgt aus:


```
<?php
$datei = "gbook.gb";
$fp = fopen($datei, "r");
while(!feof($fp)) {
   echo "<table width="540" border="0" bgcolor="#000000" cellpadding="5" cellspacing="1" align="center">";
   $eintraege = fgets($fp, 500);
   $eintraege = explode("|", $eintraege);
   if(!empty($eintraege[0])) { echo "<tr><td width="540" bgcolor="#dedede" colspan="2"><font color="#FF9900" size="4"><b>".$eintraege[0]."</b></font></tr>"; }
   if(!empty($eintraege[1])) { echo "<tr><td width="150" bgcolor="#227CAC">Datum:</td><td width="390" bgcolor="#dedede">".$eintraege[1]."</td></tr>"; }
   if(!empty($eintraege[2])) { echo "<tr><td width="150" bgcolor="#227CAC">Name:</td><td width="390" bgcolor="#dedede">".$eintraege[2]."</td></tr>"; }
   if(!empty($eintraege[3])) { echo "<tr><td width="150" bgcolor="#227CAC">E-Mailadresse:</ td><td width="390" bgcolor="#dedede"><a href="mailto:".$eintraege[3]."">".$eintraege[2]."</a></td></tr>"; }
   if(!empty($eintraege[4])) { echo "<tr><td width="150" bgcolor="#227CAC">Homepage:</td><td width="390" bgcolor="#dedede"><a href="".$eintraege[4]."" target="_blank">".$eintraege[3]."</a></td></tr>"; }
   if(!empty($eintraege[5])) { echo "<tr><td width="150" bgcolor="#227CAC" valign="top">Eintrag:</td><td width="390" bgcolor="#dedede">".$eintraege[5]."</td></tr>"; }
   if(!empty($eintraege[6])) { echo "<tr><td width="150" bgcolor="#227CAC">IP-Adresse:</td><td width="390" bgcolor="#dedede">".$eintraege[6]."<span class="hinweis">(Wird zu unserer Sicherheit gespeichert!)</span></td></tr>"; }
   if(!empty($eintraege[7])) { echo "<tr><td width="150" bgcolor="#227CAC">Komentar:</td><td width="390" bgcolor="#dedede">".$eintraege[7]."</td></tr>"; }
   if(!empty($eintraege[8])) { echo "<tr><td width="150" bgcolor="#227CAC">IP-Adresse:</td><td width="390" bgcolor="#dedede">".$eintraege[8]."</td></tr>"; }
   echo "</table><br>";
}
?>
```

Meine Frage ist jetzt: 
Wie kann ich das machen, dass ich eine nur *eine* bestimmte Zeile auslese.
Also in diesem Fall wäre es ja so das er alle Zeilen auslesen würde, also alle Zeilen die in der gbook.gb drin sind ließt er nach und nach aus und ordnet Sie den $eintraegen[] zu und gibt Sie dann auf der Seite aus. Aber wie kann ich das machen dass nur eine bestimmte Zeile ausgelesen wird. Sagen wir mal ich möchte gerne erst die Zeile 15 ausgelesen haben und danach möchte ich die Zeile 5 ausgelesen haben. Also ich sehe ja welche eintraege vorhanden sind und möchte wenn ich sehe da stimmt was nicht ein Formular haben wo ich mich nicht ins Gästebuch eintragen kann, sondern wo ich Gästebucheintraege bearbeiten kann. Also muss ich es schaffen das ich eine bestimmte Zeile auslesen kann und diese dann bearbeiten kann und dann wieder in die Zeile eintrage wo ich Sie ausgelesen habe. Nur dafür bräuchte ich Eure Hilfe, da ich noch nicht so weit bin, obwoll ich mir ja auch schon sehr viel gedanken dazu gemacht habe, um es alleine zu schaffen. Leider bin ich noch kein Stück weiter gekommen. Deswegen frage ich ja jetzt nochmal hier im Forum.
Ich habe immer im Kopf gehabt das ich erst die $usernum auslesen muss und dann damit etwas machen muss, z.B. Wenn ich $usernum ausgelsen habe muss, wenn ich auf $usernum klicke alle Daten die neben $usernum stehen in Formularfeldern eingefügt werden. d.H. wenn $usernum ausgelesen worden ist würde ja die einzelnen Einträgenummern ausgegeben. Also 1 2 3 4 5 6 usw. Wenn ich dann auf sagen wir mal 2 drücke würde er mir in Formularen den kompletten Inhalt der Zeile anzeigen die den Anfangswert 2 hat, da ich ja $usernum immer eine Nummer ($usernum =(count($gbb)+1); ) höher gemacht habe.  Nur ich hab dann wieder einen Blackout bzw. einen Hänger so das ich darüber nie hinaus komme. Vielleicht ist mein Gedanklicher Ansatz auch falsch.

Deswegen hoffe ich und ich würde mich freuen wenn mir hierbei noch jemand helfen könnte.
Danke im Vorraus
&
Mit freundlichen Gruss

Dj_PD

P.S.: Ich hoffe ich habe mich verständlich ausgedrückt und Ihr wüßt was ich meine. Sollten noch fragen offen sein, so fragt eben. Ich versuche dann möglichst genau und logisch zu schreiben. (Man findet ja nicht immer die richtigen Worte)


----------



## Dj_PD (31. August 2004)

Huhu,

ich bins nochmal. :-( 
Hat den wirklich keiner eine Ahnung. Ich komme einfach nicht weiter. Und man sieht doch das ich selber versucht habe dafür etwas zu tun.
Bitte, schaut doch nochmal und evtl. kann ja doch noch einer etwas dazu schreiben.

Wie ließt man eine bestimmte Zeile (Zeile 1 oder Zeile 2 oder usw.) aus einer Textdatei?

Gruss
Dj PD


----------



## saila (31. August 2004)

Die Lösung kennst du bestimmt selbst schon, kommst aber nicht drauf oder?

Also du bist z.B. in deinem Adminbereich. Jetzt kannst du ja entweder alle Zeilen ausgeben bzw. auflisten aus deinem Gästebuch. Die Nummern versiehst du mit einem Link wie folgt:

<a href=\"edit.php?usernummer=$usernummer\">$usernummer</a> blabla......

In der Auflistung erhälst du nun alle Einträge wobei die Eintragsnummer als Link dargestellt wird. In diesem Link ist direkt wieder die Zahl enthalten welche der Zeile in der Datei entspricht. 

Jetzt klickst du den Link an und es öffnet sich die Datei edit. Darin öffnest du die Datei in welcher deine Einträge sind, legst den Counter auf die $usernummer fest und erhälst somit die Zeile welche du editieren willst.

Ok?

Aber einfacher wäre es für dich, wenn du dich z.B. in deinem Gästebuch als Admin anmelden kannst. Dann werden z.B. alle Einträge für dich als Admin bzgl. der Eintragsnummer per Link automatisch dargestellt und du könntest direkt über das Gästebuch einen Eintrag von einem User editieren sofern er entsprechende Fehler enthält.

Gleiches gilt auch für eine Löschfunktion. Du solltest wenn möglich ohne großen Adminbereich einen Beitrag direkt löschen können welcher Müll enthält. Dazu musst du dich in deinem Gästebuch einfach nur als Admin anmelden können. Das ersprart dir viele Schritte in einem getrennten Adminbereich, welcher auch erst wieder erstellt werden muss. Ist evtl. ein Gedankenansatz um viel Arbeit zu sparen.


----------



## Dj_PD (31. August 2004)

Also saila,

ersteinmal vielen vielen Dank für deine Hilfe.
Ja, so habe ich mir da auch schon vorgestellt. Ich hatte vor in meinen Script ein Ordner "Admin" zu erstellen und dort dann mit dem Adminbereich der über htaccess geschützt ist, alle Einstellungen machen zu können.
Da hab ich zwar noch kleine Probleme mit dem Pfad (weil die Datenbank ein Ordner davor ist), aber ich denke das bekomme ich schon hin.

Das mit dem Link ist eine sehr gute Idee.
<a href=\"edit.php?usernummer=$usernummer\">$usernummer</a> blabla......

Wirklich, ich habe nicht gedacht das man das auch so machen kann. 

Das ich das in dem Adminbereich aber so machen kann wie du das beschreiben hast (also im Adminbereich quasi ein Duplikat meiner Gästebuchanzeige mit einem edit-Link) glaube ich nicht das ich das jetzt schon schaffe. Ich glaube dafür fehlt mir noch der passende Schupser. Bei mir ist immer das Problem das ich ja gute Ideen habe, aber leider scheitert bei mir an den ganzen php Code. Ich sitze hier manchmal Tage lang und lese Bücher, aber irgendwie bekomme ich das dann doch nicht hin. Zudem ist das auffinden immer sehr schwer da ich nicht wirklich im Scriptcode zwischen normalen php code und php mit mysql code unterscheiden kann.Das habe ich schon bei meinen ersten Script dem Counter gemerkt. Da mußte ich leider auch die Statistik komplett wieder entfernen weil dort fehler waren die mir noch zu schwer erscheinen. Zudem kommt das ich als Anfänger lieder erst meine Erfahrungen nur mit php machen möchte und dann erst das große SQL erlernen möchte.

Ich werde es aber einfach mal ausprobieren was passiert wenn man den Link so macht wie du, ich hoffe es klappt dann auch so.
Was ich mir aber vorstellen könnte, da du unten wegen counter gesprochen hast.
Meinst du das so ca.:
Also wenn ich jetzt quasi ein Duplikat meiner Eintragsliste sehen würde und rechts in der Tabelle dann ein edit-Link wäre müßte ich ja eigentlich eine Datei erstellen und dort ein Formular erstellen was die Datei "gbook.gb" ausließt, aber nicht kanns sondern nur die Zahl die auf der Eintragsliste steht.
Sehe ich das richtig?
Sagen wir mal das sieht so aus in der Eintragsliste im Adminbereich (nur in Tabellenform)

```
1 am 26.08.2004                                                                       edit
Name: Egon
eMail: egon@egon.de
Homepage: www.www.de
IP: 123.456.78


2 am 27.08.2004                                                                         edit
Name: Helga
eMail: helga@helga.de
Homepage: www.helga.de
IP: 125.456.87.52

..
.
usw.
```

Wenn ich jetzt auf edit klicke, muss ich ja dafür sorgen das die Daten in der Tabelle in der edit-Datei reingeladen werden. (also quasi in das Formular)
Nur verstehe ich immer noch nicht wirklich wie ich dem Script das beibringen soll.
Wenn ich jetzt dem Script mit dem Linkbeispiel 
<a href=\"edit.php?usernummer=$usernummer\">$usernummer</a> blabla......
erstelle. Hm, da müßte ich ja ein GET Methode anwenden, da ich gelernt habe das POST die Daten nicht über die URL verschickt, richtig?
Sollte das schonmal richtig sein habe ich eine Nummer die das Script für das auslesen gebrauchen könnte, da jede Nummer weiterlaufend ist. Das würde bedeuten, dass da du ja einen Counter angesprochen hast, dass ich die Datei öffnen müßte und dann mit evtl. einer if abfrage den Counter einrichten müßte (evtl. so):

```
$datei = "gbook.gb";
$fp = fopen($datei, "r");
while(!feof($fp)) {
   cellspacing="1" align="center">";
   $eintraege = fgets($fp, 500);
   $eintraege = explode("|", $eintraege);
   if $eintraege[0] = $usernum
//dann hier der Code zum einlesen der Variablen
else {
 echo "Die Nummer ist nicht vergeben (Fehler)";
```
Ich habe jetzt einfach mal die Sache genommen die ich zum teilen der Datei "gbook.gb" genommen habe, da ja theoretisch die $eintraege[0] die $usernummer ist.

Und?
Was sagtst du bzw. was sagt Ihr zu meiner Überlegung?
Bin ich auf dem richtigen wege?
Gruss
Dj P.D.

P.S.: WoW, durch den Tip von saila habe ich schon fast einen höhenflug hier.
         Also ich habe mir nochmal den Text durchgelesen, und ich hätte ja nie
         gedacht das mir solche Ideen kommen.


----------



## saila (1. September 2004)

Nönö   Das geht viel einfacher!

Du brauchst kein extra Adminbereich. Vergess vorerst mal deine Möglichkeit auf Administration.

Denk dir mal volgendes. Du hast ein Script wie dein Gästebuch. Jeder der das Gästebuch aufruft sieht dann das was du ihm praktisch vorgibst in Form einer HTML Seite die aus einer Datei x.gd Daten darstellt.

Jetzt machst du aber in dein Gästebuch ganz oben nach <?php einen Bereich in welchem Geprüft wird ob ein sagen wir ADMIN angemeldet ist. 

Wir machen mal kurz noch einen Gedankensprung zu deinem Code im Gästebuch. 

Also du hast da ja deinen gesamten Code. Nun machst du einfach folgendes. Überall wo die Nummer des Eintrags erscheint machst du noch eine if/else Prüfung. Und zwar wie beispielsweise folgt:

```
<?php
// $user steht für dein Username und $pw für ein von dir frei gewähltes Passwort
if(isset($user) && isset($pw) {
   // Bist du selbst eingeloggt, werden alle usernummern per Link dargestellt
   echo "<a href=\"link_zur_edit.php?user=$user\">$usernummer</a>";
}
else {
   // bist du nicht eingeloggt, erscheint die $usernummer ohne Link
   echo $usernummer;
}
?>
```

Nun zurück zu deiner Anmeldung. Wenn du nun in den ersten Zeilen eine Prüfung einbaust ob du angemeldet bist und das geht wunderbar mit einer Session (ok, das mag evtl. schon ein Schritt zu viel sein für dein Verständnis, aber es erleichtert eben um ein vielfaches die Arbeit und spart mächtig Zeit), werden alle Nummern der Einträge in dein Gästebuch als Link dargestellt. Der Link führt dann zu der edit.php (Im Grunde nichts weiter als ein reines Formular in welchem jeweils die einzelnen Eingabemöglichkeiten dargestellt sind wie für das Gästebuch, nur gefüllt mit den Daten aus der Datei.gd.


Nun zum Auslesen der Datei - ich gebe dir nun mal bewußt nichts vor, damit du das selbst erarbeitest.

Denk mal daran. Der Link gibt ja die Nummer deines Gästebucheintrags an die Datei edit.php. Die Variable $usernummer (weil aus dem Link <a href=\"edit.php?usernummer=$usernummer\">$usernummer</a>) wird nun in der URL übergeben und du kannst diese dann verwenden um beim öffnen der Datei diesen als Zeiger zu verwenden. Sprich du musst nicht erst die ganze Datei.gd auslesen oder in ein Array einlesen, sondern du greifst direkt auf die korrekte Zeile zu.

Diese Zeile lässt du dann in dein Formular übergeben und du hast die Daten. Gleiches gilt wieder beim speichern der geänderten Daten. Im form-tag beispiel:
<form action=\"speicher.php?id=$usernummer\" method=\"post\"> übergibst du direkt für die Speicherung der Daten die korrekte Zeilennummer durch die Variable "id".

Probier das mal alls aus, wenn du nicht weiter kommst sag wieder bescheid


----------



## Dj_PD (1. September 2004)

Ok, ich werde mich hinsetzen und mal so richtig testen was du geschrieben hast.

Vielen, vielen Dank saila für Deine Hilfe.
Ich bin froh das du mir geholfen hast und bin auch voll damit einverstanden das du nicht so viel an Code hier geschrieben hast, da ich es ja selber schaffen möchte.
Danke nochmal  
Gruss
Dj PD


----------

