Avatar billede Slettet bruger
13. januar 2003 - 17:45 Der er 8 kommentarer og
1 løsning

Cookie

Hejsa eksperter.

Jeg sidder med et afstemnings system. Det fungere ganske udemærket. Den logger brugerens ip, sådan at de ikke kan stemme igen. Problemet er blot, at da mange danskere køre med dynamisk ip, kan de efter at have genstartet computeren stemme igen.

Derfor vil jeg gerne have lagt en cookie funktion ind også. Cookien skal forsvinde efter 7 dage, problemet er blot at jeg ikke ved hvor jeg skal ligge denne funktion ind henne.


Koden på den side der viser afstemningen eller resultaterne er her:

<?php
function head() {
include('vote_config.php');
echo "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">
<tr><td>
<table width=\"98\" border=\"0\" cellpadding=\"0\" cellspacing=\"\">
<tr><td bgcolor=\"$bgcolor\">";
}
function foot () {
echo "</td></tr></table></td></tr></table>";
}
function record($REMOTE_ADDR) {
include('vote_config.php');
$fp=fopen("$ip_file", "a+");
fputs ($fp,$REMOTE_ADDR."][".time()."\n");
fclose($fp);
}
function check($REMOTE_ADDR) {
include('vote_config.php');
global $valid;
$ip=$REMOTE_ADDR;
$data=file("$ip_file");
$now=time();
foreach ($data as $record) {
$subdata=explode("][",$record);
if ($now < ($subdata[1]+3600*$timeout)) {
if ($ip == $subdata[0]) {
$valid=0;
break;
}}}}
//##################### Save data ##############################
function save($answer){
global $answer;
include('vote_config.php');
$data=file($datafile);
$subdata=explode("][",$data[$answer]);
$subdata[2]+=1;
$data[$answer]=implode("][", $subdata);
$data[$answer]=$data[$answer]."\n";
$fp=fopen($datafile,"w+");
$a=0;
do{
fputs($fp,$data[$a]);
$a++;
}while($a<count($data));
fclose($fp);
}
//########################## Show Form ############################
function form($PHP_SELF){
include('vote_config.php');
head();
echo "<font size=\"$fontsize\" face=\"$font\" color=\"$textcolor\"><OBJECT><form method=\"post\" action=\"$PHP_SELF\">";
$data=file($datafile);
$question=$data[0];
$nb_options=count($data)-1;
echo "<b>$question</b><BR>";
for($nb=1;$nb <= $nb_options; $nb++){
$option=explode("][","$data[$nb]");
echo "<input type=\"radio\" name=\"answer\" value=\"$nb\"> ";
echo "$option[0]<br>";
}
echo "<input type=\"hidden\" name=\"save\" value=\"yes\">";
echo "<p align=\"center\"><input class=\"stem\" type=\"submit\" name=\"Submit\" value=\"Stem\"></form></object></font>";
echo "<font size=\"$fontsize\" face=\"$font\" color=\"$textcolor\"><a href=\""; echo $PHP_SELF; echo "?action=results\">Se stemmer</a></font>";
foot();
}
//################## Function to show results ########################
function results(){
include('vote_config.php');
head();
$data=file($datafile);
$nb_answers=count($data);
$votes=0;
$a=1;
do{
$subdata=explode("][",$data[$a]);
$votes += $subdata[2];
$a++;
}while($a < $nb_answers);
$a=1;
$b="answerv";
$v=100/$votes;
echo "<font size=\"$fontsize\" face=\"$font\" color=\"$textcolor\"><b>$data[0]</b><br><br>";
do{
$subdata=explode("][",$data[$a]);
$av = $subdata[2] * $v;
echo "<font size=\"$fontsize\" face=\"$font\" color=\"$textcolor\">$subdata[0] -"; printf(" %01.1f", $av); echo"%<br>";
$p2v = 100-$av;

$a++;
} while ($a < $nb_answers);
echo "<br> $votes stemmer";
foot();
}
//###################### Engine ####################################
check($REMOTE_ADDR);
if ($valid=="0"){ results();}
elseif ($action=="results") { results(); }
elseif ($save=="yes" && $valid!="0") { save($Answer); record($REMOTE_ADDR); results(); }
elseif ($action=="save" && !empty($valid)) { results(); }
elseif ($action!="save" && $valid!="0"){ form($PHP_SELF); }
?>
Avatar billede angam Nybegynder
13. januar 2003 - 17:51 #1
Placer SetCookie i din Save() funktion. Husk blot at du ikke må lave noget output for setCookie() bliver kaldt (echo, htmlkode etc.)

expireValue er en konstant med den tid Cookien skal "holde" sig (i sekunder).

// 60 (sekunder) * 60 (minutter) * 24 (timer) * 7 (dage)
define('expireValue', 60*60*24*7);

