Nelze odstranit položka ze session
- Maxell92
- Člen | 38
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
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
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.