[PHP] Sessies samen met klassen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo allen,

Ik heb een webshop geschreven die de winkelwagen bijhoudt in sessies. Er is een array 'producten' met als inhoudt producten[productid] = aantal.

Bij het toevoegen van een product wordt dus $_SESSION[producten][$_GET[id]]++; uitgevoerd. Ik heb een speciale klasse 'producten' waarin producten uit de database gehaald worden en in een 'product' klasse gestopt worden. Deze wordt dus gebruikt in winkelwagen.php. Dit werkte perfect totdat ik de product(en) klasse drastisch aangepast hebt (inhoudelijk). Methodes en variabelen zijn nagenoeg hetzelfde gebleven.

Wanneer ik nu een product toevoeg werkt het perfect, maar zodra ik een tweede product toevoeg (hetzelfde of een ander) krijg ik een error. In de sessie wordt het volgende opgeslagen:

$_SESSION[0] = Object; (product met inhoud!)
$_SESSION[4] = 1; (willekeurig product, klopt gewoon, dit is het eerste product dat toegevoegd is)

Object is dus van het type 'product' (aldus print_r) en bevat het laatst toegevoegde product.

Het vreemde is dat dit product object gewoon nergens aangemaakt wordt, behalve in de winkelwagen.php. Maar dat object kan dus gewoon niet in de sessie variabele staan, dat doe ik nergens!

Ik kreeg eerst nog de melding overigens dat de klasse nog niet volledig geladen was ofzo. Bleek dat include( "lib/product.php" ); voor session_start(); moest komen te staan. Maar het heeft het bovenstaande probleem niet opgelost.

Wie o wie kan mij iets nuttigs hierover zeggen? :)

Acties:
  • 0 Henk 'm!

Verwijderd

Het gaat er niet vanzelf in. Wat als je het met een debugger is watched. Meybe helpt dat B)

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 23 december 2003 @ 21:45:
Ik heb een webshop geschreven die de winkelwagen bijhoudt in sessies. Er is een array 'producten' met als inhoudt producten[productid] = aantal.

Bij het toevoegen van een product wordt dus $_SESSION[producten][$_GET[id]]++; uitgevoerd.
Hopelijk is dit $_SESSION['producten'][$_GET['id']]++;
Wanneer ik nu een product toevoeg werkt het perfect, maar zodra ik een tweede product toevoeg (hetzelfde of een ander) krijg ik een error. In de sessie wordt het volgende opgeslagen:
$_SESSION[0] = Object; (product met inhoud!)
$_SESSION[4] = 1; (willekeurig product, klopt gewoon, dit is het eerste product dat toegevoegd is)
Nu benader je de $_SESSION array via de numerieke indexen !?!?
Het vreemde is dat dit product object gewoon nergens aangemaakt wordt, behalve in de winkelwagen.php. Maar dat object kan dus gewoon niet in de sessie variabele staan, dat doe ik nergens!
Je gebruikt toevallig niet ergens nog een session_register("plaap"); en later gebruik je $plaap = new Product(); ?
Ik kreeg eerst nog de melding overigens dat de klasse nog niet volledig geladen was ofzo. Bleek dat include( "lib/product.php" ); voor session_start(); moest komen te staan. Maar het heeft het bovenstaande probleem niet opgelost.
Heb je http://nl3.php.net/manual/en/ref.session.php al doorgelezen? Na de eerste drie alinea's staat een "Caution" blok met daarin (enigszins subtiel) de melding dat je alleen objecten in sessies kunt opslaan als je class definitie voor de session_start() hebt staan...

Zonder inzicht in sources is er vrij weinig over te zeggen, behalve wilde gokken en speculaties :|

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 16:28

Bosmonster

*zucht*

Hopelijk is dit $_SESSION['producten'][$_GET['id']]++;
Ik hoop ook dat ie eerst die $_GET['id'] checkt.. want anders kun je die array behoorlijk vervuilen met alle mogelijke beveiligingsrisico's van dien..

Zorg dat je user-variabelen (iig de GET variabelen), altijd checkt op:

- zijn ze der wel?
- zijn ze van geldig formaat (cijfer of wat ander?)
- bestaat de invoer (bijvoorbeeld in DB)

Als je TIJDENS HET PROGRAMMEREN altijd rekening houdt met deze 3 kan er weinig meer fout gaan en scheelt je een hoop bug/security-fixing.

Acties:
  • 0 Henk 'm!

Verwijderd

Bosmonster schreef op 24 december 2003 @ 09:15:
Zorg dat je user-variabelen (iig de GET variabelen), altijd checkt op:

- zijn ze der wel?
- zijn ze van geldig formaat (cijfer of wat ander?)
- bestaat de invoer (bijvoorbeeld in DB)
Het beste is inderdaad om direct aan het begin van je script de user-variabelen te valideren en over te zetten naar gewone variabelen of defaults te gebruiken, c.q. een foutmelding voor te bereiden.
Daarna helemaal van die user variabele afblijven!

*Vertrouw nooooit de inhoud van user-variabelen!!*

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Uiteraard controleer ik wel alle user input. Maar dat was hier even niet van belang leek mij. Met $_GET[id] wilde ik alleen maar duidelijk maken dat het om een gesubmitte variabele ging.
Nu benader je de $_SESSION array via de numerieke indexen !?!?
Typo, moest nog ['producten'] tussen uiteraard.
Je gebruikt toevallig niet ergens nog een session_register("plaap"); en later gebruik je $plaap = new Product(); ?
Dat is dus het eerste wat ik gecheckt heb, maar nergens kunnen vinden...
Heb je http://nl3.php.net/manual/en/ref.session.php al doorgelezen? Na de eerste drie alinea's staat een "Caution" blok met daarin (enigszins subtiel) de melding dat je alleen objecten in sessies kunt opslaan als je class definitie voor de session_start() hebt staan...
Mjah maar ik wil dus geen objecten in de sessie opslaan, dat doet het script wel :D.
Zonder inzicht in sources is er vrij weinig over te zeggen, behalve wilde gokken en speculaties
Ik hoopte er op dat het een bekende fout was. Het is nogal veel code om hier neer te gooien.
Zorg dat je user-variabelen (iig de GET variabelen), altijd checkt op
POST variabelen zijn ook makkelijk te faken...maar goed, dat is een andere discussie.

Tis nu weer een nieuwe dag, misschien dat ik het nu wat helderder zie ;). /me gaat opnieuw kijken ;)

Acties:
  • 0 Henk 'm!

  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 18:51
Verwijderd schreef op 23 december 2003 @ 21:45:
Ik heb een webshop geschreven die de winkelwagen bijhoudt in sessies. Er is een array 'producten' met als inhoudt producten[productid] = aantal.
Bij het toevoegen van een product wordt dus $_SESSION[producten][$_GET[id]]++; uitgevoerd.
Bedoel je hier niet $_SESSION[producten[$_GET['id']]]; Let op de plaatsing van de haakjes. Hoe jij het hebt staan is het een twee dimensoniaal array. [producten][0] ipv [producten[0]]. Of zie ik het nu verkeerd?
Pagina: 1