function save($answer){
global $answer;
setCookie('votecookie', $answer, (time() + expireValue));
[...]
Avatar billede angam Nybegynder
13. januar 2003 - 17:53 #2
.. nu skal du blot lave et check på om Cookien eksisterer.
Lidt afhængig af om register_globals er on eller off, kan du bruge:
if(isset($votecookie)) {
  //  Cookie er sat (=bruger har stemt)
}
Avatar billede Slettet bruger
13. januar 2003 - 18:13 #3
register_globals er sat til on.

kan du give et eksempel med den kode jeg kom med? hvor du sætter cookie koden ind?
Avatar billede angam Nybegynder
13. januar 2003 - 18:21 #4
Jeg prøver engang:

//##################### Save data ##############################
// 60 (sekunder) * 60 (minutter) * 24 (timer) * 7 (dage)
define('expireValue', 60*60*24*7);

function save($answer){
global $answer;
setCookie('votecookie', $answer, (time() + expireValue));
include('vote_config.php');
$data=file($datafile);
$subdata=explode("][",$data[$answer]);
$subdata[2]+=1;
$data[$answer]=implode("][", $subdata);
$data[$answer]=$data[$answer]."\n";
$fp=fopen($datafile,"w+");
$a=0;
do{
fputs($fp,$data[$a]);
$a++;
}while($a<count($data));
fclose($fp);
}


}
function check($REMOTE_ADDR) {
include('vote_config.php');
global $valid;

if(isset($_COOKIE["votecookie"])) {
  valid=0;
  break;
}

$ip=$REMOTE_ADDR;
$data=file("$ip_file");
$now=time();
foreach ($data as $record) {
$subdata=explode("][",$record);
if ($now < ($subdata[1]+3600*$timeout)) {
if ($ip == $subdata[0]) {
$valid=0;
break;
}}}}
Avatar billede angam Nybegynder
13. januar 2003 - 18:22 #5
Det skulle være nok at ændre disse to funktioner (check() og save()). Jeg er ikke 100% sikker på $_COOKIE-syntaxen (jeg bruger den ikke selv, da register_globals er OFF her).
Avatar billede Slettet bruger
13. januar 2003 - 18:34 #6
Hmm... jeg får bare en fejl:

Parse error: parse error, unexpected '}' in c:\apache\htdocs\madsstampe\vote_vis.php on line 54
Avatar billede angam Nybegynder
13. januar 2003 - 19:34 #7
Hvad er linie 54?
Avatar billede Slettet bruger
13. januar 2003 - 21:08 #8
linje 54 er } og det der kommer efter er function......

}
function check($REMOTE_ADDR) {
include('vote_config.php');
global $valid;
Avatar billede Slettet bruger
15. januar 2003 - 19:39 #9
Jeg fik det selv ordnet :)
Lavede lidt om i en anden afstemning jeg tidligere havde brugte:

øverst i index filen:

<?php ob_start();

$stemnu = $_SERVER["HTTP_REFERER"]; 

if($stem)
{
  setcookie("status","stemt",time()+86400);

  $counterfile = "$stem.txt";
  if(file_exists($counterfile))
    {
    $fil = fopen($counterfile,  "r");
    $count = fread($fil, 8);
    fclose($fil);
    }
  else
    $count=0;
    $count++;
    $fil = fopen($counterfile,  "w");
    fwrite($fil, $count);
    fclose($fil);

  header("Location: $stemnu");
  exit();
}

$fp = fopen("god.txt", r);
$god = fread($fp, filesize("god.txt"));
fclose($fp);

$fp = fopen("middel.txt", r);
$middel = fread($fp, filesize("middel.txt"));
fclose($fp);

$fp = fopen("darlig.txt", r);
$darlig = fread($fp, filesize("darlig.txt"));
fclose($fp);

$fp = fopen("ikke.txt", r);
$ikke = fread($fp, filesize("ikke.txt"));
fclose($fp);

?>

og siden

<?php

if($status == "stemt") {
echo "


        1. Hvordan er det nye layout i forhold til det gamle?
        <BR><BR>
        Resultatet er nu:
        <BR><BR>
          Bedre ( ";
            readfile("god.txt");
           
            echo "
              )
             
              <BR><BR>
             
              Det samme ( ";
            readfile("middel.txt");
           
            echo "
            stemmer )
           
            <BR><BR>
           
              D&aring;rligere ( ";
              readfile("darlig.txt");
             
              echo "
             
              stemmer )
             
              <BR><BR>
             
              Ved ikke ( ";
              readfile("ikke.txt");
             
              echo "
             
            stemmer )<BR><BR>

 
  ";
} else {
 
  echo "
  <table cellpadding=\"0\" cellspacing=\"0\"><tr bgcolor=\"#FFFFFF\"><td width=\"141\" height=\"400\" bgcolor=\"#B7C6D6\" valign=\"top\" align=\"left\"></td><td width=\"466\" height=\"400\" bgcolor=\"#FFFFFF\" valign=\"top\"><div align=\"center\"><p><font face=\"Verdana\" size=\"1\"><br><font size=\"2\">1. Hvordan er det nye layout i forhold til det gamle?</font></font></p><form action=\"$stemnu\" method=\"post\"><font face=\"verdana\" size=\"1\"></font><table width=\"103\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr><td><font face=\"verdana\" size=\"1\"><input type=\"hidden\" name=\"cookie\" value=\"stem\"><input type=\"Radio\" name=\"stem\" value=\"god\">Bedre</font></td></tr><tr><td><font face=\"verdana\" size=\"1\"><input type=\"Radio\" name=\"stem\" value=\"middel\">Det samme</font></td>
 
   
  </tr><tr><td><font face=\"verdana\" size=\"1\"><input type=\"Radio\" name=\"stem\" value=\"darlig\">Dårligere </font></td></tr><tr><td><font face=\"verdana\" size=\"1\"><input type=\"Radio\" name=\"stem\" value=\"ikke\">Ved ikke</font></td></tr><tr><td><font face=\"verdana\" size=\"1\"><input type=\"submit\" value=\"Stem\" class=\"css\" name=\"submit\"></font></td></tr></table></div></td></tr></table>";
 
 
}


?>
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