Avatar billede dizzim Nybegynder
17. oktober 2004 - 21:42 Der er 23 kommentarer og
1 løsning

tjeck Cookie + lav Cookie

Okay, måske ikk den mest beskrivende titel men here it goes:
Jeg har lavet et rating system, men jeg vil kun have at folk kan stemme en gang. Jeg har tænkt mig at gøre dette med cookies, men hvordan?
mit system fungere på følgende måde:
Ud for alle de items som folk skal kunne rate er der en lille form som indeholder 2 felter, et usynligt felt med item'ets id nummer og en option box hvor man kan vælge mellem ratings fra 1 til 5.
Når man så trykke submit kommer man hen på en side som nu ligger ens rating ind i en database.
Men før den gør det vil jeg gerne have den til at tjekke brugerens computer for itemets id i en cookie. Hvis den finder den cookie skal den ikke ligge det ind i database men bare sige at man allerede har stemt. Og hvis den ikke finde id nummert i en cookie skal den sende en cookie til brugeren som indeholder item'ets id nr.
Men hvordan???
Jeg har ikke brugt cookies før og de tutorials jeg har kunnet finde har være cappy...

+ en anden ting. kan man gemme flere værdier i en cookie?
kan man gemme arrays i cookies?

På forhånd tak for hjælpen!
Avatar billede coderdk Praktikant
17. oktober 2004 - 22:09 #1
Lad brugeren have én cookie med en for for ID, gem denne sammen med dine andre informationer om brugerens rating.

Er folk anonyme? Så find på en måde at lave denne ID... Kunne være deres nuværende IP og tiden lige nu smidt igennem en md5()...

Er folk logget på? Drop det med cookien, og gem deres userid sammen med informationerne ;)

Ja, du kan gemme arrays osv i en cookie ;)
Avatar billede coderdk Praktikant
17. oktober 2004 - 22:10 #2
Skulle stå:
"Lad brugeren have én cookie med en form for ID" - missede lige m'et dér ;)
Avatar billede dizzim Nybegynder
17. oktober 2004 - 22:18 #3
Jeg havde nu tænkt mig at gøre det med cookies, mest for at lære at bruge dem. Men også for at holde db-størrlsen nede. Derfor vil jeg gerne have noget kode + lidt forklarring eller bare et par comments til koden...
Hvis man godt kan lave arrays i cookies kan man så ikk bare ligge et array med alle de ratede items id nr. i og så tjekke om det item som man vil stemme på matcher nogle af de id nr. der er i arrayet?
Så hvad vil koden være i et tilfælde som mit?
Avatar billede dizzim Nybegynder
17. oktober 2004 - 22:19 #4
btw. dit svar er på sin hvis rigtigt nok. men jeg skulle nok ha formuleret mit spg. lidt bedre...
Avatar billede coderdk Praktikant
17. oktober 2004 - 22:39 #5
F.eks.

if ( isset( $_COOKIE['ratedids'] ) )
{
  $ratedids = $_COOKIE['ratedids'];
}
else
{
  $ratedids = array();
}

if ( in_array( $nytid, $ratedids ) )
{
  // bruger har stemt
}
else
{
  $ratedids[] = $nytid;
}

setcookie( "ratedids", $ratedids, strtotime( "+1 year" ) );
Avatar billede coderdk Praktikant
17. oktober 2004 - 22:40 #6
Husk at setcookie() skal kaldes FØR der kommer noget som helst ud på siden ;)
Avatar billede dizzim Nybegynder
18. oktober 2004 - 14:00 #7
Okay, jeg er lidt på bar bund. Er det muligt du kan komme med noget hjælp i form af nogle kommentare til hvad det er du gør. For jeg kan ikk helt finde rundt i de variabler du bruger? som fx.:
$ratedids = $_COOKIE['ratedids'];
er $ratedids id'en af det item man prøver at rate?

Som sagt har jeg ikke brugt cookies før så det giver for mig ingen mennig, så hvis du kunne forklare hvad det er du gør kan jeg teste og prøve at se om det virker.
Avatar billede coderdk Praktikant
18. oktober 2004 - 17:05 #8
$ratedids indeholder alle de ID'er som brugeren har rated før...
$nytid er så det ID som brugeren vil rate nu, denne skal så tilføjes til $ratedids når han har rated.
Avatar billede dizzim Nybegynder
18. oktober 2004 - 21:02 #9
Jeg fatter som sagt ikke helt logikken i din kode men jeg har prøvet bare at copy paste den ind, det ser sådan her ud:
(Det virker dog ikk, der kommer bare en tom side frem, min kode til selve ratingen er rigtig nok)

