[Gelöst] SESSION wird nicht korrekt aus DB gelesen
am 22.05.2014 - 09:59 Uhr in
Hi Leute,
ich bin seit mehr als 2 Tage an einem Thema an dem ich bald an meinem Verstand zweifel weil es nicht so funktioniert wie es eigentlich sein sollte.
Ich schreibe derzeit an einem Code der innerhalb eines Contents ausgeführt werden soll. Dieser Code soll nur überprüfen ob die Node bzw. der Alias Pfad mit einem GET Parameter aufgerufen wurde und verändert dann so einen Link im Text des Artikels.
Wenn also der Beitrag mit einem GET Parameter aufgerufen wird dann wird dieser in die $_SESSION geschrieben und danach die selbe Seite mittels drupal_goto ohne GET Parameter neu geladen. Dabei liest der Code aus der aktuellen $_SESSION die den geschrieben GET Parameter und setzt den Link entsprechend um.
Das schreiben in die Session funktioniert einwandfrei, jedenfalls kommt in die Drupal Tabelle "sessions" mit dem korrekten Wert an (In der user Tabelle gibt es einen User mit uid = 0, dies ist geprüft).
Beim Neuladen bzw. Refresh der Seite wird aber der Wert nicht korrekt aus der Session gelesen. Der Wert ist meinstens ein alter aus den vorherigen versuchen. Ich habe zum Teil den Browser Cache im verdacht, aber diesen habe ich bereits abgeschaltet bzw. habe die Seite komplett neu laden lassen (Cache leeren und vollständig aktualisieren z.B. in Google Chrome).
Hier mal der PHP Code:
<?php
drupal_set_html_head('<meta http-equiv="expires" content="0" />');
drupal_set_html_head('<meta http-equiv="cache-control" content="no-cache" />');
drupal_set_html_head('<meta http-equiv="pragma" content="no-cache" />');
// Drupal Globale Variable abrufen
global $base_url;
echo "Aktuelle Session PID: ".$_SESSION['mpid']."\n";
$pid = 0;
$url = "https://www.example.de?pId=";
// Wenn die Seite mit GET Parameter aufgerufen wird dann liefert
// die Funktion am Ende "/index.php". Dies muss entfernt werden.
$currentpath = str_replace("/index.php", "", drupal_get_path_alias($_GET['q']));
// mpid bereits angelegt?
if (!isset($_SESSION['mpid'])) {
echo "Write init PID to Session: ".$pid."\n";
$_SESSION['mpid'] = $pid;
}
if (isset($_GET["pid"]))
{
//GET Parameter pid gesetzt
$pid = (int)$_GET["pid"];
$_SESSION['mpid'] = $pid;
echo "Write _GET PID to Session: ".$_SESSION['mpid']."\n";
// Lade die aktuelle Seite neu ohne GET Befehl.
drupal_goto($base_url.'/'.$currentpath, "");
}
elseif (isset($_POST["pid"]))
{
//POST Parameter pid gesetzt
$pid = (int)$_POST["pid"];
$_SESSION['mpid'] = $pid;
}
else
{
// PID aus der Session lesen
$pid = $_SESSION['mpid'];
echo "Get PID from session : ".$pid."\n";
}
echo "Current pid: ".$pid."\n";
switch ($pid) {
case 1: // xyz
$partnerId = "xyz"; break;
default:
$partnerId = "abc"; break;
}
?>
<a href="<?php echo $url.$partnerId; ?>">Das ist ein Beispiel. </a>
Ich hoffe das mir jemand helfen kann, ich bin wirklich am verzweifeln das es nicht klappt. Bitte verzeiht auch wenn dies nicht der korrekt bereich ist, habe kein anderen passenden bereich gefunden.
Danke schon mal für Eure Hilfe.
Gruß,
Torakas
- Anmelden oder Registrieren um Kommentare zu schreiben
Hallo Torakas, leider ist
am 22.05.2014 - 10:08 Uhr
Hallo Torakas,
leider ist nicht ersichtlich, wo oder wie Du den obigen code ausführst.
Verwende mal Firebug um zu sehen, ob die obige Seite aus dem Browser Cache geladen wird (Status 304).
Wird die Seite vom Server geladen sollte der HTTP Status 200 sein.
MfG
Robert
Hallo Robert, werde ich mal
am 22.05.2014 - 11:55 Uhr
Hallo Robert,
werde ich mal prüfen. Schreibe später dazu das Ergebnis.
Wenn ich ein neuen Betrag (Inhalt) erstelle dann kann ich Textkörper je nach dem was in Eingabeformat definiert ist (Full HTML oder PHP code) den PHP Code hinzufügen. Natürlich wurde es in diesem Fall das Eingabeformat auf PHP code gestellt und der PHP Code von oben mit reinkopiert.
Ich versteh halt auch nicht warum der Browser bei der Seite auf den Cache zugreift obwohl im Header die Ablaufzeit auf 0 Sekunden steht und das es nicht zwischengespeichert werden soll.
Gruß,
Torakas
Hi, der Browser sendet
am 22.05.2014 - 12:29 Uhr
Hi,
der Browser sendet üblicherweise einen HEAD Request (mit dem modified Datum der im lokalen Cache befindlichen Datei)
an den Server.
Ist das Datum gleich wie das Datum der im Cache befindlichen Datei meldet der Server 304 not modified.
Das wiederum bedeutet der Browser lädt die Datei aus dem lokalen Cache.
Eine Möglichkeit wäre in Deinem Code wenn Du einen Zeitstempel an Deinen URL hängst.
drupal_goto($base_url.'/'.$currentpath.'&'.time(), "");
Der Browser hält das dann für einen anderen URL und lädt Sie dadurch immer vom Server.
MfG
Robert
Hallo Robert, mit dem
am 22.05.2014 - 15:12 Uhr
Hallo Robert,
mit dem "&".time() läd er immer die Seite neu bei drupal_goto, das ist korrekt. Die PID ID ändert sich immer wieder so wie übergeben auch nach dem goto.
Der sind die Daten in die Session zu schreiben war es eigendlich das die PID Information nicht verloren geht wenn der Gast User doch vielleicht mal durch die anderen Beträge geht um sich umzuschauen. Sollte er dann wieder auf die Seite mit dem Link kommen soll der Link anhand der gespeicherten PID angepasst werden. Da aber durch das Menu der Alias aufgerufen wird und der Server wohl meldet das die Seite sich nicht verändert hat wird eine falsche Information aus dem Cache des Browsers geladen in der natürlich die falsche PID steht.
Ich weiss nicht ob dies der richtig Weg ist um die Information zu speichern bzw. kann man dem Server/Drupal sagen das diese Seite grundsätzlich neu geladen werden soll.
Wenn ich auf dem Holzweg bin, auch wegen dem Seiten Reload problem und Du/Ihr eine Idee habt wie man das lösen könnte wäre ich sehr danke für einen Tip bzw. kleines Beispiel bzw. Link zu einem Beispiel.
Gruß,
Torakas
[Gelöst] SESSION wird nicht korrekt aus DB gelesen
am 23.05.2014 - 09:15 Uhr
Hi zusammen,
ich habe selber die Lösung gefunden.
Es liegt nicht nur am Browser Cache sondern das Drupal auch die Seiten Cached, was ja auch gut ist und den Webserver nicht so belastet. Wenn man aber einzelne Seiten nicht gecache haben will kann man entweder das Module CacheExclude installieren und die URL eintragen oder man schreibt direkt im PHP Code oben folgendes rein damit der Cache dort wo der Code verwendet wird nicht verwendet wird.
$GLOBALS['conf']['cache'] = false;
wünsche allen ein schönes Wochenende.
Gruß,
Torakas