Maurice: $_SESSION wird nicht "ge-unset-tet"

Hallo Freunde!

ich bin aktuell wirklich am Verzweifeln weil ich es jetzt schon auf mehrere verschiedene Wege versucht habe.
Das Problem ist folgendes:

Ich habe einen Mehrdimensionalen Warenkorb und über Ajax werden Änderungen daran vorgenommen. So weit so gut Funktioniert auch alles. Das Problem ist das ich über Ajax keine Session variablen "unset" kann. Daher setze ich die nicht benötigten als "NULL". Sieht dann als bsp. wie folgt aus:

$_SESSION['einkaufswagen']['ort']['artikel'] = NULL

Bei einem nächsten Seitenaufruf habe ich dann Folgenden PHP Script um die Variable dann zu "unset":

  
for ($i = 1; $i <= 5; $i++) {  
		if(!empty($_SESSION['einkaufswagen'])) {  
				foreach($_SESSION['einkaufswagen'] AS $event => $picture) {  
						if(!empty($event)) {  
								foreach($picture AS $picture => $value) {  
										if(!empty($picture)) {  
												if($value == NULL) {  
														unset($_SESSION['einkaufswagen'][$event][$picture]);  
														}  
												} else {  
												unset($_SESSION['einkaufswagen'][$event][$picture]);  
												}  
										}  
								} else {  
								unset($_SESSION['einkaufswagen'][$event]);  
								}  
						}  
				} else {  
				unset($_SESSION['einkaufswagen']);  
				}  
		}  

Wenn ich das anwende bleiben mir jedoch immer Überreste. Siehe diese print_r Ausgabe der $_SESSION:

[einkaufswagen] => Array
(
[2014_03_01_Mainburg] => Array
(
)

)

)

