Archief - PHP: objecten in sessie steken

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

passero

Legacy Member
Ik heb een array waar ik objecten in steek. Allemaal dezelfde type, een klasse die ik zelf heb geschreven.
Blijkbaar lukt het niet direct om die in een sessie op te slaan. Ik weet wss niet hoe, kan iemand eens een voorbeeld geven hoe ik arrays in sessie kan opslaan?

Fr3aK

Legacy Member
Gaat normaal wel ze:
PHP:
$_SESSION['testje'] = array();
$_SESSION['testje'][] = "Foo";
$_SESSION['testje'][] = "Bar";

print_r($_SESSION['testje']);
geeft:
PHP:
Array
(
    [0] => Foo
    [1] => Bar
)

Mulle

Legacy Member
Ik doe dit ook array's in sessie opslaan en dat lukt zonder probleem.

PHP:
<?
session_start();

$t = array(
   0 => "123", 
   1 => "234", 
   2 => "345");

$_SESSION['test'] = $t;

print_r($_SESSION['test']);
?>

orez

Legacy Member
ja maar das een session array "testje" dat een session een array is das idd waar, maar 1 session dingske kan op zich geen objecten bevatten, als een array daar nu invalt... kweet nie

Alé mijzelf beetje meer verduidelijkt ;)

Fr3aK

Legacy Member
Op zich is een sessie geen array, maar je kan eender welke variabele als een array gebruiken zolang je ze maar definieert, vb:
PHP:
$_SESSION['testje'] = array();
$_SESSION['testje'][] = "Foo";
$_SESSION['testje'][] = "Bar";

$_SESSION['testje'][0] = array();
$_SESSION['testje'][0][] = "Foo";
$_SESSION['testje'][0][] = "Bar";

print_r($_SESSION['testje']);
geeft
PHP:
Array
(
    [0] => Array
        (
            [0] => Foo
            [1] => Bar
        )
    [1] => Bar
)
Moest $_SESSION['testje'][0] = array(); daar niet staan zou het niet gewerkt hebben...

EDIT: Geen idee of het dat is wat je bedoelt, snap uw uitleg ni zo goe (ben beetje moe)

Squall-sX-

Legacy Member
Je zult je class moeten serializen en unserializen.
Of je classes declareren voor je de sessie op je pagina start.

dus:
PHP:
session_start();
require_once( 'class.eigenclass.php' );
$foo = new EigenClass();
$foo = serialize($foo)
$_SESSION['foo'] = $foo;

// volgende pagina
session_start();
require_once( 'class.eigenclass.php' );
$foo = isset( $_SESSION['foo'] ) ? unserialize( $_SESSION['foo'] ) : false;

Of:
PHP:
require_once( 'class.eigenclass.php' ):
session_start();
$foo = new EigenClass();
$_SESSION['foo'] = $foo;

// volgende pagina
require_once( 'class.eigenclass.php' );
session_start();
$foo = $_SESSION['foo'];

Fr3aK

Legacy Member
Gaat dat als ge van die sessie geen array maakt?
Want sessies zijn zoals orez al had gezegd string-variabelen...

PC_Freak

Legacy Member
Objecten opslaan in de sessie kan zoals gezegd door ze te serializen, in PHP 5 heb je zelfs de methoden __sleep() en __wakeup() die automatisch worden aangeroepen tijdens het serializen en unserializen.

passero

Legacy Member
Oplossing gevonen :)

Die array bestaat uit objecten, niet uit strings en blijkbaar gaf hij daar problemen mee. Na een lange speurtocht op het net las ik dat de sessie het object dat je wil wegschrijven reeds moet kennen, allé het type. Dus:

PHP:
require_once("myClass.phpm"); 
session_start(); 

$myArray = new array();
$myArray[] = new myClass("name");
$myArray[] = new myClass("name2");
$myArray[] = new myClass("name3");

session['arr'] = $myArray;

Werkt perfect :)
Als ik die require_once ONDER de session.start zet, dan krijg ik fouten omdat de sessie de definitie niet kent van het object.

Rvl

Legacy Member
btw: wanneer kreeg je je probleem eigelijk bij het begin van u probleem. Als je u object wou toevoegen aan de sessie of als je je object er uit wou halen. Als je het probleem kreeg wanneer je je object uit u session wou halen en terug wou gebruiken is het simpel op te lossen door u object te casten. dus dan zou je iets krijgen van $objectUitSessie = (KlasseNaam) $_SESSION("obj");

passero

