Avatar billede skørsen Nybegynder
24. maj 2000 - 14:07 Der er 11 kommentarer og
1 løsning

Afstemning med brug af en anden fil

Jeg har et script så man kan stemme på hvor god et link er. Men det virker kun nogle gange.
Det hænder ret tit at når man reloader siden er pointene uændret. Hvorfor? Kan man reloade den for hurtigt, så den ikke når at opdateres på serveren?
Selve filen med afstemningen er den lige herunder.
Når man så stemmer henter den i en anden ramme den fil som er længere nede. En lidt besværlig metode - kan det gøres lettere?


<html><head>
<script>
function vote(obj, score){

url = 'rate.php3?point='+score+'';
top.ramme.location=url;

antal=antal*1+score*1;
antalen++;
document.all.snit.innerHTML=tagsnit();

return;
}
</script>
</head>

<body>

<form name=voter>

<SCRIPT>

<?
$text = "tal.txt";
$fp = fopen($text, "r");
$antal = fgets($fp,1024);
fclose($fp);

$text = "antalgange.txt";
$fp = fopen($text, "r");
$antalen = fgets($fp,1024);
fclose($fp);

print "var antal=".$antal.";\n";
print "var antalen=".$antalen.";\n";

?>

function tagsnit() {
gennemsnit=""+antal/antalen;
    if (gennemsnit.length>4) {
    gennemsnit=gennemsnit.substring(0, 3)
    }
return gennemsnit;
}
</SCRIPT>

<div id="snit><SCRIPT>document.write(tagsnit());</SCRIPT></div><i> / 5.0&nbsp;&nbsp;</i>

<SELECT NAME="v_73" onchange=" vote(this,this[this.selectedIndex].value ); return true;">
<option value="rate!">Rate it!
<option value=0>0
<option value=1>1
<option value=2>2
<option value=3>3
<option value=4>4
<option value=5>5
</select>
</form>

</body>
</html>

Filen rate.php3 ser således ud.

<HTML>
<HEAD><META HTTP-EQUIV="Refresh" CONTENT="0;URL=tomfil.htm"></HEAD>
<BODY>
<?
$text = "tal.txt";
$fp = fopen($text, "r");
$antal = fgets($fp,1024);
fclose($fp);

$texten = "antalgange.txt";
$fp = fopen($texten, "r");
$antalen = fgets($fp,1024);
fclose($fp);

$antal=$antal+$point;
$antalen=$antalen+1;

$fp = fopen($text, "w");
fputs($fp,$antal);
fclose($fp);

$fp = fopen($texten, "w");
fputs($fp,$antalen);
fclose($fp);
?>
</BODY>
</HTML>
Avatar billede lassehjorth Nybegynder
24. maj 2000 - 06:27 #1
Har du adgang til mysql??????
Avatar billede steffen Nybegynder
24. maj 2000 - 06:27 #2
Jeg legede lige lidt ..

stem.php3:

<html><head>
<script>
function vote(obj, score){
url = 'rate.php3?point='+score+'';
document.location=url;
antal=antal*1+score*1;
antalen++;
return;
}
</script>
</head>
<body>

<SCRIPT>
<?
$text = "tal.txt";
$fp = fopen($text, "r");
$antal = fgets($fp,1024);
fclose($fp);
$text = "antalgange.txt";
$fp = fopen($text, "r");
$antalen = fgets($fp,1024);
fclose($fp);
print "var antal=".$antal.";\n";
print "var antalen=".$antalen.";\n";
?>

function tagsnit() {
gennemsnit=""+antal/antalen;
    if (gennemsnit.length>4) {
    gennemsnit=gennemsnit.substring(0, 3)
    }
return gennemsnit;
}

document.write("Nuværende snit er: ")
document.write(tagsnit()+"<BR>");
</SCRIPT>

<form name=voter>
<SELECT NAME="v_73" onchange=" vote(this,this[this.selectedIndex].value ); return true;">
<option value="rate!">Rate it!
<option value=0>0
<option value=1>1
<option value=2>2
<option value=3>3
<option value=4>4
<option value=5>5
</select>
</form>
</body>
</html>

rate.php3:

<?
$text = "tal.txt";
$fp = fopen($text, "r");
$antal = fgets($fp,1024);
fclose($fp);

$texten = "antalgange.txt";
$fp = fopen($texten, "r");
$antalen = fgets($fp,1024);
fclose($fp);

$antal=$antal+$point;
$antalen=$antalen+1;

$fp = fopen($text, "w");
fputs($fp,$antal);
fclose($fp);

$fp = fopen($texten, "w");
fputs($fp,$antalen);
fclose($fp);
?>
<HTML>
<HEAD><META HTTP-EQUIV="Refresh" CONTENT="2;URL=stem.php3"></HEAD>
<BODY>
<?
echo "Du stemte med: '".$point."' point.<BR>\n";
echo "Der er stemt: '".$antalen."' gange, og der er givet: '".$antal."' point ialt.<BR>\n";
?>
</BODY>
</HTML>

Det virker i hvert tilfælde fint .. men det er sikkert nok i dit script hvis du flytter de tre linier (kunne bare ikke få div-tingen til at spille, derfor omrokeringerne).

<HTML>
<HEAD><META HTTP-EQUIV="Refresh" CONTENT="0;URL=tomfil.htm"></HEAD>
<BODY>

