Moin!
- register_globals
- magic_quotes_gpc
Hmmm... interessant. Bei beiden Einstellungen ist beim Webserver "Off" und auf meinem PC "On" gesetzt. Register_globals ist ja soweit ich weiß dafür "zuständig", dass die Variablen übergeben werden, ohne dass man sie über den Array $_GET erst abrufen muss. Aber was hat das hiermit zu tun? Und was bewirkt das magic_quotes_gpc?
Du solltest deinen Heimserver so einstellen, dass die beiden Einstellungen identisch sind. Insbesondere register_globals! Denn das beeinflusst die Inhalte der globalen Variablen - ein Umstand, der ziemlich nervig werden kann, denn ich glaube, das spielt hier mit rein.
Zweitens würde ich bei Sessions nie die Variablenwerte von normalen Variablen in $_SESSION hineinkopieren und umgekehrt, sondern wo immer möglich direkt auf $_SESSION zugreifen. Dass bei dir da einiges schiefgeht, siehst du ja.
Ja, das sehe ich. Aber wieso gibt's da Probleme? Ich speicher doch nur den Wert einer Variablen in die einer anderen. Sollte doch an sich funktionieren?!
Wenn dir register_globals reinpfuscht (bzw. dich nur zuhause rettet), weil es _zusätzlich_ Variableninhalte kopiert (auch $_SESSION gehört zu den Arrays, die in globale Variablen übertragen werden), hast du einen guten Grund für das seltsame Verhalten.
(finde "normale" Variablen übersichtlicher und leichter zu handhaben - vielleicht auch einfach Gewöhnung)
Würde ich trotzdem nicht tun. Wenn du immer direkt $_POST, $_SESSION etc. verwendest, ist dir an jedem Einsatzort einer solchen Variablen deren Herkunft sofort klar.
Wenn du aber $_POST['text'] und später/anderswo $_SESSION['text'] beides in $text kopierst, siehst du nicht mehr auf den ersten Blick, ob der Variableninhalt nun aus dem POST-Formular oder aus der Session kommt. Und wenn register_globals eingeschaltet sind, wird dir diese $text-Variable vor dem Skriptstart außerdem noch mit den Inhalten aus $_SESSION, $_POST, $_GET, $_ENV, $_SERVER und $_COOKIES vorbelegt werden, sofern ein Arrayeintrag 'text' in einer von denen existiert. Die Reihenfolge, welche Variable von anderen überschrieben wird, ist festgelegt und kann geändert werden.
Das ist also kein erfreulicher Zustand, wenn du nicht weißt, was mit deinen Variablen hinter deinem Rücken passiert. :)
Nebenfrage: Was bedeuten eigentlich deine Variablen in diese Zeilen hier, bzw. wo kriegen die ihre Werte her? Doch nicht etwa aus dem Formular, oder?
Doch, natürlich! Wo soll ich die denn sonst herkriegen?
Du verwendest ja aber $_POST, nicht $text direkt - das meinte ich. Ohne register_globals würde das zweite nämlich komplett nicht funktionieren.
$icon = htmlspecialchars($_POST['icon']);
$sender = htmlspecialchars($_POST['sender']);
$ort = htmlspecialchars($_POST['ort']);
$mail = htmlspecialchars($_POST['mail']);
$website = htmlspecialchars($_POST['website']);
$text = htmlspecialchars($_POST['text']);
Bedenke, dass die Wandlung der eingegebenen Textinhalte nicht in jedem Fall notwendig ist! Wenn du den Text beispielartig im oberen Teil ausgibst, brauchst du die Wandlung. Wenn du die Textarea füllst, brauchst du sie ebenfalls. Aber wenn du die <input>-Felder vorbelegst, brauchst du sie nicht!
Ich würde eine derartige Wandlung immer erst bei der tatsächlichen Ausgabe mit echo einbauen.
Und in diesem Zusammenhang kommen wir zu magic_quotes_gpc. Diese Funktion baut dir immer dann, wenn du Anführungszeichen " und ' oder den Backslash im Text eingibst, einen Backslash davor. Das ist ziemlich störend - du mußt diesen Backslash entfernen, wenn die Funktion eingeschaltet ist - sonst aber nicht.
Anschließend kommt der obige Teil. Ist vielleicht ein bisschen umständlich gemacht - das gebe ich zu - aber ich verstehe bis jetzt nicht, was daran so falsch ist bzw. warum bei der Vorschau so ein "Blödsinn" ausgegeben wird!
Ich verstehe es auch noch nicht, ich vermute einfach mal, das du außerhalb des bisher geposteten Skripts Dinge tust oder gerade nicht tust, die das beeinflussen.
Der Header "Location" erfordert eine absolute URL, beginnend mit "http://".
Ich weiß - das hatte ich temporär mal so mit relativem Pfad gemacht, damit's sowohl bei mir lokal, als auch auf dem Server funktioniert (klappt ja trotzdem) und hab's danach vergessen in einen absoluten Pfad zu verwandeln.
Benutze $_SERVER['HTTP_HOST'] - da drin steht der aktuell benutzte Server, du mußt die Angabe nicht mehr manuell auswechseln.
Wie gebe ich die SID denn dann so weiter - nachdem, was ich gelesen habe, müsste das dann ja so aussehen:
$loc = "content.php?cat=kontakt&id=guestbook&" . SID;
Richtig.
- Sven Rautenberg