Avatar billede kentclark Nybegynder
09. november 2010 - 13:56 Der er 14 kommentarer og
1 løsning

setcookie virker kun lokalt

Hej allesammen. Håber i kan hjælpe mig.
Jeg arbejder på et simpelt poll script hvor man først stemmer og så bliver der lavet en cookie så den samme ikke kan stemme igen. Og det virker sådan set også fint når jeg køre lokat, men når den kommer på nettet, bliver cookien ikke oprettet, og man kan bare blive ved med at stemme!

her er koden:
Hvor godt smager citroner??<br /><br />
<form method="post" action="<?php $_SERVER['PHP_SELF']?>">
<select name="select" size="1">
<option value="-1">Vælg venligst </option>
<option value="5">Excellent</option>
<option value="4">Very good</option>
<option value="3">Good</option>
<option value="2">Fair</option>
<option value="1">Bad</option>
</select>
<input type="submit" name="vote" value="Vote">
<input name="itemid" type="hidden" id="1" value="1">
</form>
<br />
<a href="index2.php?id=1">Se resultatet </a><br><br>


<?php
include"dbcon.php";
if(isset($_POST['vote']))
{
//get voting value;
$votevalue=$_POST['select'];
$id=$_POST['itemid'];
//a simple validation
if($votevalue == -1)
{
echo "Vælg venligst en muligehed fra dropdown boksen";

}else{

//cookie validation
if(isset($_COOKIE["vote$id"]))
{
echo "Tak for din stemme.... men du har stemt før";

}else{

//set cookie expired in 30 days.
setcookie("vote$id","v",time()+30*24*60*60);


//retrieve old voting result

        $query = mysqli_query($conn, "select votes,result from polling where itemid=$id");
                $result = mysqli_fetch_array($query);

$oldVote=$result['votes'];

$oldResult=$result['result'];

//calculate new result
$newVote=$oldVote+1;
$newResult=($oldVote*$oldResult+$votevalue)/$newVote;

//saving new result to database
$query = mysqli_query ($conn, "update polling set votes='$newVote', result='$newResult' where itemid='".$id."'");


echo "Tak for din stemme";

}
}
}
if(isset($_GET['id'])){
$id=$_GET['id'];


//retrievevoting result

$query = mysqli_query($conn, "select votes,result from polling where itemid=$id");
                $result = mysqli_fetch_array($query);

$votes=$result['votes'];

$voteResult=$result['result'];


//assign icons
$digit1 = substr( $voteResult,0,1); //get first digit;
$digit2 = substr( $voteResult,2,1); //the last digit;

$half="";
if (strcmp($digit2,"0") == 0 )
$half ="";
else
$half = "half";

echo "Hvor godt smager citroner?<br /><br />";
echo "<img src=\"images/$digit1$half.gif\"> <br><br>
$votes har stemt";
};
?>
Avatar billede webweaver Praktikant
09. november 2010 - 14:22 #1
Oprettes cookien ikke, eller kan du bare ikke fange den igen på sitet?

Prøv at regne tiden ud først. Evt. med en parantes.
setcookie("vote$id","v",time()+(30*24*60*60));

Og ellers prøv at smide facit ind, og så om det gør en forskel.
setcookie("vote$id","v",time()+ 2592000);
Avatar billede kentclark Nybegynder
09. november 2010 - 14:27 #2
cookien bliver slet ikke oprettet. når jeg køre lokalt bliver den lavet med den rigtige længde(30 dage) men på nettet sker der som sagt slet ingen ting
Avatar billede webweaver Praktikant
09. november 2010 - 14:32 #3
Forresten hvad er vote$id?
Er det meningen det skal munde ud i vote1?

Så kan det være du skal lave det i en variabel først,
$voteID = "vote" . $id;

setcookie("$voteID","v",time()+ 2592000);

Men egentlig ser jeg ikke $id som dynamisk, lige af hvad jeg kan se. Så kan vel bare skrive vote1 direkte i setcookie.
Avatar billede showsource Seniormester
09. november 2010 - 14:39 #4
setcookie() bør du ALTID bruge INDEN output til browser !
Og sæt altid gerne en path på også. Der er nogle browsere som ikke acceptere en cookie hvis ikke path er sat.

