Wie kommt PHP darauf, ="?"> als ?> zu interpretieren?
Gar nicht, es hat mit PHP überhaupt nichts zu tun, es ist viel einfacher. Das Attribut background verpasst dem <body>-Element ein Hintergrundbild, spezifiziert durch die URL, die mit background angegeben wurde (hier: '?').
Des Rätsels Lösung ist also schlicht und ergreifend, daß der Browser versucht, ein Hintergrundbild mit der URL '?' zu laden. Das ist gar nicht so abwegig, wie es vielleicht auf den ersten Blick aussehen mag; '?' ist eine legale, _relative_ URL, relativ zur URL des aktuellen Dokuments.
Schau mal oben in die Adressleiste Deines Browsers, dort wirst Du auch eine URL in dieser Form finden: '?t=12&m=34', absolut
'http://forum.de.selfhtml.org/?t=12&m=34'. Der Unterschied ist nur, daß bei Deiner '?' keine Parameter folgen.
Daher kamen dann auch die zwei Anfragen: Erst der (erwünschte) Formularversand mittels POST an 'shoutbox.php'. In shoutbox.php dann das "Hintergrundbild" '?', das schließlich den zweiten Aufruf des Skriptes, diesmal mittels GET an 'shoutbox.php?' verursacht hat. Das ist natürlich schon für sich Unsinn, aber da Dein Skript auch noch den Fehler hat, nicht zu meckern, wenn es nichts zu speichern gibt, ist der URL-Fehler bis in die Shoutboxdaten durchgeschlagen (und damit auch erst sichtbar geworden).
Mein allergrößter Respekt! Wäre ich nie drauf gekommen.
Und ich war nach eineinhalb Stunden kurz davor, in die Tischkante zu beißen - wie gesagt: selten dämlich ;) Aber so ist das immer, die Tücke steckt im Detail.
Ein Tipp für die Zukunft: Bei derartigen, völlig unerklärlichen Problemen hilft es immer, die Dateien so lange abzuspecken, bis der Fehler verschwindet. Das ist mühselig, aber es hilft.
Ich habe in diesem Fall schlußendlich auch ganz von vorne angefangen, das Formular und das Skript in den Grundzügen (ein <input>, nur Ausgabe) selbst geschrieben und dann -weil's wie erwartet einwandfrei funktionierte- begonnen, Code von Dir stückchenweise zu übernehmen. Es dauerte fünf Minuten, dann war ich bei der bewussten <body>-Zeile.
Gruß,
soenk.e