Ich hoffe mir kann jemand helfen. Die Sache kostet mich aktuell den letzen Nerv. :(
Habe auch schon verschiedene Sachen versucht: isset, array_key_exists, $variable != ''...
Auch an verschiedenen Stellen und in den If und foreach Abfragen mit dem kompletten $_SESSION Pfad versucht.

Vielen Dank schonmal!

  1. Hello,

    tja, so ist das. Mit AJAX muss man zunächst Probleme lösen, die man ohne AJAX nicht gehabt hätte.

    Die asynchronen Requests stellen untereinader aber auch zum Hauptrequest eine wunderbare Racecondition dar. Sie konkurrieren also um die Ressourcen.

    Sessiondateien werden mit session_start() geöffnet, wenn nicht vorhanden angelegt und dann solange gesperrt, wie die Connection besteht. Da wäre nun erstmal die Frage, ob sie bei HTTP 1.1 schon wieder geschlossen werden, wenn der User noch "in der Seite steht". Rein empirisch betrachtet müssen sie das aber, weil man sonst an jeder Ecke von den Problemen lesen würde.

    Sie werden aber gewiss solange offengehalten und gesperrt, wie die Abarbeitung des Requests dauert. Wenn da nun währenddessen noch ein zweiter kommt, muss der warten.

    Aus Serversicht ist es übrigens egal, ob der Request mittels "normalem" GET, POST oder Ajax erstellt worden ist.

    Du musst also eine Möglichkeit finden, die Requests zu queuen. Dazu dürfen sie auch nicht zu dicht nacheinander folgen. Es gibt hier sogar jemanden im Forum, der meint, dass ein Ajax-Request den anderen überholen könnte, wenn sie zu dicht aufeinander gefeuert werden. Wenn der eine über China routet und der andere erst bei Obama den Haken abholen muss, dann weiß ich nicht, welcher länger unterwegs ist.

    Deine Bastelei von oben kannst Du jedenfalls vergessen. Du brauchst nur einen "Fahrplan".

    Liebe Grüße aus dem österlichen Chemnitz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bikers-lodge.com
    1. Hallo Leute!

      Entschuldigt die späte Antwort, war arbeitstechnisch aktuell nicht verfügbar.
      Vielen Dank erstmal für die Antworten.

      Also die Schleife war ja eben so gedacht das sie per "for" öfters durch läuft um von innen nach außen aufzuräumen.
      Aber ja, diese Schleife war wirklich ein totaler Kaas ;-)

      Ich habe es daraus geschlossen das unset bei Ajax nicht funktioniert weil ich es Probiert hatte und es nicht funktioniert hat. Dank euren Hilfen und Aussagen das es doch geht habe ich mich noch einmal rangesetzt und das ganze nun als schleife im Ajax gelöst:

      Erst wird überprüft ob das Event noch mehr als ein Picture hat und dementsprechend wird dann entweder das Event oder Picture in einer while(isset($_SESSION....) or $count < 15) schleife ge-unset-tet. Das "count kleiner als 15" ist nur zur Sicherheit, falls Fehler auftreten soll er nicht mehr als 15 versuche machen. Zudem habe ich zwischen der while Abfrage und dem unset in der Schleife noch ein sleep(1) eingebaut um die Abfragen nicht zu schnell durch zu knallen. ;-)

      So funktioniert es jetzt.
      Vielen Dank euch drei, vor allem Tom der mir die entscheidenden Hinweise gegeben hat und durch den ich auch anderweitig wieder etwas dazu gelernt habe ;-)

      1. Hello,

        Erst wird überprüft ob das Event noch mehr als ein Picture hat und dementsprechend wird dann entweder das Event oder Picture in einer while(isset($_SESSION....) or $count < 15) schleife ge-unset-tet. Das "count kleiner als 15" ist nur zur Sicherheit, falls Fehler auftreten soll er nicht mehr als 15 versuche machen. Zudem habe ich zwischen der while Abfrage und dem unset in der Schleife noch ein sleep(1) eingebaut um die Abfragen nicht zu schnell durch zu knallen. ;-)

        So funktioniert es jetzt.

        Wenn Du nun einen Lösungsweg gefunden hast, muss das noch keine fertige Lösung sein ;-O

        Insbesondere beim Arbeiten mit Sessiondaten empfiehlt sich ein Metadatum mit einem Micro-Timestamp.
        Das heißt, dass Du den Documents und Forms, die Du an den Client auslieferst immer einen eindeutigen Micro-Timestamp mitlieferst, der beim folgenden Request auch mitgeliefert werden muss. So kannst Du dann zuordnen, ob der Request vor oder nach dem Eintrag der Daten in die Session stattgefunden hat. Auf gemeldte Zeitstempel, die am Client _generiert_ wurden, kann man sich nicht verlassen, wohl aber auf die vom eigenen Server. Der ist dann sozusagen "Nabel der Welt". Zur Sicherheit kann man neben dem Micro-Timestamp auch noch einen Hash davon mitgeben. Dann wird das Ganze aber langsam paranoid.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bikers-lodge.com
        1. So funktioniert es jetzt.

          Wenn Du nun einen Lösungsweg gefunden hast, muss das noch keine fertige Lösung sein ;-O

          Insbesondere beim Arbeiten mit Sessiondaten empfiehlt sich ein Metadatum mit einem Micro-Timestamp.
          Das heißt, dass Du den Documents und Forms, die Du an den Client auslieferst immer einen eindeutigen Micro-Timestamp mitlieferst, der beim folgenden Request auch mitgeliefert werden muss. So kannst Du dann zuordnen, ob der Request vor oder nach dem Eintrag der Daten in die Session stattgefunden hat. Auf gemeldte Zeitstempel, die am Client _generiert_ wurden, kann man sich nicht verlassen, wohl aber auf die vom eigenen Server. Der ist dann sozusagen "Nabel der Welt". Zur Sicherheit kann man neben dem Micro-Timestamp auch noch einen Hash davon mitgeben. Dann wird das Ganze aber langsam paranoid.>

          Hey.
          Danke für diese Ansätze. Aktuell denke ich reicht der aktuelle weg da es auch recht schlicht mit den Ajax abfragen hält.
          Sollte ich es dann aber doch mal komplexer handhaben mit Ajax is das mit der Zeitangabe eine gute Idee.

          Liebe Grüße

  2. Hi,

    Wenn ich den äußerst seltsam eingerückten Code *) richtig verstehe, wird
    unset($_SESSION['einkaufswagen']);
    nur ausgeführt, wenn
    empty($_SESSION['einkaufswagen'])
    ist.
    Andernfalls werden nur Inhalte von $_SESSION['einkaufswagen'] per unset behandelt.
    Ist also eigentlich kein Wunder, wenn
    $_SESSION['einkaufswagen']
    übrigbleibt.

    *) sieht so aus, als gehöre zu den beiden foreach jeweils ein (identisch eingerücktes) else - was aber nicht sein kann.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  3. Hallo Maurice,

    warum beim aufräumen des Arrays was übrigbleibt hat Andreas ja schon geschrieben, ich würde aber das Problem aber eher an der Wurzel packen:

    Das Problem ist das ich über Ajax keine Session variablen "unset" kann.

    Doch, kannst du. Woraus schließt du dass das nicht geht?

    Gruß,
    Tobias