Avatar billede holckie Nybegynder
09. juni 2003 - 10:58 Der er 11 kommentarer og
2 løsninger

Setcookie ved afstemning?

Hej - HJÆLP :o/
Jeg er igang med at lave en afstemning i php. Det eneste der ikke virker, er der hvor scriptet skal undersøge via cookies, om brugeren allerede har stemt.

Linien den brokker sig over er den med "setcookie":

if ((!$har_stemt) && ($stemme)){
$har_stemt = 1;
setcookie("har_stemt", "1", time() + 1209600);

stem($stemme);
}

Der kommer følgende warning:
Cannot add header information - headers already sent by (output started at /home/httpd/vhosts/solbjerg-badminton.dk/httpdocs/afstemning.php:2) in /home/httpd/vhosts/solbjerg-badminton.dk/httpdocs/afstemning.php on line 27

Problemet er altså den warning og at man kan stemme igen og igen!
Avatar billede holckie Nybegynder
09. juni 2003 - 11:00 #1
HER ER HELE SCRIPTET:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<?
function hent_stemme($fil_endelse){
$filnavn = "stem" . $fil_endelse . ".txt";
$fil = fopen($filnavn, "r");
return fgets($fil, 1096);
fclose($fil);
}

function stem($fil_endelse){
$antal_stemmer = hent_stemme($fil_endelse) + 1;
$filnavn = "stem" . $fil_endelse . ".txt";
$fil = fopen($filnavn,"w");
fwrite($fil,$antal_stemmer);
fclose($fil);
}

function tegn_soejle($andel,$samlet){
$stemme_procent = $andel / $samlet * 100;
$stemme_procent = round($stemme_procent);
echo "$stemme_procent %";
echo "<IMG SRC=\"billed.gif\" HEIGHT=7 WIDTH=$stemme_procent BORDER=0>";
}

if ((!$har_stemt) && ($stemme)){
$har_stemt = 1;
setcookie("har_stemt", "1", time() + 1209600);

stem($stemme);
}
?>

<html>
<head>
<title>Afstemning</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" href="sifstyles.css" type="text/css">
</head>

<body bgcolor="#ACAD74">
<table border=0 width="300px">
<p>Var det efter din mening rigtigt at aflyse/udskyde VM i badminton i England?</p>
<?
$samlet_antal_stemmer = 0;
$tekst[1] = "<p>JA, helt bestemt</p>";
$tekst[2] = "<p>Måske</p>";
$tekst[3] = "<p>Ved ikke</p>";
$tekst[4] = "<p>Nej, det skulle være gennemført</p>";
for ( $fil_nr = 1 ; $fil_nr <= 4 ; $fil_nr++){
$stemmer[$fil_nr] = hent_stemme($fil_nr);
$samlet_antal_stemmer = $samlet_antal_stemmer + $stemmer[$fil_nr];
}

if ($har_stemt){
for ( $fil_nr = 1 ; $fil_nr <= 4 ; $fil_nr++){
echo "<tr><td>$tekst[$fil_nr]</td>";
echo"<td><p>";
tegn_soejle($stemmer[$fil_nr], $samlet_antal_stemmer);
echo "</p></td></tr>";
}
} else {
for ( $fil_nr = 1 ; $fil_nr <= 4 ; $fil_nr++){
echo "<tr><td><a href=\"$php_self?stemme=$fil_nr\">$tekst[$fil_nr]</a></td>";
echo "<td><a href=\"$php_self?stemme=$fil_nr\">";
tegn_soejle($stemmer[$fil_nr], $samlet_antal_stemmer);
echo "</a></td></tr>";
}
}
?>

</table>

</body>
</html>
Avatar billede melange Nybegynder
09. juni 2003 - 11:13 #2
Problemmet ligger i at setcookie() skal køres før du sender noget output OVERHOVEDET!

dvs, du skal lave om så setcookie kommer før:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
og
echo "$stemme_procent %";
echo "<IMG SRC=\"billed.gif\" HEIGHT=7 WIDTH=$stemme_procent BORDER=0>";
Avatar billede holckie Nybegynder
09. juni 2003 - 11:25 #3
Ok, men er det hele if-selektionen der skal flyttes?
if ((!$har_stemt) && ($stemme)){
$har_stemt = 1;
setcookie("har_stemt", "1", time() + 1209600);

stem($stemme);
}

