Avatar billede Slettet bruger
28. oktober 2011 - 17:02 Der er 12 kommentarer og
1 løsning

Opdatering af cookie som indeholder et class-objekt

Hej!

Jeg arbejder pt på et simpelt projekt hvor jeg skal kunne tilføje nogle brugere og gemme deres oplysninger i en cookie. Jeg kan imidlertid ikke få det til at fungere. Den første bruger der tilføjes virker fint, men hvis tilføjer en mere går det galt (den nye bruger tilføjes ikke til cookie).

Kort fortalt går projektet ud på at hente information fra en RSS-feed og lave et score board over hvilken bruger der har satset bedst på nogle nfl kampe.

Jeg har følgende kode


include("functions.php"); //indeholder mine class' og nogle andre funktioner.

if( !isset($_SESSION["games"]) ){ startRSS(); }

$games = unserialize($_SESSION["games"]); // Info om kampe


// Herunder behandles info fra form
$name = $_POST["name"];

foreach( $games as $game){
    $picks[$game->getID()] = $_POST[$game->getID()]["team"];
    $points[$game->getID()] = $_POST[$game->getID()]["point"];
}


// Herunder leges der med cookies
if(isset($_COOKIE["users"])){
    $users = unserialize( $_COOKIE["users"] );
    $users[] = new User($name, $picks, $points);
    $var = serialize($users);
    setcookie("users", $var, time()+3600*24*5);   
}
else {   
    $users = array();
    $users[] = new User($name, $picks, $points);
    setcookie("users", serialize($users), time()+3600*24*5);
}

header("Location: index.php");

Så mit spørgsmål er, om der er nogen, der kan se hvor det går galt?
Avatar billede Slettet bruger
28. oktober 2011 - 17:06 #1
En beta kan forresten findes på: http://www.nfl.21752754.dk
Avatar billede olebole Juniormester
28. oktober 2011 - 17:21 #2
<ole>

Hvad giver det dig af informationer, hvis du prøver at skrive dine forskellige variabler ud?

/mvh
</bole>
Avatar billede olebole Juniormester
28. oktober 2011 - 17:24 #3
Har jeg misforstået noget? Såvidt, jeg kan se, indeholder din cookie et array - ikke et objekt ... eller?
Avatar billede Slettet bruger
28. oktober 2011 - 17:43 #4
#3 Du har ret - min cookie indeholder et array af objekter (har en class der hedder user og mit users-array indeholder så alle brugerne).

#2 Håber dette er tydeligt

Uddrag af koden.

// Herunder leges der med cookies
if(isset($_COOKIE["users"])){
    $users = unserialize( $_COOKIE["users"] ); //Får et fuldt funktionelt array med et bruger-objekt.

    $users[] = new User($name, $picks, $points); //To bruger-objekter i arrayet

    $var = serialize($users); // En forfærdelig lang streng som er som den skal være. Virker hvis jeg gemmer den i en session i stedet.

    setcookie("users", $var, time()+3600*24*5);   
}
else {   
    $users = array();  // Samme som ovenfor.
    $users[] = new User($name, $picks, $points);
    setcookie("users", serialize($users), time()+3600*24*5);
}


På min index-side (der hvor resultaterne bliver vist) indeholder min cookie kun strengen fra mit bruger-array med ét bruger-objekt i. Med andre ord, så er det som om min cookie ikke bliver opdateret hvis der tilføjes mere end en bruger.
Så "else"-delen ovenover virker, men "if"-delen virker ikke. Ved ikke om man kan overskrive en allerede eksisterende cookie ved blot at bruge setcookie igen med samme navn?
Håber det kunne kaste lidt lys over det.
Avatar billede Slettet bruger
28. oktober 2011 - 17:44 #5
Forresten, så har jeg ledt herinde efter et tag så man kan skrive kode i sine post, men kan ikke finde det. Nogen der kunne være behjælpelige med det?
Avatar billede Slettet bruger
28. oktober 2011 - 17:51 #6
En anden ting som måske er lidt relevant: det script jeg har postet kaldes hver gang der tilføjes en bruger.
Så min cookie skal opdateres hver gang der tilføjes en bruger.
Avatar billede olebole Juniormester
28. oktober 2011 - 17:52 #7
Her er en samling af BB-koder for Eksperten. Her er en editor til BB-koder, der kører i Ekspertens interface - når nu IDG ikke gider implementere en editorbar.

Hvad udskrives, hvis du skriver:


else {   
    $users = array();  // Samme som ovenfor.
    $users[] = new User($name, $picks, $points);
    var_dump($users);
    setcookie("users", serialize($users), time()+3600*24*5);
}

Avatar billede Slettet bruger
28. oktober 2011 - 18:29 #8
Tak for det.

Den skriver noget i stil med:

