Hallo Christoph,
Das zur Zeit zugrundeliegende Script gibts in einer Rohfassung auch unter http://www.christoph-schnauss.de/prog/php/php06.php
Du bist ganz schön mutig!
Natürlich kann ich das gesamte Gästebuch auch rauswerfen. Ich schleppe es jedoch schon ein paar Jahre mit mir,
das erklärt so manches, aber ...
da trennt man sich nicht so leicht von liebgewordenen Gewohnheiten.
... Du solltest es vielleicht von Grund auf renovieren. D.h. am besten: neu schreiben.
Warum?
Dein Skript ist in jeder Hinsicht verbesserungswürdig. Du begehst hier (halt in Jahren gesammelt) viele der Fehler, die hier Woche für Woche bemängelt werden. Es ist geradezu ein Prachtstück, ich notiere das, was mir beim ersten Überfliegen aufgefallen ist:
Deine einzige Funktion trägt den aussagekräftigen Namen "speichern()", ansonsten handelt es sich um Spaghetticode, der das Debuggen zu einer Qual macht. Dazu vermengst Du Verarbeitung und Ausgabe, was es noch schwieriger macht. Dazu Formatierung mit veralteten Attributen und Inline-CSS in einem Tabellenlayout. Es ist wirklich ein Paradebeispiel für die Probleme, die unsemantisches HTML mit sich bringt. Nichts ist zu finden.
Zum PHP: Wie wäre es mit dem typischen Wert für error_reporting, nämlich ALL. Du weist den Inhalt von $_POST-Elementen Variablen zu, aber nur wenn es $_POST gibt. Nun könnte jemand Dein Skript auf andere Art und Weise füttern. Bei register_globals = "on" (Du hast Dich im letzten Jahr mindestens einmal als Verteidiger dieser Einstellung geoutet) sind Deine Variablen auch da und mit anderen Werten belegt, als Du dies vermutest. Ob sich das im weiteren Verlauf auswirkt, sei dahingestellt. Du solltest
a) auf Elemente der superglobalen Arrays stets in der Form
$_POST['key'] oder $_GET['key'] zugreifen und diese nicht
überflüssigerweise und dazu in gefährlicher Form anderen
Variablen mit "naheliegenden" Namen zuweisen. Eine Empfehlung,
die Du hier bestimmt mehrfach in der Woche lesen kannst.
b) grundsätzlich _alle_ Variablen initialisieren.
c) in Deiner Funktion schreiben() machst Du es ja noch schlimmer.
Hier greifst Du völlig unmotiviert auf das Array $GLOBALS zu.
Warum? Du willst diese Inhalte per POST haben, also greife
gefälligst auch auf $_POST zu. Verlasse Dich nicht auf GPC :-)
d) Deinen Dateiinhalt schreibst Du als formatierten HTML-Text weg.
Prima, das ist bequem, klar. Änderungen des Layouts sind nur
mühsam machbar, Du hast Dich hier selbst in eine Sackgasse
manövriert. Natürlich sollte es mit vertretbaren Aufwand möglich
sein, den Inhalt der Einträge vom Layout zu trennen und nur noch
den Inhalt zu speichern, nicht aber die Darstellung.
e) Trenne Dein Skript sauber in einzelne Aufgaben auf, z.B. für die
Überprüfungen. Schreibe für die Aufgaben Funktionen. Kommentiere
Deinen Code. Nein, er kommentiert sich nicht von selbst. Das ist
nicht angebrachter Optimismus.
Ob Du das nun objektorientiert in PHP5 oder in prozeduraler Programmierung erledigst, das ist gleichgültig. Mach es neu! Mach es richtig[tm]. Beachte die vielen Hinweise, die Du hier im Forum seit Jahren immer wieder, zum Teil gebetsmühlenhaft lesen konntest, vielleicht sogar selbst gegeben hast.
Diesem Code hier ist für mich nicht auf Anhieb zu entnehmen, wo die bots ansetzen, dazu ist Dein Code zu unübersichtlich. Möglichkeiten gibt es einige, welche ist mit Sicherheit von Deiner PHP-Konfiguration abhängig.
<gebetsmühle>Schreibe es neu!</gebetsmühle>
Mahlende Grüße
Vinzenz