Multidesk.be » Forums » PHP » Winkellijstje met sessies

  • Pagina
  • 1 van 1
0 gasten lezen dit onderwerp.
^ Onderwerp geschreven door Ezio op woensdag 16 juli 2014 om 16:17:02.
Ezio's avatar
Multiviteit: 973
Hey,

Als oefening op het gebruik van sessies met meerdere dimensies, ontwierp ik een systeem om een winkellijstje op te stellen. Het concept is heel eenvoudig; je geeft een item in, klikt op toevoegen en je ziet het winkellijstje met al je items.
Ik probeerde dit via onderstaande code, maar er moet toch nog een foutje in geslopen zijn. Ik krijg immers mijn winkellijstje niet te zien (misschien bevat de sessie gewoon geen waarden?).

Iemand een ideetje? :)

PHP
  1.  
  2. <?php
  3. // Gebruik van sessies activeren
  4.  
  5. // Werden er al items toegevoegd aan het winkellijstje?
  6. if (isset($_SESSION['Winkellijst'])) {
  7.         // We doorlopen de sessie en tonen alles uit het winkellijstje
  8.         foreach($_SESSION['Winkellijst'] as $key) {
  9.                 echo $key."<br />";
  10.         }
  11. }
  12.  
  13. // Werd er geklikt op de knop toevoegen? Dan voegen we het item toe aan het winkellijstje
  14. If (isset($_POST['btnToevoegen'])) {
  15.         $_SESSION['Winkellijst'][$_POST['Item']];
  16. }
  17. ?>
  18.  
  19. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  20. <html xmlns="http://www.w3.org/1999/xhtml">
  21. <head>
  22. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  23. <title>Winkellijstje</title>
  24. </head>
  25.  
  26. <body>
  27. <form method="post" name="Winkellijst" action="Winkellijstje.php">
  28. Item: <input type="text" name="Item" /><br />
  29. <input type="submit" value="Toevoegen" name="btnToevoegen" />
  30. </form>
  31. </body>
  32. </html>
  33.  
I'm a gamer because I don't have a life... I've chosen to have many
^ Reactie #1 geschreven door thekid op woensdag 16 juli 2014 om 18:04:05.
thekid's avatar
Multiviteit: 5273
Moderator
Kan je eens je output tonen nadat je iets toeveoged hebt? je keys zouden moeten getoont worden?

terloops, vraagjes:
- Is er een reden waarom je hier geen variabele gebruikt om eerst de sessie te lezeen en deze dan te overlopen? Ik zie deze eerder als een performance killer, maar dan hangt er weer vanaf hoe php het afhandelt :)

PHP
  1. foreach($_SESSION['Winkellijst'] as $key) {
  2.                 echo $key."<br />";
  3. }


- Wat nou als de sessie nog niet bestaat/geen waarde heeft wordt hier een nieuw object aangemaakt, opnieuw de vraag, waarom je winkellijstje niet zien als een object (of misschien zelfs klasse), die je eenmaal laad, en eenmaal schrijft?
PHP
  1. $_SESSION['Winkellijst'][$_POST['Item']];


+ maak het jezelf gemakkelijker en gebruik de show warnings & errors in php (en indien er zijn, geef deze hier ook door)

dan nog een kleine toevoeging over de opbouw van je pagina, je toont je keys en pas daarna voeg je uw nieuwe item toe. Uw keys zullen dus altijd 1 pagina later pas getoond worden :)

Randinformatie

Doe jezelf eens een "plezier" en kijk eens je code stijl van 1 jaar geleden na en zie wat je allemaal verandert hebt, en kijk dan nog eens naar je code nu, wat zou je kunnen doen om het nog beter te schrijven.


+ BTW heb je dan uw vorig sessie problemen opgelost? Had het te doen met de schrijfrechten op de apache server map, of met een eventueel probleem in je code dat je nog niet volledig doorgegeven had? :)
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #2 geschreven door Ezio op woensdag 16 juli 2014 om 18:36:29.
Ezio's avatar
Multiviteit: 973
Script is actief op www.thibaultseynaeve.be/PHP/Winkellijstje.php :)

Dus is het beter om eerst de array in een andere variabele te steken en die dan in de foreach te gebruiken? Zoals hier:
PHP
  1.  
  2. $Items = $Session['Winkellijst']
  3. foreach ($Items as $key) {
  4. echo $key;
  5. }
  6.  


Objecten en klasses is waarschijnlijk nog wat te hoog gegrepen voor deze beginner :) Hoe zou jij dit dan precies aanpakken?