<?php
    setcookie( "ratedids", $ratedids, strtotime( "+1 year" ) );
   
    $nytid = $_REQUEST["voted_joke_id"];
   
    if ( isset( $_COOKIE['ratedids'] ) )
    {
      $ratedids = $_COOKIE['ratedids'];
    }
    else
    {
      $ratedids = array();
    }
   
   
    if ( in_array( $nytid, $ratedids ) )
    {
              $connection = mysql_connect("localhost", "user", "pass");
        mysql_select_db("db");
        $result = mysql_query("SELECT * FROM `jokes` WHERE jokeid = '$voted_joke_id' LIMIT 1");
        while ($row = mysql_fetch_array($result)) {
              extract($row);
   
            $original_votes = "$votes";
            $original_total_rating = "$total_rating";
           
                                                  }
        mysql_close($connection);
       
        echo "Proces: former joke stats reading completed...<br>NOW: Calculating...";

    $voted_rating = $_REQUEST["rating"];
   
   
        $new_votes = $original_votes + 1;
        $new_total_rating = $original_total_rating + $voted_rating;
   
    if ($new_votes == 1) {
        $new_rating = $voted_rating;
    } else {
        $new_rating = $new_total_rating / $new_votes;
    }
   
        $connection2 = mysql_connect("localhost", "user", "pass");
        mysql_select_db("db");
        $result = mysql_query("UPDATE `jokes` SET `total_rating` = '$new_total_rating',`rating` = '$new_rating',`votes` = '$new_votes' WHERE jokeid = '$voted_joke_id';") or die(mysql_error());
       
        mysql_close($connection2);
       
        echo "<br> tak for din stemme";
       
    }
    else
    {
      $ratedids[] = $nytid;
    }
   
?>

Hvad skal jeg gøre anderledes for at få det til at virke???
Avatar billede dizzim Nybegynder
18. oktober 2004 - 21:05 #10
hov, lavede en mindre fejl.. jeg har ændret $nytid til $voted_joke_id så det passer nd i min kode.
Avatar billede coderdk Praktikant
18. oktober 2004 - 21:24 #11
// Nedenstående skal bare i toppen som du har gjort
if ( isset( $_COOKIE['ratedids'] ) )
{
  $ratedids = $_COOKIE['ratedids'];
}
else
{
  $ratedids = array();
}


if ( in_array( $voted_joke_id, $ratedids ) )
{
  // Her skal kode hvis brugeren ALLEREDE HAR stemt på denne og ikke må stemme igen
}
else
{
  // Brugeren har IKKE stemt på denne før; så lav dine databaseting hér!
  $ratedids[] = $voted_joke_id;
}

// Denne skal bare i bunden
setcookie( "ratedids", $ratedids, strtotime( "+1 year" ) );
Avatar billede dizzim Nybegynder
18. oktober 2004 - 21:57 #12
de virker delvist..
Borset fra den sidste linie, altså din cookie:
Warning: setcookie() expects parameter 2 to be string, array given in "bla bla bla" on line 56

line 56: setcookie( "ratedids", $ratedids, strtotime( "+1 year" ) );
Avatar billede dizzim Nybegynder
18. oktober 2004 - 22:00 #13
Bare for at give et overblik:

<?php

    $voted_joke_id = $_REQUEST["voted_joke_id"];
   
    if ( isset( $_COOKIE['ratedids'] ) )
    {
      $ratedids = $_COOKIE['ratedids'];
    }
    else
    {
      $ratedids = array();
    }
   
   
    if ( in_array( $voted_joke_id, $ratedids ) )
    {
      echo "du har allerede stemt!";
    } else {
   
        $connection = mysql_connect("localhost", "user", "pass");
        mysql_select_db("db");
        $result = mysql_query("SELECT * FROM `jokes` WHERE jokeid = '$voted_joke_id' LIMIT 1");
        while ($row = mysql_fetch_array($result)) {
              extract($row);
   
            $original_votes = "$votes";
            $original_total_rating = "$total_rating";
           
                                                  }
        mysql_close($connection);
       
    $voted_rating = $_REQUEST["rating"];
   
   
        $new_votes = $original_votes + 1;
        $new_total_rating = $original_total_rating + $voted_rating;
   
    if ($new_votes == 1) {
        $new_rating = $voted_rating;
    } else {
        $new_rating = $new_total_rating / $new_votes;
    }
   
        $connection2 = mysql_connect("localhost", "user", "pass");
        mysql_select_db("db");
        $result = mysql_query("UPDATE `jokes` SET `total_rating` = '$new_total_rating',`rating` = '$new_rating',`votes` = '$new_votes' WHERE jokeid = '$voted_joke_id';") or die(mysql_error());
       
        mysql_close($connection2);
       
        echo "<br> tak for din stemme";
       
      $ratedids[] = $voted_joke_id;
    }   
