Sönke Tesch: blaettern

Beitrag lesen

Hier der ganze Script :

Ich mache hier gleich mal ein paar weitere Änderungen, die den Gebrauch diverser Variablen betreffen, die über die URL bzw. das Formular kommen.
Du sprichst diese Variablen derzeit noch direkt an, wie zum Beispiel $action, $start und $eintraege_pro_seite, welche allesamt aus der URL kommen ("eintragen.php?action=add", "?start=0&eintraege_pro_seite=10"), sowie die Formulardaten in $text und $name.

In neueren PHP-Versionen ist diese Möglichkeit aus Sicherheitsgründen nicht mehr automatisch gegeben. Stattdessen kommen diese Werte jetzt in den Feldern $_GET[] und $_POST[]. Die Namen beziehen sich dabei auf den Weg, über den sie übermittelt werden, bzw. genauer gesagt auf den gleichnamigen Befehl aus dem HTTP-Protokoll. Daten in $_GET kommen in der Regel über die URL, angehängt mit dem Fragezeichen ("eintragen.php?action=add"). Daten in $_POST stammen aus Formularen ("<form>").

POST und -wenn auch selten bis garnicht- GET tauchen übrigens auch in der Formulardefinition auf, und zwar als Attribut method. Momentan hast Du dort (korrekterweise) '<form ... method="post">' stehen. Würdest Du das in '<form ... method="get">' ändern und das Formular abschicken, könntest Du sehen, daß der Browser die Formulardaten mit einem Fragezeichen an die URL angehängt hat.
Probier's einfach mal aus - ist aber nur eine nebensächliche Spielerei mit dem Innenleben Deines Browsers und hat nichts mit dem eigentlichen Problem zu tun.

Beachte aber bitte in jedem Fall, daß je nach Version des PHP-Interpreters die besagten Felder $_GET und $_POST (neue Versionen) auch $HTTP_GET_VARS und $HTTP_POST_VARS (ältere Versionen) heißen können. Du müsstest also eventuell entsprechend die Namen ändern. Was bei Dir aktuell ist kannst Du herausfinden, indem Du an den Anfang des Skriptes den Befehl

phpinfo();

oder etwas kürzer

phpinfo(INFO_VARIABLES);

setzt.
PHP wird Dir dann eine ganze Menge Informationen ausspucken. Ganz am Ende der Liste tauchen die Variablen auf, die PHP Dir "von außen" zur Verfügung stellt. In diesem Bereich wirst Du auch irgendwo auf ein Paar der beiden genannten stoßen.

Los geht's:

<?
if ($action == "add")

if (isset($_POST["text"]))

Auf das Angängsel ?action=add in der Formular-URL können wir verzichten, weil's doch eigentlich viel schöner ist, wenn man gleich nach den Formulardaten schaut. $_POST["text"] ist der Inhalt der gleichnamigen <textarea> im Formular, isset() prüft (wie gehabt), ob diese Variable existiert.

{
if ($text == "")

if (trim($_POST["text"])=="")

Wiederum ersetzen von $text durch $_POST["text"], zusätzlich trennen wird mit trim() überflüssige Leerzeichen und/oder Zeilenvorschübe an Anfang und Ende des Textes ab.

{
   echo "<b>Du hast kein Text eingegeben !</b><br>";
   echo "Klicke auf den Backbutton deines Browsers";
  }

else
{
  $a = fopen("gaestebuch.txt","r+");
  $inhalt= fread($a,("gaestebuch.txt"));

Hier ist der Fehler:

"string fread (int fp, int length)
   fread() reads up to length bytes from the file pointer referenced
   by fp."

Vergleiche das mal mit der Zeile oben, insbesondere was den Wert der zu lesenden Länge angeht.

fclose($a);

$d=fopen("gaestebuch.txt","w+");       // Datei zum Anhängen öffnen
  if ($d)                                // Öffnen hat geklappt, $d ist ein Dateizeiger
   {
  fputs($d,"Von: ".htmlentities($name)."<br><br>");
       fputs($d,strtr(nl2br(htmlentities($text)."$inhalt"."<br><hr><br>"),"\n\r"," "));
   fputs($d,"$inhalt");  // alten Dateiinhalt anhängen
   fputs($d,"\n");       // neuen Eintrag mit Zeilenvorschub abschließen

Hier wirst Du über zwei weitere Fehler stolpern. Beachte die in den Kommentaren beschriebene Funktion der beiden letzten obigen Zeilen. Außerdem solltest Du mal schauen, wie oft Du eigentlich den alten Inhalt zurückschreibst.
Falls Dir das nichts hilft, analysiere den Inhalt der gaestebuch.txt-Datei und denke daran: immer nur einen Eintrag pro Zeile.

Analog zur Prüfung oben wäre es davon abgesehen sinnvoll, wenn Du direkt um $text auch hier den Befehl trim() schreibst, um überflüssige Leerstellen zu kappen.

Weiterhin sind hier $text durch $_POST["text"] und $name durch $_POST["name"] zu ersetzen.

fclose($d);
       }

}
}

$g=file("gaestebuch.txt"); //Auslesen

if ((! isset($start)) || (! is_numeric($start)))
     $start=0;

Ersetze dies durch:

if ((! isset($_GET["start"])) || (! is_numeric($_GET["start"])))
   $start=0; // URL-Variable start ist nicht angegeben oder keine Zahl, Standardwert einsetzen
 else
   $start=$_GET["start"]; // URL-Variable start ist brauchbar, Wert übernehmen

// und nochmal für $einträge_pro_seite
  if ((! isset($eintraege_pro_seite)) || (! is_numeric($eintraege_pro_seite)))
     $eintraege_pro_seite=10;

Analog zu $_GET["start"] oben ändern.

[..]

<b><br><br><center>Eintragen in mein Gästebuch</b><br>

<form action="eintragen.php?action=add" method="post">

Der Teil ?action=add kann ersatzlos gestrichen werden, da wir oben ja gleich auf Existenz der Formulardaten prüfen.

Nochmal zum "Code verstehen": Vielleicht täusche ich mich, aber allgemein habe ich den Eindruck, daß Du bei Problemem eher im Code rumstocherst, hier mal fummelst, da mal drehst, anstatt systematisch dem Fehler auf den Grund zu gehen, und Dir auf diese Art die Sicht verbaust.
Tipp: Falls Du der Meinung bist, ein Skript müsste funktionieren, dann solltest Du als erstes den Ablauf des Skriptes genau verfolgen, und zwar indem Du möglichst breit Anweisungen einstreust, mit denen Du den aktuellen Inhalt der Variablen prüfst (echo, print_r, vardump).

Den vorliegenden Fehler bei fread(), der dazu führte, daß immer nur der neue Eintrag in gaestebuch.txt stand, habe ich zum Beispiel mit zwei Zeilen 'echo $inhalt;' entdeckt, gleich die erste nach 'fclose($a);' hat gezeigt, daß in $inhalt nix drin war. Da gaestebuch.txt gut gefüllt war, konnte der Fehler nur beim Auslesen liegen.

Vielleicht hilft Dir dieser Rat ja in Zukunft, Fehlerquellen schneller zu entdecken.

Last but not least zwei Schönheitstipps: Statt "<br><br><br>" sollte "<p>" benutzt werden, Überschriften nicht mit "<b>Mein Gästebuch</b>" sondern "<h1>Mein Gästebuch</h1>" schreiben. Aussehen von <p> und <h1> kannst Du per CSS verändern, näheres dazu steht im CSS-Kapitel von SelfHTML.

Gruß,
  soenk.e