Sönke Tesch: Anwendung von Sessions

Beitrag lesen

Ich habe in der Datei, nennen wir sie einfach test.php, ein Formular, welches ich an eine seite auswert.php schicken will. Diese Seite auswert.php soll sich aber im popup öffnen. Das mache über Javascript (window.open). So mein Problem liegt darin, dass test.php die Variablen nicht an auswert.php übergibt, weil es im popup geöffnet wurde. Deshalb habe ich PHP-Sessions gesetz. Es klappt aber immer noch nicht. Hier sind die Auszüge aus den Dateien:

@session_start();

Den Klammeraffen solltest Du nicht einsetzen. Fehlermeldungen sind dazu da, gelesen zu werden. Oder anders ausgedrückt: Wie willst Du jemals Deine Skripte fertig kriegen, wenn Du sämtliche Fehler ignorierst?

Daß Fehlermeldungen auf öffentlichen Seiten nichts zu suchen haben, ist natürlich klar. Mittels display_errors und log_errors (siehe PHP-Anleitung, Kapitel Konfiguration) kannst Du die Meldungen in der Seite unterdrücken und stattdessen im Fehlerprotokoll des Servers sichern. Beide Direktiven lassen sich auch in einer .htaccess setzen (wiederum: siehe Anleitung).

session_register("ort");

Wenn ich mich recht entsinne, benutzt man _entweder_ session_start() _oder_ session_register(), aber nicht beides.

Mir persönlich gefällt die Benutzung von session_start() und $_SESSION[] besser, da im gesamten Skript nur ein Aufruf einer session_*()-Funktion nötig ist und alle Sessionvariablen schön an einem Platz und vollautomatisch im Feld $_SESSION bleiben.

Davon abgesehen reicht es nicht, einfach irgendeine Variable zu registrieren. Du hast nirgends im PHP-Teil eine Zeile, die die Formulardaten (hier: "ort") in die Sessionvariablen (hier: $ort) verfrachtet. Von alleine kommen sie da nicht hin!

Allerdings macht es Deine Funktionslogik (Formularziel ist ein neues Fenster) in der Tat etwas kompliziert.

<script language="JavaScript" type="text/javascript">

(nur nebenbei: Das language-Attribut ist überflüssig, type reicht und entspricht dem HTML-Standard.)

function popup()
{
F=window.open("auswert.php?<?=SID?>","neu","width=500,height=300");
}

<form action='javascript:popup()'  method="post">
<input type="text" NAME="ort" SIZE="39">

Wie eben geschrieben: Eine verzwickte Angelegenheit; ich möchte glatt behaupten, daß es mit "post" überhaupt nicht geht (lass mich aber gerne eines besseren belehren).

Mein Ansatz wäre, das Datum aus dem ort-Feld stattdessen an die URL anzuhängen:

window.open("auswert.php?ort="+escape(document.forms[0].ort.value),"neu","width=500,height=300");

Du erhälst dann das Datum von ort in auswert.php in einer Variable namens $_GET["ort"] (oder $HTTP_GET_VARS["ort"]). escape() ist nötig, um Zeichen, die in einer URL nicht erlaubt sind, zu maskieren. Nach dem gleichen Schema kannst Du natürlich auch weitere Daten anhängen, immer schön getrennt durch das Zeichen & .

Auf diese Art und Weise bist Du das Session-Problem vollständig los, trotzdem noch eine allgemeine Anmerkung:

@session_start();
echo $ort;

Externe Variablen erscheinen seit PHP-Version 4.1 (vor einigen Monaten rausgekommen, aktuell ist 4.3) nicht mehr standardmäßig global, sondern nur in dafür vorgesehenen Feldern ($_SESSION ist so eines, aber auch $_POST, $_GET, $_COOKIE und $_SERVER).

Von daher fährst Du an derartigen Stellen mit

echo $_SESSION["ort"];

oder (für ältere PHP-Versionen)

echo $HTTP_SESSION_VARS["ort"];

besser. Nicht, daß Du Dich dumm aus der Wäsche schaust, sobald Dein Hoster sich zur Abwechslung mal um aktuelle Software bemüht ;)

Gruß,
  soenk.e