Jeg har forsøgt at flytte den op foran de 3 funktioner og samtidig slette linien: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> ?
Avatar billede holckie Nybegynder
09. juni 2003 - 11:26 #4
Men jeg får stadig samme fejlmeddelelse når jeg har uploaded filen !?
Avatar billede ahv Nybegynder
09. juni 2003 - 11:36 #5
<?
function hent_stemme($fil_endelse) {
    $filnavn = "stem" . $fil_endelse . ".txt";
    $fil = fopen($filnavn, "r");
    return fgets($fil, 1096);
    fclose($fil);
}

function stem($fil_endelse) {
    $antal_stemmer = hent_stemme($fil_endelse) + 1;
    $filnavn = "stem" . $fil_endelse . ".txt";
    $fil = fopen($filnavn,"w");
    fwrite($fil,$antal_stemmer);
    fclose($fil);
}

function tegn_soejle($andel,$samlet) {
    $stemme_procent = $andel / $samlet * 100;
    $stemme_procent = round($stemme_procent);
    echo "$stemme_procent %";
    echo "<IMG SRC=\"billed.gif\" HEIGHT=7 WIDTH=$stemme_procent BORDER=0>";
}

if ((!$har_stemt) && ($stemme)) {
    $har_stemt = 1;
    setcookie("har_stemt", "1", time() + 1209600);
    stem($stemme);
}
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Afstemning</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" href="sifstyles.css" type="text/css">
</head>

<body bgcolor="#ACAD74">
<table border=0 width="300px">
<p>Var det efter din mening rigtigt at aflyse/udskyde VM i badminton i England?</p>
<?
$samlet_antal_stemmer = 0;
$tekst[1] = "<p>JA, helt bestemt</p>";
$tekst[2] = "<p>Måske</p>";
$tekst[3] = "<p>Ved ikke</p>";
$tekst[4] = "<p>Nej, det skulle være gennemført</p>";
for ( $fil_nr = 1 ; $fil_nr <= 4 ; $fil_nr++) {
    $stemmer[$fil_nr] = hent_stemme($fil_nr);
    $samlet_antal_stemmer = $samlet_antal_stemmer + $stemmer[$fil_nr];
}

if ($har_stemt) {
    for ( $fil_nr = 1 ; $fil_nr <= 4 ; $fil_nr++) {
        echo "<tr><td>$tekst[$fil_nr]</td>";
        echo"<td><p>";
        tegn_soejle($stemmer[$fil_nr], $samlet_antal_stemmer);
        echo "</p></td></tr>";
    }
} else {
    for ( $fil_nr = 1 ; $fil_nr <= 4 ; $fil_nr++) {
        echo "<tr><td><a href=\"$php_self?stemme=$fil_nr\">$tekst[$fil_nr]</a></td>";
        echo "<td><a href=\"$php_self?stemme=$fil_nr\">";
        tegn_soejle($stemmer[$fil_nr], $samlet_antal_stemmer);
        echo "</a></td></tr>";
    }
}
?>

</table>

</body>
</html>
Avatar billede ahv Nybegynder
09. juni 2003 - 11:37 #6
melange >> Er det ikke lige meget at få den over de echo'es? De er jo en del af en funktion som først bliver kaldt senere.
Avatar billede melange Nybegynder
09. juni 2003 - 11:42 #7
ahv << jo, det har du ret i :) Kiggede bare efter output, og så ikke de lå i en funktion.

holckie << Du skal være opmærksom på at der overhovedet ikke må forekomme output! Bare et mellemrum, eller linjeskift før <?php vil skabe fejl.
Prøv at bruge ahv's kode, og se om det virker.
Avatar billede holckie Nybegynder
09. juni 2003 - 11:44 #8
ahv >> Jeg har prøvet dit forslag med at flytte
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
ned under funktionerne. Men det giver desværre stadig den samme fejl.
Avatar billede ahv Nybegynder
09. juni 2003 - 11:45 #9
prøv at kopier din kode ind her. Har du husket at opdater siden?
Avatar billede holckie Nybegynder
09. juni 2003 - 11:48 #10
DET VIRKER!!!
Det var som du sagde melange. Der var et linieskift i starten af <?php
Nu virker det... SUPER!
Jeg lukker spørgsmålet. TAK ENDNU EN GANG :o)
Avatar billede ahv Nybegynder
09. juni 2003 - 11:49 #11
Hvilket ikke var tilfældet i den kode jeg postede, men det var godt du fik det løst.
Avatar billede holckie Nybegynder
09. juni 2003 - 11:52 #12
Jep... Sorry, My mistake
Også tak til dig ahv :o)
Avatar billede melange Nybegynder
09. juni 2003 - 12:53 #13
Jamen jeg er da også glad for at du fik det til at virke :)
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