array
  0 =>
    object(User)[16]
      private 'name' => string '' (length=0)
      private 'picks' =>
        array
          '49f27be19d22208f8502be8ba9b8753e' => string 'team1' (length=5)
          '70c6b062a0fdeeb76e3c3938afdc4313' => string 'team1' (length=5)
          '36ac12c4256ef508ab44c7b3a0c8bf97' => string 'team1' (length=5)
          '2945e227cc4c630dec4baef857a310da' => string 'team1' (length=5)
          '60e1b0c999237444e34dd942f397f1ff' => string 'team1' (length=5)
          'e0bfb8f0e901b62643620b150d7c589a' => string 'team1' (length=5)
          '39a782bc8ba6d72ec231199fa343be8f' => string 'team1' (length=5)
          '0159ae74481c3fde0420d50230332248' => string 'team1' (length=5)
          '3240388cfed7d4db0c47331bd22880ca' => string 'team1' (length=5)
          '6ce9171777ebfce6510f66ec17cc6f9e' => string 'team1' (length=5)
          'c3831896954b52bc462f1f2fde52240d' => string 'team1' (length=5)
          '2ce38b8638aea60582d8a33319cfeb0d' => string 'team1' (length=5)
          '79dba3530acf6ce062a25a3eb020f4b9' => string 'team1' (length=5)
      private 'points' =>
        array
          '49f27be19d22208f8502be8ba9b8753e' => string '' (length=0)
          '70c6b062a0fdeeb76e3c3938afdc4313' => string '' (length=0)
          '36ac12c4256ef508ab44c7b3a0c8bf97' => string '' (length=0)
          '2945e227cc4c630dec4baef857a310da' => string '' (length=0)
          '60e1b0c999237444e34dd942f397f1ff' => string '' (length=0)
          'e0bfb8f0e901b62643620b150d7c589a' => string '' (length=0)
          '39a782bc8ba6d72ec231199fa343be8f' => string '' (length=0)
          '0159ae74481c3fde0420d50230332248' => string '' (length=0)
          '3240388cfed7d4db0c47331bd22880ca' => string '' (length=0)
          '6ce9171777ebfce6510f66ec17cc6f9e' => string '' (length=0)
          'c3831896954b52bc462f1f2fde52240d' => string '' (length=0)
          '2ce38b8638aea60582d8a33319cfeb0d' => string '' (length=0)
          '79dba3530acf6ce062a25a3eb020f4b9' => string '' (length=0)
      private 'winPoints' =>
        array
          empty


Som det ses er det en rimelig lang streng der gemmes i min cookie. Har fundet ud af at det virker fint hvis strengen bliver kortere - det går galt når strengen er mere end 2225 characters lang. Er der en begrænsning på hvor meget information man kan gemme i sin cookie?
Avatar billede Slettet bruger
28. oktober 2011 - 18:39 #9
Her er en forsimplet udgave af den kode jeg har lavet. Dette virker efter hensigten og tilføjer et objekt til arrayet hver gang siden opdateres. Det stopper dog med at virker efter ca. 50 opdateringer. Hvorfor?

class Cls{
    private $var;
   
    function __construct($var) { $this->var = $var; }
    function getVar() { return $var; }
}


if(isset($_COOKIE["test"])){
    $test = unserialize($_COOKIE["test"]);
}
else{
    $test = array();
}
$test[] = new Cls( rand(0,1000) );

setcookie("test", serialize($test), time()+3600*24*5);

echo strlen($_COOKIE["test"]);

var_dump($test);
Avatar billede olebole Juniormester
28. oktober 2011 - 19:40 #10
"Er der en begrænsning på hvor meget information man kan gemme i sin cookie?" - i princippet nej. I praksis er det dog op til browserleverandøren. IE's kager kan således rumme 4096 bytes (incl. udløbsinfo, etc) - hvilket svarer til en streng på ca. 2000 tegn i et utf-8 miljø.

Når du er oppe på store datamængder, som tilfældet er, er cookies ikke hensigtsmæssige. Brug en DB i stedet  =)
Avatar billede Slettet bruger
29. oktober 2011 - 15:15 #11
Jamen så lader det til at jeg skal finde mig en anden løsning. Grunden til at jeg valgte at bruge en cookie var for at undgå at skulle bruge en database.

Men kan vist også godt skrive min kode noget smartere end jeg har gjort lige nu, så den fylder meget mindre.

Tak for hjælpen, er blevet klogere på cookies. Hvis du vil have de 30 point for besværet så smid et svar :D
Avatar billede olebole Juniormester
29. oktober 2011 - 17:07 #12
Ellers tak, jeg samler ikke points. Læg selv et svar og accepter det, så tråden lukkes  =)

Cookies er udmærkede til småting (med tryk på 'små'), men du skal ikke ret højt op i datamængde, før DB er at foretrække
Avatar billede Slettet bruger
30. oktober 2011 - 12:34 #13
Hermed lukkes tråden.
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