'show warnings & errors' is nu actief. Wanneer je een item probeert toe te voegen krijg je de melding "Undefined Index" op regel 16:
PHP
  1.  
  2. $_SESSION['Winkellijst'][$_POST['Item']];
  3.  


Dat vorig probleem is nog niet opgelost, welke rechten zou ik precies moeten aanpassen?
Deze tekst werd het laatst bewerkt voor 0.22 % door Ezio op woensdag 16 juli 2014 om 18:37:54.
I'm a gamer because I don't have a life... I've chosen to have many
^ Reactie #3 geschreven door thekid op woensdag 16 juli 2014 om 18:48:45.
thekid's avatar
Multiviteit: 5273
Moderator
no offense, maar beginner zijn is geen excuus om iets niet goed te doen. Ik zie het eerder zo: je kan het maar beter direct goed leren. En aangezien ik toch vooruitgang bij je zie blijf ik er ook op hameren.

Simpelste versie zou voor mij zijn:
- klasse voor winkelkar (met methodes toevoegen, verwijderen, tonen)
- klasse unserializen wanneer ze al bestaat in de sessie anders, nieuwe winkelkar starten
- klasse serializen nadat alle veranderingen zijn aangebracht
- gegevens tonen

de foutmelding die je doorgeeft heeft inderdaad te maken met een onbestaand object die je toch iets probeert toe te wijzen ;)

*update*
ik zou het eerder zo doen :)
PHP
  1. <?
  2. // enable displaying warnings & errors
  3. ini_set('display_errors', 1);
  4.  
  5. // start new session in case there is none there
  6. if(session_id() == '') {
  7.     session_start();
  8. }
  9.  
  10. class Winkelkar {
  11.     protected $inhoud;
  12.    
  13.     public function __construct() {
  14.         $this->inhoud = array();
  15.     }
  16.    
  17.     public function Add($item,$qty) {
  18.         if (isset($this->inhoud[$item])) {
  19.             $this->inhoud[$item] += $qty;
  20.             return;
  21.         }
  22.         $this->inhoud[$item] = $qty;
  23.     }
  24.  
  25.     public function Remove($item) {
  26.         if (isset($this->inhoud[$item])) {
  27.             unset($this->inhoud[$item]);
  28.         }
  29.     }
  30.  
  31.     public function Show() {
  32.         $msg = '<table class="shoppingCart"><tr><th>Item</th><th>Aantal</th></tr>';
  33.         foreach ($this->inhoud as $item => $qty) {
  34.             $msg = $msg.'<tr>';
  35.             $msg = $msg.'<td>'.$item.'</td>';
  36.             $msg = $msg.'<td align="right">'.$qty.'</td>';
  37.             $msg = $msg.'</tr>';
  38.         }
  39.         $msg = $msg.'</table>';
  40.         return $msg;
  41.     }
  42. }
  43.  
  44. // winkelkar nieuw aanmaken of laden
  45. $winkelkar = new Winkelkar();
  46. if (isset($_SESSION['WinkelKar'])) {
  47.     echo 'Winkelkar geladen';
  48.     $winkelkar = unserialize($_SESSION['WinkelKar']);
  49. }
  50.  
  51. if (isset($_POST['btnAdd'])) {
  52.     $item = $_POST['item'];
  53.     $qty = $_POST['quantity'];
  54.     $winkelkar->Add($item, $qty);
  55. }
  56.  
  57.  
  58.  
  59.  
  60. // winkelkar bewaren
  61. $_SESSION['WinkelKar'] = serialize($winkelkar);
  62. ?>
  63. <!DOCTYPE html>
  64. <html>
  65. <head>
  66.     <title>Winkelkar</title>
  67. </head>
  68. <body>
  69. <div id="winkelkarInhoud"><?=$winkelkar->Show()?></div>
  70. <form method="post">
  71. <table><tr><td>Item:</td><td><input type="text" name="item" required /></td>
  72. <td>Aantal:</td><td><input type="number" min="1" name="quantity" required max="100" /></td>
  73. <td><button type="submit" name="btnAdd">Verzenden</button></td></tr></table>
  74. </form>
  75. </body>
  76. </html>
Deze tekst werd het laatst bewerkt voor 61.9 % door thekid op woensdag 16 juli 2014 om 19:28:08.
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
  • Pagina
  • 1 van 1

Snel-antwoordformulier
Toon uitgebreid antwoordformulier Bericht nalezen Bericht plaatsen