Moin!
- register_globals
- 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.
Du scheinst Recht zu haben. Ich habe jetzt register_globals auf meinem PC auf Off gesetzt und magic_quotes_gpc ebenfalls. Interessanterweise spuckt das Gästebuch jetzt auch auf meinem PC zu Hause Fehlermeldungen aus - diesmal allerdings wirklich Fehlermeldungen! (Zur Variablen"verdrehung" kommt's gar nicht erst.)
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.
Ok, so einigermaßen kapiert. ;)
(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.
Ja, aber es hat ja keinen direkten Einfluss auf die Funktionsfähigkeit. Noch habe ich eigentlich den Überblick, da die Funktionen nicht sooo umfangreich sind. Ich hab mal in einer Testdatei ausprobiert, was passiert, wenn ich $_POST-Variablen in "normalen" Variablen speichere, diese "normalen" Variablen wieder in $_SESSION-Varaiblen speichere und die dann wieder in eine "normale" Variable. Funktioniert alles ordnungsgemäß - gibt keinerlei Probleme bei der Umwandlung oder so. Direkt $_POST und $_SESSION zu verwenden ist vielleicht an einigen Stellen sinnvoller, aber nicht zwangsläufig notwenid gund in meinem Fall wäre es sogar umständlicher, diese Variablen direkt zu verwenden (glaube ich).
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. :)
Ja, das sehe ich auch so. SEHR unerfreulich sogar...
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.
Jep.
$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.
Ja ok, da ist auch was dran - bei der Vorbelegung der Radio-Buttons bräuchte ich die Umwandlung nicht, aber ich mach immer gerne alles in einem "Abwasch", weil ich dann in den eigentlich Funktionen immer nur noch die Variable selbst verwenden muss, ohne sie großartig umwandeln zu müssen. Aber du hast recht, ist nicht unbedingt nötig bei $icon. (Wenn du das meinst.)
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.
Danke für die Info - das wusste ich auch noch 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.
Die Vermutung hatte ich auch - aber ich hab bis jetzt nichts Falsches gefunden! Das muss irgendwie etwas DIREKT mit dem Sessionaufruf zu tun haben! Denn wenn ich z.B. die $_SESSION['text'] im Verarbeitungsscript mit echo ausgebe, stimmen die Variablen - dann wird exakt das Richtige ausgegeben - sobald ich die Variable mit dem gleichen Befehl dann aber in der anderen (Ausgabe-)Datei ausgebe, tritt das alt bekannte Problem auf! => Es werden ganz verkorkste Dinge ausgespuckt.
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.
Das würde theoretisch schon funktionieren. Praktisch befindet sich das Hauptverzeichnis der Website auf meinem lokalen Server in einem anderen Verzeichnis als auf dem Webserver, wodurch sich schon wieder Probleme ergeben: Stammverzeichnis @home: => $_SERVER['HTTP_HOST']/mischa-hildebrand.de/v2/ Stammverzeichnis web: => $_SERVER['HTTP_HOST']/v2/
Und die Funktion getcwd() geht ja nicht vom Server-Verzeichnis aus, sondern gibt den gesamten absoluten Pfad aus.
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.
Hab ich gemacht - funktioniert trotzdem nicht!
======================================================================
Damit es jetzt nochmal etwas übersichtlicher wird, hier nochmal der gesamte Quelltext der beiden Dateien, der hier eine eine Rolle spielt:
-----------------prozess_guestbook.php--------------------
<?php
$icon = htmlspecialchars($_POST['icon']); $sender = htmlspecialchars($_POST['sender']); $ort = htmlspecialchars($_POST['ort']); $mail = htmlspecialchars($_POST['mail']); $website = htmlspecialchars($_POST['website']); $text = htmlspecialchars($_POST['text']);
if ($sender != "" && strlen($text) > 59) {
if (isset($_POST['preview'])) {
session_start();
$_SESSION['icon'] = $icon; $_SESSION['sender'] = $sender; $_SESSION['ort'] = $ort; $_SESSION['mail'] = $mail; $_SESSION['website'] = $website; $_SESSION['text'] = $text; $_SESSION['preview'] = 1;
$loc = $_SERVER['HTTP_HOST'] . "/mischa-hildebrand.de/v2/content.php?cat=kontakt&id=guestbook&" . SID; header("Location: $loc"); exit;
}
else {
// Neuen Eintrag speichern...
}
}
else {
// Fehler...
}
?>
----------------------content.php------------------------
<html> <head> </head>
<body>
<?php
echo "$content";
if ($cat == "kontakt" && $id == "guestbook") { include("special_guestbook.php"); }
?>
</body>
</html>
-------------------special_guestbook.php---------------------
<?php
if (isset($_GET["n"])) { $n = $_GET["n"]; }
else { $n = "0"; }
session_start();
if (isset($_SESSION['preview'])) {
$icon = $_SESSION['icon']; $sender = $_SESSION['sender']; $ort = $_SESSION['ort']; $mail = $_SESSION['mail']; $website = $_SESSION['website']; $text = $_SESSION['text']; session_destroy();
if (!empty($ort)) { $ort_str = "aus " . $ort; } else { $ort_str = ""; }
if ($mail != "") { $mail_prev = "<a href="mailto:$mail">Email schreiben</a> <img src="images/kontakt/guestbook_mail.gif" width="12" height="9" border="0" alt="">"; }
else { $mail_prev = ""; }
if ($website != "") { if (stristr($website,'http://')) { $website_prev = "<a href="$website" target="_blank">Website besuchen</a>"; } else { $website_prev = "<a href="http://$website" target="_blank">Website besuchen</a>"; } $website_prev = $website_prev . " <img src="images/kontakt/guestbook_website.gif" width="12" height="13" border="0" alt="">"; } else { $website_prev = ""; }
// und so weiter... // danach werden die Variablen einfach mittels echo wieder ausgegeben, sodass die Vorschau-Funktion erstellet wird und das Formular vorbelegt wird.
?>
Ich suche jetzt wirklich schon seit Tagen nach der Ursache dieses Problem, bin aber noch auf keinen grünen Zweig gestoßen! session_register bringt ja bei ausgeschalteter register_globals auch nichts, wie ich in der PHP-Doc gelesen hab. Bin jetzt tatsähclich ein bisschen hilflos.
Übrigens - als Fehlermeldung kommen auf meinem Heim-PC jetzt immer diese hier:
Warning: session_start() [function.session-start]: open(/sdir\sess_bb4b9916779bdd25abf4f456426b9046, O_RDWR) failed: No such file or directory (2) in F:\Eigene Dateien\Webseiten\mischa-hildebrand.de\v2\special_guestbook.php on line 11
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent in F:\Eigene Dateien\Webseiten\mischa-hildebrand.de\v2\special_guestbook.php on line 11
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent in F:\Eigene Dateien\Webseiten\mischa-hildebrand.de\v2\special_guestbook.php on line 11
PHP scheint hier eine bestehende Session öffnen zu wollen, die aber ganz offensichtlich nicht existiert! Eigentlich sollte session_start() doch in diesem Fall eine neue Session erstellen?! Oder hab ich da was falsch verstanden?
So, der längste Wälzer, seit es das SelfHTML-Forum gibt. ;)
Mit schönen verzweifelten Grüßen, Mischa :)