ned under din PHP kode.
Avatar billede skørsen Nybegynder
25. maj 2000 - 09:44 #3
lassehjorth >> Nej, desværre. Jeg bruger f2s.com, som har Postgres SQL.
steffen >> Jeg tager og afprøver det. Jeg har nu svært ved at forstå at placeringen af de tre linier skulle betyde så meget.
Avatar billede lassehjorth Nybegynder
25. maj 2000 - 12:51 #4
Så kan du vel bare lave det PostgreSQL
Avatar billede steffen Nybegynder
25. maj 2000 - 15:39 #5
skørsen: Problemet er, at browseren afbryder udførslen af scriptet, da den bliver redirectet med det samme.

Udførslen af filåbningerne mv tager trods alt en lille smule tid. - Så hvis dit php script lige venter med at stille browseren om til det selv er færdigt, skulle problemet kunne undgås.
Avatar billede skørsen Nybegynder
25. maj 2000 - 16:16 #6
lassehjorth: Jeg aner ikke hvordan man laver det i Postgres SQL.
steffen: Metascripts bliver da først udført hos klienten. Php-script på serveren. Så vidt jeg har forstået udfører den hele phpscriptet før siden sendes til klienten.
Jeg må desuden tilstå at jeg måske oprettede dette spørgsmål lidt hurtigt. I dag har scriptet fungeret nærmest upåklageligt i den oprindelige udgave.
Avatar billede steffen Nybegynder
25. maj 2000 - 17:17 #7
Hvis der fx er tale om et databaseudtræk der tager mange minutter at lave - vil dit redirect betyde, at en browser fordet første aldrig ser scriptet - men også at scriptet bliver afbrudt, idét browseren nedlægger forbindelsen, og dette ses af serveren - i dette tilfælde php-serveren.

Prøv at sætte en wait sætning ind på en 30 sekunder el. lign., og se at det går galt :-)

Altså med mindre redir'en først kommer til sidst.
Avatar billede skørsen Nybegynder
25. maj 2000 - 23:08 #8
Jeg er ikke med. Browseren kommer da uanset hvad aldrig til at se php-scriptet. Du svarer mig ikke direkte på hvorvidt den udfører hele phpscriptet inden den sender siden til klienten eller om den sender scriptet afsted efterhånden som serveren æder sig igennem scriptet. Men jeg formoder at du mener det sidste.

Hvordan sætter man en wait sætning ind?
Avatar billede lassehjorth Nybegynder
25. maj 2000 - 23:11 #9
sleep(antal sekunder)
Avatar billede steffen Nybegynder
26. maj 2000 - 10:32 #10
skørsen: Jeg prøvede :-)

Output'et fra PHP scriptet bliver sendt lige præcis når det er lavet (med mindre du fiks-fakser med nogle buffer-indstillinger, men det er ikke standard).

Derfor .. i slow-motion:

Dit php-script går igang .. skipper de første tre linier som den sender uredigeret til browseren .. så går den i gang med arbejdet - åbner filen, læser indholdet, men how! nu kom der besked fra browseren at den er gået væk (blevet redirected) fra siden - så stopper udførslen af php-scriptet, og point'ene blev aldrig opdateret.

Derfor er det helt klart en bedre løsning at sende meta-tagsene som det allersidste, simpelthen.
Avatar billede skørsen Nybegynder
26. maj 2000 - 21:06 #11
steffen: Jeg har nu sat sleep(30) ind med et resultat der meget klart strider med dit udsagn. Og jeg har prøvet med forskellige "strategiske steder", alle med samme resultat. Hvis du vil overbevise mig må du lave et script der beviser dine udsagn.
Avatar billede steffen Nybegynder
01. juni 2000 - 10:16 #12
Nu kan jeg se du har udraderet muligheden for point, men her er da et lille script der viser hvad jeg prøvede at kommunikere :-)

Hvis du på noget tidspunkt går væk fra siden (eller trykker stop) inden den bliver færdig opdateres filen aldrig.

Det er det samme der sker med dit script.

<?
$filename = "bevis.html";
$fp = fopen($filename, "w");
$header = "<HTML>\n<HEAD>\n</HEAD>\n<BODY>\n";
fputs($fp,$header);
$content = "Filen er ikke opdateret\n</BODY>\n</HTML>\n";
fputs($fp,$content);
fclose($fp);
?>

<HTML>
<HEAD></HEAD>
<BODY>

<?
echo "Udførslen stopper når man trykker stop<BR>\n";
echo "Tryk stop i din browser nu, eller vent 30 sekunder<BR>\n";
echo "Efter 30 sekunder, check da <a href='bevis.html'>filen</a><BR>\n";

flush();
for ($i=0;$i<5;$i=$i+1) {
    echo "<H1>Husk at trykke STOP</H1>\n";
    flush();
    sleep (5);

}

$filename = "bevis.html";
$fp = fopen($filename, "w");
$header = "<HTML>\n<HEAD>\n</HEAD>\n<BODY>\n";
fputs($fp,$header);
$content = "Filen er opdateret efter 30 sekunder\n</BODY>\n</HTML>\n";
fputs($fp,$content);
fclose($fp);
?>

<a href='bevis.html'>Filen</a> er nu opdateret.<BR>
</BODY>
</HTML>
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