Legacy Member
Rvl zei:
btw: wanneer kreeg je je probleem eigelijk bij het begin van u probleem. Als je u object wou toevoegen aan de sessie of als je je object er uit wou halen. Als je het probleem kreeg wanneer je je object uit u session wou halen en terug wou gebruiken is het simpel op te lossen door u object te casten. dus dan zou je iets krijgen van $objectUitSessie = (KlasseNaam) $_SESSION("obj");

aja lol niet aan gedacht :$
Het is idd wanneer ik hem uit mijn sessie wou halen. Nu, het object dat in mijn sessie zit, is een array. Dat herkent hij perfect. Maar die array bevat zelfgeschreven klassen, daar had hij problemen mee. Nu ja, het is opgelost door de require_once bovenan te zetten.

killgore

Legacy Member
Als je objecten/arrays aan uw sessie/cookie data moet toevoegen is er iets goed mis met uw coding-structuur.

killgore

Legacy Member
Neen

Bij een perfect OO systeem maak je een save-handler binnen die klasse, die zijn velden dan in een db opslaat (niet het object, de velden, tenzij je een OO-db hebt, maar die laat ik buiten beschouwing).
Je sessie houdt enkel bij welke persoon je bent en jij haalt dan de nodige info uit een db.

Voor een sessie kan ik er nog ergens inkomen dat je die objecten zelf in de sessie steekt, hoewel het nog steeds geen goede manier van coden is. Voor een cookie is het volledig not done.

Sleep en wakeup zijn btw 2 van de meest hilarische toevoegingen aan OOP.

passero

Legacy Member
das ook niet zo performant
Stel dat je met 1000 users tegelijk aan het shoppen bent op de site.
Per pagina dat ze bekijken worden minstens 1000 records opgehaald uit de DB juist maar om een user object te vullen..
Dan ben je toch beter af met een sessie?

Obliv`

Legacy Member
Die userdata ff uit de db lezen zal zeker niet zo'n weerslag hebben op de performantie ze, zelfs al heb je 1000 bezoekers ;)

Ik ben van het principe om zo weinig mogelijk dingen in sessions op te slaan en cookies zou ik vermijden tenzij het niet anders kan. Owv veiligheid.

Ik sluit me dan ook volledig aan bij killgore :)

killgore

Legacy Member
Over performantie: niet 100% waar.
Ten eerste moet jij ook serializen, schrijven, lezen en unserializen.
Ten tweede ga jij dat object ALTIJD opnieuw inlezen (de geserialisede versie toch) zodra je pagina geladen wordt, met een mysql systeem lees je die in wanneer je ze nodig hebt.
Ten 3e is het tijdsverlies daarop zo minimaal dat zelfs het gros van de betere webwinkels e.d. hier niets van zal merken. Enkel zaken die massaal bezocht worden zoals ebay zouden hier misschien enige directe hinder van ondervinden. Het zou mij echter verbazen (moesten deze in php gecode hebben) als zij wel hun objecten onmiddelijk in de sessies zoudne opslaan.

De personen die klagen over dergelijke performantie zijn typisch de mensen die iets coden als:
PHP:
$array = array(...);
for($i=0; $i < sizeof($array); $i++)
{
...
}

Daarnaast, op niet programmatorisch vlak zit jij nog met enkele problemen, zoals gebruiksonvriendelijkheid. Als een gebruiker inlogt, hij maakt zijn winkelmandje aan met 50 producten en sluit dan per ongeluk zijn browser af (doe ik vaak genoeg) dan staat hij daar mooi. Hij is alle data kwijt, want de sessie is vervallen. Echter, met het systeem dat ik vermelde kan je (niet verplicht) de data linken aan de gebruiker ipv aan de sessie, wat elke normale coder ook zal doen als hij een gebruikerssysteem nodig heeft, TENZIJ het expliciet anders moet.

Op programmatorisch vlak heb je 2 situaties die het gevaarlijk kunnen maken, Ten eerste (en dat is het voornaamste punt) is het een globale variabele die dus zeer simpel ergens anders "per ongeluk" kan overschreven worden, iets dat zeer moeilijk is met een db systeem. Globals zijn te vermijden.
Ten tweede heb je helemaal geen controle op hoe de opslag van je systeem gebeurt. Hoe wordt dit opgeslagen, waar, hoe lang, ... ?

PC_Freak

Legacy Member
Als je een custom session handler hebt (bvb met database-opslag) wat is dan nog het verschil met handmatig opslaan in de database of een database powered sessie gebruiken?

Je bepaalt zelf wanneer een sessie verloopt en van serializen is totaal geen sprake.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan