Avatar billede webstuff Nybegynder
02. januar 2006 - 15:42 Der er 8 kommentarer og
2 løsninger

Afstemning, hvorfor har jeg lavet så meget kode ?

Jeg har lavet en afstemning, og den virker fint nok og det hele, men jeg synes bare der er så frygteligt meget kode, så jeg tænke at det da måtte kunne lade sig gøre at lave det med mindre kode?
Men kan ikke finde ud af hvordan...

Her er min nuværende kode:

################################################################
<?
mysql_connect('host', 'navn', 'kode');
mysql_select_db("db");

$svar = $_POST[svar];

if(!empty($svar)){

$hent1 = mysql_query("SELECT svaret1 FROM afstemning WHERE svar1 = '$svar'") or die(mysql_error());
$tael1 = mysql_fetch_array($hent1);
if(mysql_num_rows($hent1) == 1){
$ind1 = $tael1[svaret1] + 1;
mysql_query("UPDATE afstemning SET svaret1 = '$ind1'") or die(mysql_error());
} else {

$hent2 = mysql_query("SELECT svaret2 FROM afstemning WHERE svar2 = '$svar'") or die(mysql_error());
$tael2 = mysql_fetch_array($hent2);
if(mysql_num_rows($hent2) == 1){
$ind2 = $tael2[svaret2] + 1;
mysql_query("UPDATE afstemning SET svaret2 = '$ind2'") or die(mysql_error());
} else {

$hent3 = mysql_query("SELECT svaret3 FROM afstemning WHERE svar3 = '$svar'") or die(mysql_error());
$tael3 = mysql_fetch_array($hent3);
if(mysql_num_rows($hent3) == 1){
$ind3 = $tael3[svaret3] + 1;
mysql_query("UPDATE afstemning SET svaret3 = '$ind3'") or die(mysql_error());
} else {

$hent4 = mysql_query("SELECT svaret4 FROM afstemning WHERE svar4 = '$svar'") or die(mysql_error());
$tael4 = mysql_fetch_array($hent4);
if(mysql_num_rows($hent4) == 1){
$ind4 = $tael4[svaret4] + 1;
mysql_query("UPDATE afstemning SET svaret4 = '$ind4'") or die(mysql_error());
} else {

$hent5 = mysql_query("SELECT svaret5 FROM afstemning WHERE svar5 = '$svar'") or die(mysql_error());
$tael5 = mysql_fetch_array($hent5);
if(mysql_num_rows($hent5) == 1){
$ind5 = $tael5[svaret5] + 1;
mysql_query("UPDATE afstemning SET svaret5 = '$ind5'") or die(mysql_error());
} else {
echo "Du har ikke valgt noget svar";
}
}
}
}
}
}
$get = mysql_query("SELECT * FROM afstemning WHERE id = 1") or die(mysql_error());
$show = mysql_fetch_array($get);
?>
<form action="index.php" method="POST">
<? echo "<b>$show[sporg]</b>"; ?>
<br>
<input type="radio" name="svar" value="<? echo $show[svar1]; ?>">
<? echo  "$show[svar1] - $show[svaret1]"; ?>
<br>
<input type="radio" name="svar" value="<? echo $show[svar2]; ?>">
<? echo  "$show[svar2] - $show[svaret2]"; ?>
<br>
<input type="radio" name="svar" value="<? echo $show[svar3]; ?>">
<? echo  "$show[svar3] - $show[svaret3]"; ?>
<br>
<input type="radio" name="svar" value="<? echo $show[svar4]; ?>">
<? echo  "$show[svar4] - $show[svaret4]"; ?>
<br>
<input type="radio" name="svar" value="<? echo $show[svar5]; ?>">
<? echo  "$show[svar5] - $show[svaret5]"; ?>
<br>
<b>Stemmer i alt
<?
$ialt = $show[svaret1] + $show[svaret2] + $show[svaret3] + $show[svaret4] + $show[svaret5];
echo $ialt;
?>
</b>
<br>
<input type="submit" value="Stem">
</form>
Avatar billede delphinarious Nybegynder
02. januar 2006 - 15:54 #1
Altså jeg havde nok valgt at lave en løkke i stedet for at lave 5 manuelle radios i alt fald... Det samme gælder i toppen...

Og så lige i øvrigt; Når du tæller poster fra db, så overvej at bruge count(*) i stedet, og så hent antallet med mysql_result()... Det giver meget hurtigere performance. ;-)
Avatar billede webstuff Nybegynder
02. januar 2006 - 15:56 #2
okay.. så prøver jeg mig frem med løkker.. men kan bare ikke lige gennemskue hvordan jeg skal lave løkken i toppen?
Avatar billede delphinarious Nybegynder
02. januar 2006 - 16:29 #3
Post lige din databasestruktur, og forklar den, så skal jeg hjælpe dig... Jeg kan ikke lige se mig ud af, hvordan din db fungerer.. ;-)
Avatar billede webstuff Nybegynder
02. januar 2006 - 16:48 #4
Min database ser sådan her ud:

id - siger sig selv
sporg - spørgsmålet

svar1 - det første man kan svare
svar2 - det andet man kan svare
svar3 - det tredje man kan svare
svar4 - det fjerde man kan svare
svar5 - det femte man kan svare

svaret1 - antal stemmer på "svar1"
svaret2 - antal stemmer på "svar2"
svaret3 - antal stemmer på "svar3"
svaret4 - antal stemmer på "svar4"
svaret5 - antal stemmer på "svar5"

status - bliver ikke brugt endnu
Avatar billede delphinarious Nybegynder
02. januar 2006 - 17:13 #5
Ok. En lidt anderledes måde at gøre det på, tænker jeg. Men ok, virke - det skal det jo! :-D

Jeg har lige ommøbleret din top-kode lidt for dig, samt indsat variablen "voteid", som du så bliver nødt til at sende i et hidden field i din form. På den måde undgår du problemer, med at have flere forskellige afstemninger i databasen.

<?php

mysql_connect("host","navn","kode");
mysql_select_db("db");

$svar = $_POST["svar"];

$voteid = $_POST["voteid"];

if(!empty($svar)){

    $sql = mysql_query("select * from afstemning where svar1 = '$svar' or svar2 = '$svar' or svar3 = '$svar' or svar4 = '$svar' or svar5 = '$svar'");
    if(mysql_num_rows($sql) < 1) {
        echo "Du har ikke valgt noget svar!";
    } else
        $row = mysql_fetch_assoc($sql);
       
        $c = 1;
        while($c <= 5) {
            if($svar == $row["svar".$c]) {
                $svaretnum = $c;
            }
            $c++;
        }

        $ant = $row["svaret".$svaretnum]+1;

        mysql_query("update afstemning set svaret".$svaretnum." = '$ant' where id = '$voteid'");
       
       
   
    }

}


?>
Avatar billede delphinarious Nybegynder
02. januar 2006 - 17:14 #6
Ups... "} else" på niende kodelinie, skal selvfølgeligt laves til "} else {".. :-)
Avatar billede delphinarious Nybegynder
02. januar 2006 - 17:17 #7
Men du ville nu gøre det meget nemmere for dig selv, hvis du, i dine radio-buttons, bare sendte "svar1" eller "svar2", etc.... Så var du fri for at skulle hen og lede efter det rigtige svar i databasen efterfølgende... Og selvom en radio-buttons value er "svar1" kan der jo godt stå noget andet ved siden af...
Avatar billede delphinarious Nybegynder
02. januar 2006 - 17:26 #8
Jeg lavede lige et forslag til hele koden for dig... Så kan du sq ikke få det nemmere. Og så fik du da alligevel noget mindre kode... ;-)

<?php
mysql_connect("host","navn","kode");
mysql_select_db("db");

$svar = $_POST["svar"];
$voteid = $_POST["voteid"];

if(!empty($svar)){
    $sql = mysql_query("select * from afstemninger where id = '$voteid'");
    $row = mysql_fetch_assoc($sql);
    $ant = $row["svaret".$svar]+1;
    mysql_query("update afstemning set svaret".$svar." = '$ant' where id = '$voteid'");
}

$sql = mysql_query("select * from afstemning where id = 1");
$row = mysql_fetch_assoc($sql);
echo "<form action=\"index.php\" method=\"POST\">";
echo "<b>$show[sporg]</b>\n<br>";

$c = 1;
while($c <=5) {
    echo "<input type=\"radio\" name=\"svar\" value=\"".$c."\">\n";
    echo $row["svar".$c]."<br>";
    $c++;
}

echo "<input type=\"hidden\" name=\"voteid\" value=\"1\">\n";
echo "<input type=\"submit\" value=\"Stem\">\n</form>";
?>
Avatar billede webstuff Nybegynder
02. januar 2006 - 18:05 #9
Mange tak for hjælpen, det var sku dejlig :)
Du har fået point :)
Avatar billede delphinarious Nybegynder
02. januar 2006 - 18:07 #10
Selv tak - og tak for points! ;-)
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