setcookie( "ratedids", $ratedids, strtotime( "+1 year" ) );
?>
Avatar billede coderdk Praktikant
18. oktober 2004 - 22:01 #14
heh ok, my bad, den understøtter kun strenge faktisk ;D Men easy - det kan fixes, ædr:

$ratedids = $_COOKIE['ratedids'];

til

$ratedids = unserialize( $_COOKIE['ratedids'] );

og

setcookie( "ratedids", $ratedids, strtotime( "+1 year" ) );

til:

setcookie( "ratedids", serialize( $ratedids ), strtotime( "+1 year" ) );

Så burde det virke
Avatar billede coderdk Praktikant
18. oktober 2004 - 22:02 #15
Eller alternativt, og muligvis bedre:

$ratedids = $_COOKIE['ratedids'];

til

$ratedids = explode( ",", $_COOKIE['ratedids'] );

og

setcookie( "ratedids", $ratedids, strtotime( "+1 year" ) );

til:

setcookie( "ratedids", implode( ",", $ratedids ), strtotime( "+1 year" ) );

:)
Avatar billede dizzim Nybegynder
18. oktober 2004 - 22:05 #16
hmmm.. flere probs..
Warning: Cannot add header information - headers already sent by (output started at "bla bla bla" on line 56

line 56: setcookie( "ratedids", serialize( $ratedids ), strtotime( "+1 year" ) );
Avatar billede coderdk Praktikant
18. oktober 2004 - 22:07 #17
Det er fordi du skriver noget ud, før du bruger setcookie() ;)
Avatar billede coderdk Praktikant
18. oktober 2004 - 22:07 #18
Evt tilføj i starten af scriptet:

ob_start();

og i bunden

ob_end_flush();

Så burde den spise den setcookie() selvom der bliver skrevet noget ud før
Avatar billede dizzim Nybegynder
18. oktober 2004 - 22:14 #19
yay :D det fungere..

bortset fra hvis man allerede har stemt en gang og prøver at stemme igen. Så kommer der en fejl i koden.

Warning: Wrong datatype for second argument in call to in_array in "bla bla bla" on line 16

line 16: if ( in_array( $voted_joke_id, $ratedids ) )

og stemmen bliver alligevel godtaget.
Avatar billede coderdk Praktikant
18. oktober 2004 - 22:17 #20
Hvad har du i toppen af scriptet nu? $ratedids = ?hvad?
Avatar billede dizzim Nybegynder
18. oktober 2004 - 22:20 #21
<?php
    ob_start();

    $voted_joke_id = $_REQUEST["voted_joke_id"];
   
    if ( isset( $_COOKIE['ratedids'] ) )
    {
      $ratedids = unserialize( $_COOKIE['ratedids'] );
    }
    else
    {
      $ratedids = array();
    }
   
   
    if ( in_array( $voted_joke_id, $ratedids ) )
    {
      echo "du har allerede stemt!";
    } else {

database stuff

echo "<br> tak for din stemme";
       
      $ratedids[] = $voted_joke_id;
    }   
setcookie( "ratedids", serialize( $ratedids ), strtotime( "+1 year" ) );
   
    ob_end_flush();
?>
Avatar billede coderdk Praktikant
18. oktober 2004 - 22:41 #22
start lige med at sætte:

setcookie( "ratedids" );
exit;

i toppen af scriptet - så fjerner vi lige den cookie fra din maskine.
Når du har kørt det script, så fjerner du bare de to linjer igen.

Ændr så:

$ratedids = unserialize( $_COOKIE['ratedids'] );

til

$ratedids = explode( ",", $_COOKIE['ratedids'] );

og

setcookie( "ratedids", serialize( $ratedids ), strtotime( "+1 year" ) );

til

setcookie( "ratedids", implode( ",", $ratedids ), strtotime( "+1 year" ) );

Så burde det virke, og lidt "pænere"... :)
Avatar billede dizzim Nybegynder
19. oktober 2004 - 17:50 #23
Weee :D.
Alt for godt! det virker.
Tusind tak! Bar' lig et svar og pointene er dine!
Avatar billede coderdk Praktikant
20. oktober 2004 - 13:39 #24
Værsågod :)
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