setcookie("cookienavn","value",(time()+2592000), "/");
her gælder cookie for hele domainet.
Avatar billede kentclark Nybegynder
09. november 2010 - 14:39 #5
nu har jeg prøvet at sætte den til bare vote1 og det ser ikke ud til at have ændret noget :-(
Avatar billede olsensweb.dk Ekspert
09. november 2010 - 14:40 #6
du burde få en fejl: header already sendt.

du sender <form method="post" action="<?php $_SERVER['PHP_SELF']?>"> ud til skærmen før du laver din set cookie

http://dk.php.net/setcookie
[cut]
setcookie() defines a cookie to be sent along with the rest of the HTTP headers. Like other headers, cookies must be sent before any output from your script (this is a protocol restriction). This requires that you place calls to this function prior to any output, including <html> and <head> tags as well as any whitespace.
[/cut]
Avatar billede kentclark Nybegynder
09. november 2010 - 14:57 #7
Jeg har nu prøvet at ændre det så cookien kommer først men der skete ikke noget. derefter prøvet jeg at fjerne alt kode undtagen setcookie for bare at sige at den skal lave en cookie når siden bliver vist. men her fik jeg samme resultat. nemlig at den bliver oprettet lokalt men der sker ingen ting på nettet!! måske er det ikke koden der fejler noget men browseren som ikke vil oprette en cookie. men det giver bare ingen mening :-(
Avatar billede webweaver Praktikant
09. november 2010 - 14:59 #8
PHP fejl er nok slået fra.
Men det vil forklare problemet.

Ryk dine if sætninger op i toppen af filen istedet.
Avatar billede webweaver Praktikant
09. november 2010 - 15:01 #9
Vær opmærksom på at man kan slå cookies fra i sin browser.
Men så burde det vel egentlig heller ikke virke lokalt. Eller hvad?
Avatar billede kentclark Nybegynder
09. november 2010 - 15:17 #10
jamen webweaver du havde ret med begge ting:-) php fejl var slået fra så jeg ikke kun se fejl meddelesen der kom. nu har jeg flyttet mine if op i toppen og det virker

1000 tak for hjælpen

skriv lige et svar for point
Avatar billede kentclark Nybegynder
09. november 2010 - 15:21 #11
nej det burde vel ikke virke lokalt!!
og det med cookie som er slået fra havde jeg tænkt på, men jeg vidste ikke helt hvordan jeg ellers skulle sikre mig at folk kun kan stemme en gang uden at de skulle være logget ind eller ligende
Avatar billede webweaver Praktikant
09. november 2010 - 16:14 #12
Det var godt at du fik det til at virke :)
Avatar billede Slettet bruger
09. november 2010 - 17:33 #13
Men, ak. Det forhindrer kun ærlige folk i at snyde.
- svindlerne sletter jo bare cookien, og stemmer igen.

Bedre at registrere brugerens iP-adresse (på serveren) men det er, faktisk, heller ikke helt godt,
da forskellige brugere godt kan have samme iP-adresse (udadtil)
- kollegaer i et firma f.eks. eller elever på en skole..

Jeg har desværre ikke LØSNINGEN
- men er stærkt interesseret, hvis der er andre der har den : )

iP + Email + "browser-footprint" som unik nøgle måske...?

I en løsning jeg engang var involveret i, lod vi bare folk snyde så meget de ville. Men slettede så alle gengangerne lige inden den endelige optælling. Efter den logik, at hvis snyderne troede at det var let at snyde så ville de ikke begynde at hacke "for alvor"...
Kan dog ikke prale med at det var nogen ubetinget success:
ENORMT meget snyderi, og totalt misvisende "mellemtider" inden den endelige afgørelse.
Avatar billede kentclark Nybegynder
09. november 2010 - 18:21 #14
Ja jeg har også prøvet det med ip men som du også selv siger er det ikke den perfekte løsning når brugere har samme ip..

jeg kender ikke lige den bedste løsning men tror bare jeg bruger cookies, for hvis folk virkelige vil snyde og sletter deres cookie for at stemme igen, er der ikke så meget at gøre ved det
Avatar billede webweaver Praktikant
09. november 2010 - 22:16 #15
Løsningen er at bruge cookies. Det er bare en poll.
IP løsning, er efter min vurdering overkill, og det er næsten lige så usikkert. 1. argument er som I nævner, at netværk kan sidde på samme IP. Men nu mere det at de fleste folk nu om dage har dynamisk IP, så den skifter alligevel og så kan de også stemme igen, hvis De har lyst.

Og alle de betingelser, IP, mail, cookie og hvad ved jeg på samme tid.. Ahh.. Det gider folk altså ikke taste ind, så lader de bare være med at stemme. Det er kun en afstemning. Og sådan er det bare :)
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