Tai - 16/10/2006 13:27 (laatste wijziging 17/10/2006 14:03)
Nieuw lid
Het probleem
Ik heb 4 opties. Ik stem op optie 1, en dan bekijk ik het resultaat. Mijn stem komt tot nu toe overeen met wat ik gestemd heb. Even later stem ik weer, maar dan op optie 2, klopt ook nog. Maar na ongeveer de derde stem loopt alles in de soep. Ik heb de derde keer weer op optie 1 gestemd. Hij heeft de 1e stem van optie 1, verplaats naar optie 3.
<?php
ob_start(); //is enkel nodig voor de doorverwijzing
/* POLL
SIMPEL STEMSYSTEEM ZONDER MYSQL. RESULTATEN WORDEN OPGELSAGEN IN EEN LOG-BESTANDJE, WELKE GESCHEIDEIN WORDEN DOOR EEN ,.
BIJ GEBRUIK OP WEBSERVER MOET HET BESTANDJE 0777 GESCHMOD WORDEN*/
/*ER KUNNEN ZOVEEL OPTIES TOEGEVOEGD WORDEN ALS MEN WIL, DIT WORDT AUTOMATISCH OPGENOMEN IN HET SCRIPT MITS DEZE GESCHEIDEN ZIJN DOOR EEN KOMMA (,) IN POLL.TXT.*/
$file = "poll.txt"; //het bestandje
$fp = fopen($file, "r"); //lees poll.txt uit
$inhoud = fread($fp, filesize($file)); //uitlezen
fclose($fp);
$vraag = "Frames, tabbellen of CSS, of toch iets anders?";
$optie = array("Frames", "Tabellen", "CSS", "Anders..");
$resultaat = explode(",", $inhoud); //$inhoud in een array zetten.
$totaal = array_sum($resultaat); //totaal berekenen
$j = count($resultaat); //tellen hoeveel resultaten er zijn (standaard 3)
if($_COOKIE['poll2'] == 'gestemd')
{
echo "<table height=\"200\" width=\"190\"><tr><td valign=\"top\"><table><tr><td style='font-size: 12px; font-family: arial; color: #270f4a;'>".$vraag."</td></tr></table><br>";
for($i = 0; $i < $j; $i ++) //lusje om resultaten te laten zien.
{
$uitslag = round(100 / $totaal * $resultaat[$i]); //formule voor procenten
echo "<table width=\"180\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">
<tr>
<td width=\"100\">
<font style='font-size: 11px; font-family: arial;'>".$optie[$i]."</font>
</td>
<td width=\"20\">
</td>
<td width=\"*\"><table border=\"0\" width=\"".$uitslag."%\" height=\"20\"><td bgcolor=\"#3399cc\"> </td></tr></table></td>
<td width=\"30\"><font style='font-size: 11px;'>".$uitslag."%</font></td></tr></table>
<br>"; //maak de opmaak met de breedte van tabel
}
echo "<b><font style='font-size:11px;'>Je hebt al gestemd.</b><br><br><b>".$totaal."</b> stem(men) totaal</font></table>";
}
else
{
if(isset($_POST['stemmen'])) //als er op de knop geklikt is
{
if($_POST['stem'] == '') //als er geen waarde is
{
echo "<table height=\"220\" width=\"190\"><tr><td valign=\"top\"><font style='font-size: 11px;'>Je hebt niks ingevuld.<br><a href='javascript:history.go(-1)'>Ga terug</a></font></table>";
}
else
{ // hieronder moeten de overige resultaten ook weer ingevoegd worden.
for($l = 0; $l < $_POST['stem']; $l ++)
{
$invoegen.= $resultaat[$l].","; //komma er weer bij..
}
$invoegen.= $resultaat[$_POST['stem']]+1; //voeg de stem toe + 1
for($l = $_POST['stem']; $l < $j-1; $l ++)
{
$invoegen.= ",".$resultaat[$l];
}
$fp = fopen($file, "r+");
fputs($fp, $invoegen); //$invoegen invoegen
fclose($fp);
setcookie("poll2", "gestemd", time()+10); //hier wordt het cookie geset op 10 seconden
echo "<table height=\"220\" width=\"190\"><tr><td valign=\"top\"><font style='font-size: 11px;'><b>Je stem is verzonden!</b><br><br>Je wordt nu doorgestuurd naar de poll...</font></table>";
header("refresh: 2; url=index.php"); //doorverwijzing
}
}
else
{
echo "<table height=\"220\" width=\"190\"><tr><td valign=\"top\"><table><tr><td style='font-size: 12px; font-family: arial; color: #270f4a;'>".$vraag."</td></tr></table><form method=\"post\">";
for($i = 0; $i < $j; $i ++) //lusje om resultaten te laten zien.
{
@($uitslag = round(100 / $totaal * $resultaat[$i])); //formule voor procenten
echo "
<table width=\"180\" border=\"0\">
<tr>
<td width=\"100\">
<font style='font-size: 11px; font-family: arial;'>".$optie[$i]."</font>
</td>
<td width=\"20\">
<input style='background-color: #f3ecec; border: 1px dashed #d3d3d3;' type=\"radio\" name=\"stem\" value=\"".$i."\">
</td>
</tr></table>
"; //maak de opmaak met de breedte van tabel
}
echo "<input style='font-size: 11px; font-family: arial; background-color: #eee4e4; margin-top: 5px; margin-left: 112px; border: 1px solid #d3d3d3;' type=\"submit\" name=\"stemmen\" value=\"Stemmen\">
</form><font style='font-size:11px;'><b>".$totaal."</b> stem(men) totaal</font></table>";
}
}
?>
<?php
ob_start();//is enkel nodig voor de doorverwijzing
/* POLL
SIMPEL STEMSYSTEEM ZONDER MYSQL. RESULTATEN WORDEN OPGELSAGEN IN EEN LOG-BESTANDJE, WELKE GESCHEIDEIN WORDEN DOOR EEN ,.
BIJ GEBRUIK OP WEBSERVER MOET HET BESTANDJE 0777 GESCHMOD WORDEN*/
/*ER KUNNEN ZOVEEL OPTIES TOEGEVOEGD WORDEN ALS MEN WIL, DIT WORDT AUTOMATISCH OPGENOMEN IN HET SCRIPT MITS DEZE GESCHEIDEN ZIJN DOOR EEN KOMMA (,) IN POLL.TXT.*/
setcookie("poll2","gestemd",time()+10);//hier wordt het cookie geset op 10 seconden
echo"<table height=\"220\" width=\"190\"><tr><td valign=\"top\"><font style='font-size: 11px;'><b>Je stem is verzonden!</b><br><br>Je wordt nu doorgestuurd naar de poll...</font></table>";
Maar dat stukje is goed.
Voor de rest staan er wat style veranderingen in.
Hij doet het ook fout bij het originele script. Hij vervangt stemmen bij een bepaalde optie naar een stem bij een andere optie.
En dat is zonder include.
Daarnaast include ik de poll op nog 5 andere pagina's. (Totaal 6)
Ik heb boven elke pagina een "ob_start" staan. Maar volgens mij klopt dit ook niet helemaal.
Ik heb vanalles gelezen over sessions en cookies maar ik kom er niet uit. Ik heb ook verschillende websites afgezocht naar een dergelijke fout, maar ik vond niets.
Als iemand een oplossing heeft, graag!
Nee, ik heb dat nog niet geprobeerd, maar ik weet niet of dat wel erg veel zin heeft omdat ik een aantal aanpassingen heb gemaakt. Voor de zekerheid zal ik hem doorverwijzen naar dit topic.
(Zijn postvak in is Vol, 50 berichten..)
Maar dat stukje is goed.
Voor de rest staan er wat style veranderingen in.
Hij doet het ook fout bij het originele script. Hij vervangt stemmen bij een bepaalde optie naar een stem bij een andere optie. En dat is zonder include.
Je gaat de fout onderdrukken maar dat wil niet zeggen dat het dan wel werkt, 1 van de 2 variablen bestaat niet of 0 dus echo $totaal of $resultaat[i] en dan vervang je i door een nummer om te kijken of de array $resultaat überhaupt wel gevuld is.
Hm, een aantal opmerkingen:
- maak van de style-attributen CSS-classes en verplaats deze naar een stylesheet, de code (html/php/css door elkaar) is zo compleet onleesbaar
- (regel 59) $invoegen begint met toevoeging (.=) aan de nog niet-bestaande string $invoegen. Je moet of dit toevoegteken (het puntje) weghalen of $invoegen initialiseren op de lege string; Nog beter / makkelijker is het werken met arrays, en dan imploden op ",", dan hoef je ook niet zo te hannesen met komma's
- als 2 mensen "tegelijkertijd" stemmen is je poll aan gort, gebruik flock() voor het locken van bestanden (om er naar te schrijven)
- je cookie is maar 10 seconden geldig en is alleen geldig in de folder (en het domein) van aanroep, dit lijkt mij ook niet echt gewenst?
- $resultaat[$i] kan 0 zijn, dus de volgende instructie:
$uitslag = round(100 / $totaal * $resultaat[$i]) (oftewel delen door 0) lijkt mij niet gewenst
Ik zou dit script eens grondig onder de loep nemen of (wellicht sneller) opnieuw schrijven.
Tai - 16/10/2006 14:33 (laatste wijziging 17/10/2006 14:03)
Nieuw lid
@ Ultimatum
Dit heb ik gedaan en hij werkte prima als beide niet 0 waren. Hij deed het ook als ze 0 waren, maar ik kreeg alleen de error tussendoor.
@ FangorN
Dankjewel voor de feedback, maar ik wil je even laten weten dat ik het script niet zelf heb geschreven maar gewoon gedownloadt.
Ik zal je commentaar eens goed nalezen en kijken wat ik kan doen. (Ik ben geen PHP gevorderde dus het zal wel even duren. )
Antwoorden:
- Ja het is redelijk slordig..
- als ik het puntje weghaal verandert hij de stemmen nog. Ik snap niet precies wat je bedoelt. Doe maar alsof je het aan een kind van 5 uitlegt, dan snap ik het misschien.
- Ik zal eens zoeken hoe ik flock() gebruik.
-Ik heb de cookie op 10 seconden gezet zodat ik makkelijk de boel kon testen. Normaal zet ik hem op