Nelze odstranit položka ze session

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Maxell92
Člen | 38
+
0
-

Ahoj,

mám problém s vymazáním prvku ze session:

<?php
$section = $this->session->getSection('xx');
echo "sekce:";
dump($section);
echo "Data:";
dump($section->$id);
foreach( xx as $id_delete ) {
	echo "id:";
	dump ($id_delete);
	unset($section->$id[$id_delete]);
}
echo "Nova data:";
dump($section->$id);
?>

Vypíše toto:

sekce:

<?php
Nette\Http\SessionSection(5) { ...
   data private => array(1) {
      3 => array(6) {
         22 => "Černá" (7)
         23 => FALSE
         24 => TRUE
         25 => FALSE
         3 => TRUE
         4 => TRUE
      }
   }
}
?>

Data:

<?php
array(6) {
   22 => "Černá" (7)
   23 => FALSE
   24 => TRUE
   25 => FALSE
   3 => TRUE
   4 => TRUE
}
?>

id:
22, 23, 25, 3

Nova data:

<?php
array(6) {
   22 => "Černá" (7)
   23 => FALSE
   24 => TRUE
   25 => FALSE
   3 => TRUE
   4 => TRUE
}
?>

Proč mi nefunguje unset? Zkoušel jsem to i různě, např:

  • unset($section[$id][$id_delete]);
  • Přiřadit si $section[$id] do pomocné proměnné

Nic z toho nepomohlo a data jsou stále v session. Nemohu smazat sekci – a použít remove() – protože mažu jen část dat.

Díky

frosty22
Člen | 373
+
0
-

No jde o to, že pokud zavoláš unset přímo na prvek SessionSection, tak se zavolá magická metoda __unset() objektu a odstraní ji i ze SESSION. V tvém případě však voláš unset na vnořený element, který již nemůže objekt odchytit a tudíž ho neodstraní v SESSION.

Pokud bys tedy měl element nevnořený:

<?php
$section = $this->session->getSection('xx');
$section["foo"] = "bar"; // Uloží do session
unset($section["foo"]); // Odstraní ze session - zavolá __unset na objektu SessionSection
?>

V tvém případě:

<?php
$section = $this->session->getSection('xx');
$section["foo"] = array("bar" => "baz"); // Uloží do session
unset($section["foo"]["bar"]); // Odstraní element bar v objektu, ale SessionSection o tom neví a neuloží nový stav
?>

Je lepší tedy nepřímo modifikovat pole, ale přeuložit tj.:

<?php
$section = $this->session->getSection('xx');
$section["foo"] = array("bar" => "baz"); // Uloží do session

$data = $section["foo"]; // Vytáhnu pole
unset($data["bar"]);  // Odstraním element
$section["foo"] = $data; // Znovu uložím do session
?>
Maxell92
Člen | 38
+
0
-

Díky, takhle to funguje. Bez téhle informace to ale vypadá jako dost velký bug. Bylo by vhodné to minimálně doplnit do https://doc.nette.org/…ttp/sessions, kam se člověk dívá nejdříve.