Avatar billede astengaard Nybegynder
15. september 2004 - 00:18 Der er 6 kommentarer og
1 løsning

Problemer med session

Jeg er ved at gå ud af mit gode skind!!!
Jeg har brugt en del timer på at gemme et objekt i session, og nu har jeg givet op, og lavet det som et array istedet for, men der går et eller andet galt. Jeg har tre filer:
top.php - Definerer toppen af siden og henter objektet fra session og konverterer det til et objekt.
kurv.php definerer klassen kurv og klassen varelinie.
kurvTest.php som tester funktionaliteten af kurv.

Her er de vigtigste kodestumper:
top.php
-------
  include_once "kurv.php";
  session_start();
  $kurv = loadKurv();

kurv.php
--------
  include_once("vare.php");

  class Varelinie {
    var $vareid;
    var $antal;

    function Varelinie($vareid, $antal) {
      $this->vareid = $vareid;
      $this->antal = $antal;
    }
   
    function getVareTekst() {
      $vare = getVareFromDB($this->vareid);
      return $vare->varenavn_1;
    }

    function getPris() {
      $vare = getVareFromDB($this->vareid);
      return $vare->salgspris;
    }

    function getVareid() { return $this->vareid; }
    function setVareid($vareid) { $this->vareid = $vareid; }
    function getAntal() { return $this->antal; }
    function setAntal($antal) { $this->antal = $antal; }

} // class Varelinie


  class Kurv {
    var $varelinier;
    var $samletPris;
    var $antalVarer;
 
    function Kurv() {
      $this->varelinier = array();
      $this->samletPris = 0;
      $this->antalVarer = 0;
    }
   
    function getVarelinier() {
      return $this->varelinier;
    } // function getVarelinier

    function setVarelinier($varelinier) {
      $this->varelinier = $varelinier;
    } // function getVarelinier

    // Finder varelinie med $vareid. Hvis varelinien ikke findes returneres 0
    function getVarelinie($vareid) {
      $varelinier = $this->getVarelinier();
      echo("getVarelinie----Der er følgende varelinier: ".print_r($varelinier)."<br>");
      for($i=0;$i<count($varelinier);$i++) {
        $varelinie = $varelinier[$i];
        if($varelinie->getVareid() == $vareid) return $varelinie;
      }
      return 0;
    } // function getVarelinie


    // Tilføjer $antal varer med $vareid. Hvis varen er i kurven i forvejen, så øges antallet med $antal ellers oprettes varelinien.
    function addVarelinie($vareid, $antal) {
      $varelinier = $this->getVarelinier();
      if(array_key_exists($vareid,$varelinier)) {
        $varelinie = $varelinier[$vareid];
        $nuAntal = $varelinie->getAntal();
        $varelinie->setAntal($nuAntal + $antal);
        $varelinier[$vareid] = $varelinie;
      } else {
        echo("Jeg opretter ny varelinie.......vareid: ".$vareid."....antal: ".$antal."<br>");
        $varelinie = new Varelinie($vareid, $antal);
        $varelinier[$vareid] = $varelinie;
      }
      $this->antalVarer = $this->calculateAntal();
      $this->samletPris = $this->calculatePris();
      echo(print_r($varelinier)."----addVarelinie slut<br>");
      echo("Samlet pris: ".$this->getSamletPris()."<br>");
      echo("Antal varer: ".$this->getAntalVarer()."<br>");
    } // function addVarelinie

    // Fjerner $antal varer med $vareid. Hvis varen ikke findes gøres ingenting. Hvis antallet af varer < 0, så fjernes varen fra kurven.
    function removeVarelinie($vareid, $antal) {
      $varelinier = $this->getVarelinier();
      if(array_key_exists($vareid,$varelinier)) {
        $varelinie = $varelinier[$vareid];
        $restAntal = $varelinie->getAntal() - $antal;
        if($restAntal > 0) {
          $varelinie->setAntal($restAntal);
          $varelinier[$vareid] = $varelinie;
        } else {
          unset($varelinier[$vareid]);
        }
      }
      $this->antalVarer = $this->calculateAntal();
      $this->samletPris = $this->calculatePris();
    } // function removeVarelinie

    // Funktion der sammentæller antallet af varer i kurven
    function calculateAntal() {
      $antal = 0;
      $varelinier = $this->getVarelinier();
      while(list($vareid,$varelinie) = each($varelinier)) {
        $antal += $varelinie->getAntal();
      }
      return $antal;
    } // function calculateAntal
   
    // Funktion der udregner den samlede pris på varerne i kurven
    function calculatePris() {
      $pris = 0;
      $varelinier = $this->getVarelinier();
      while(list($vareid,$varelinie) = each($varelinier)) {
        $pris += $varelinie->getPris() * $varelinie->getAntal();
      }
    } // function calculatePris

  // Funktion der henter kurv fra session. Hvis kurven ikke findes oprettes en ny kurv
  function loadKurv() {
    if(!isset($_SESSION['sessionBasket'])) {
      $kurv = new Kurv();
    } else {
      $basket = $_SESSION['sessionBasket'];
      $kurv = new Kurv();
      $kurv->setSamletPris($basket['samletPris']);
      $kurv->setAntalVarer($basket['antalVarer']);
      while(list($nogle,$vardi) = each($basket)) {
        if($nogle <> "samletPris" && $nogle <> "antalVarer") {
          $kurv->addVarelinie($nogle,$vardi);
        }
      }
    }
    return $kurv;
  } // function loadKurv

  // Funktion der gemmer kurv i session. Kurven laves om til array, da der er problemer
  // med at gemme komplekse objekter i session
  function saveKurv($kurv) {
    $sessionArray['samletPris'] = $kurv->getSamletPris();
    $sessionArray['antalVarer'] = $kurv->getAntalVarer();
    $varelinier = $kurv->getVarelinier();
    echo(print_r($varelinier)."---Varelinier før SAVE!<br>");
    for($i=0;$i<count($varelinier);$i++) {
      $varelinie = $varelinier[$i];
      $sessionArray[$varelinie->getVareid()] = $varelinie->getAntal();
      echo("Jeg har nu gemt ".$varelinie->getVareid()." med antal: ".$varelinie->getAntal()."<br>");
    }
    $_SESSION['sessionBasket'] = $sessionArray;
  } // function saveKurv


kurvTest.php
------------
<?php
  include_once("top.php");
?>
Dette tester om kurven virker!<br>
<br>
<?php
  $varelinier = $kurv->getVarelinier();
  for($i=0;$i<count($varelinier);$i++) {
    $varelinie = $varelinier[$i];
    echo("Der findes en vare med vareid: ".$varelinie->getVareid()."....Antal: ".$varelinie->getAntal()."<br>");
  }

  $kurv->addVarelinie(186,2);
  $kurv->addVarelinie(187,3);
  echo("Antal varer: ".$kurv->getAntalVarer()."<br>");
  echo("Samlet pris: ".$kurv->getSamletPris()."<br>");
  saveKurv($kurv);
  $varelinier = $kurv->getVarelinier();
  for($i=0;$i<count($varelinier);$i++) {
    $varelinie = $varelinier[$i];
    echo("Der findes en vare med vareid: ".$varelinie->getVareid()."....Antal: ".$varelinie->getAntal()."<br>");
  }

?>


Mit problem er at mine varelinier ikke bliver gemt, de forsvinder allerede imellem de to $kurv->addVarelinie?!?!

Output fra skærm:
-----------------
Dette tester om kurven virker!

Jeg opretter ny varelinie.......vareid: 186....antal: 2
Array ( [186] => varelinie Object ( [vareid] => 186 [antal] => 2 ) ) 1----addVarelinie slut
Samlet pris:
Antal varer: 0
Jeg opretter ny varelinie.......vareid: 187....antal: 3
Array ( [187] => varelinie Object ( [vareid] => 187 [antal] => 3 ) ) 1----addVarelinie slut
Samlet pris:
Antal varer: 0
Antal varer: 0
Samlet pris:
Array ( ) 1---Varelinier før SAVE!

Jeg håber en eller anden kan hjælpe mig...
Avatar billede erikjacobsen Ekspert
15. september 2004 - 00:27 #1
Du kopierer dine variabler med fx
  $varelinier = $this->getVarelinier();
så $varelinier ikke er den samme variabel som $this->varelinier
Du bør - i første omgang i hvert fald - arbejde direkte på $this->varelinier
Avatar billede erikjacobsen Ekspert
15. september 2004 - 00:30 #2
Læs evt siderne der linkes til på http://www.php.net/manual/en/language.references.php
Avatar billede astengaard Nybegynder
15. september 2004 - 16:11 #3
Jeg har rettet det du foreslog, Erik, og jeg har være inde og læse på den side du linker til, men jeg kan stadig ikke få det til at virke.

Helt præcist drejer det sig om nogle få linier, hvor jeg åbenbart arbejder på en kopi, så værdierne ikke bliver gemt.

I kurvTest.php har jeg følgende to linier:
  $kurv->addVarelinie(186,2);
  $kurv->addVarelinie(187,3);
Og med echo kan jeg se, at det der sker i første linie ikke er gemt når anden linie køres...

AddVarelinie ser således ud:

    // Tilføjer $antal varer med $vareid. Hvis varen er i kurven i forvejen, så øges antallet med $antal ellers oprettes varelinien.
    function addVarelinie($vareid, $antal) {
      $varelinier = $this->varelinier;
      if(array_key_exists($vareid,$varelinier)) {
        $varelinie &= $varelinier[$vareid];
        $nuAntal = $varelinie->getAntal();
        $varelinie->setAntal($nuAntal + $antal);
        $varelinier[$vareid] = $varelinie;
      } else {
        $varelinie = new Varelinie($vareid, $antal);
        $varelinier[$vareid] = $varelinie;
      }
      $this->antalVarer = $this->calculateAntal();
      $this->samletPris = $this->calculatePris();
    } // function addVarelinie

En eller anden please fortæl mig, hvor det går galt...
Avatar billede erikjacobsen Ekspert
15. september 2004 - 18:47 #4
Du tager en kopi i
    $varelinier = $this->varelinier;
men du skal bruge
  $this->varelinier
i stedet for $varelinier.
Avatar billede astengaard Nybegynder
23. september 2004 - 13:56 #5
Jeg har lige haft tryk på et par dage.
Jeg har fået det til at virke nu.
Men jeg skal vist have læst lidt mere på referencer...
Erik, kan du anbefale noget bestemt litteratur, eller er linket det bedste sted at starte?
Kan du ikke lige lægge et svar, så du kan få dine velfortjente point?
Avatar billede erikjacobsen Ekspert
23. september 2004 - 14:12 #6
Avatar billede astengaard Nybegynder
04. oktober 2004 - 15:39 #7
Tak for hjælpen, Erik
Jeg lukker spm.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester