Avatar billede horizon Nybegynder
28. marts 2005 - 03:20 Der er 5 kommentarer og
1 løsning

php afstemning?

Hvordan laver man en simpel afstemning i php?
brugerne må kun svare en gang indtil afstemningen ændres til noget nyt, (til det kan man bare oprette et ekstra felt i min bruger tabel vel ?)

og så er der det med udregningerne og det må meget gerne vises i procent med 2 decimaler.
Avatar billede bromer Nybegynder
28. marts 2005 - 03:22 #1
Og hvad er det du er i tvivl om? Hvordan man sørger for at en person kun stemmer een gang, eller hvordan man generelt laver et helt afstemningsmodul?
Avatar billede horizon Nybegynder
28. marts 2005 - 03:24 #2
det er selve "motoren" for udregningen mv. jeg har brug for, alt med udseende, adminfunktion burde jeg være i stand til at lave.
Avatar billede bromer Nybegynder
28. marts 2005 - 03:31 #3
okay. Du kan vel have en tabel med afstemninger (id,title,dato), een med muligheder (id,afstemning<ref til afstemningstabel>,text), og en tabel med stemmer (id,mulighed,<ref>).

Så kan du finde den række i afstemningstabel med senest dato. Ud fra det id kan du finde alle de options denne har i den anden tabel. Og ud fra hvert id i options kan du se hvor mange stemmer denne har fået. Når du så summer alle de tal kan du beregne en procent.
Avatar billede horizon Nybegynder
10. oktober 2005 - 21:47 #5
glemte da helt at svare tilbage på denne i sin tid, har brugt bromers model, i en ændret version.

tabeller:

Afstemning
- AfstemningID - int(10) - auto increment - Primær (Bruges til at referere rundt mellem tabellerne)
- Spoergsmaal - text (som sagt, her skrives spørgsmålet)
- SpecielPlacering - tinytext (Bruges til at referere rundt til hvor afstemningen fyskisk ligger. tinytext fordi jeg har skrevet Forside på den som er på forsiden, og så er resten indlægsnumrene i mit forum)

Afstemning_Valg
- ValgID - int(10) - auto increment - Primær (Bruges bl.a. til at finde ud af hvilket svar brugeren har valgt, samt til statisktisk tracking)
- AfstemningID - int(10) (Bruges til at sortere svarene i de korrekte afstemninger)
- Maerkat - Text (fordi det ikke giver mening med et spørgsmål som f.eks. "Hvilket at følgende bands er sejest? 1, 2, 3, 4, 5")
- Stemmer (hurtigere måde at hente antal svar fra en afstemning (efter min mening))

Afstemning_Brugere
- BrugerID - int(10) (Bruges i mit system til at finde ud af hvad brugeren stemte, og så der er mulighed for måske at gå tilbage og rette sin stemme
- AfstemningID - int(10) (Refererer til hvilken afstemning brugeren har valgt)
- ValgID - int(10) (Hvilket svar var det nu brugeren valgte?)

og så kommer selve php koden til at ordne det hele.

Virker fint for mig


Skal dog lige siges på forhånd at det var noget jeg skrev for længe siden, det kan sikkert opdateres og gøres meget enklere, men dette virker
- - - - - (Afstemning.php) - - - - -
<?php

require('mysql.php');

if(isset($_POST['Stem']) && $_POST[ValgID] != ''){

  $Svar = 'INSERT INTO `Afstemninger_Brugere` (BrugerID,AfstemningID,ValgID) VALUES("'.$_SESSION[Profil][BrugerID].'","'.$_POST[AfstemningID].'","'.$_POST[ValgID].'")';
   
  $SvarMulighed = 'UPDATE `Afstemninger_Valg` SET `Stemmer` = `Stemmer` +1 WHERE `ValgID` = "'.$_POST[ValgID].'"';
 
  Forbind();
  Send($Svar);
  Send($SvarMulighed);
  Luk();
 
  unset($_POST[Stem]);
 
}
 
  $hAfstemning = 'SELECT AfstemningID,Spoergsmaal FROM `Afstemninger` WHERE `SpecielPlacering` = "Forside"';

  Forbind();
  $Afstemning = SendModtag($hAfstemning);
  Luk();
 
  if($Afstemning['AfstemningID'] != ''){
 
  $hSvaret = 'SELECT * FROM `Afstemninger_Brugere` WHERE `AfstemningID` = "'.$Afstemning[AfstemningID].'" AND `BrugerID` = "'.$_SESSION[Profil][BrugerID].'"';
  $hTotaleSvar = 'SELECT COUNT(*) AS `Antal` FROM `Afstemninger_Brugere` WHERE `AfstemningID` = "'.$Afstemning[AfstemningID].'"';
   
  Forbind();
    $Svaret = SendModtag($hSvaret);
    $TotaleSvar = SendModtag($hTotaleSvar);
  Luk();
 
  if($Svaret['ValgID'] != ''){
 
    $hIalt = 'SELECT COUNT(*) AS `Antal` FROM `Afstemninger_Brugere` WHERE `AfstemningID` = "'.$Afstemning[AfstemningID].'"';
    $hStk = 'SELECT `Maerkat`,`Stemmer` FROM `Afstemninger_Valg` WHERE `AfstemningID` = "'.$Afstemning[AfstemningID].'"';
   
    Forbind();
    $Ialt = SendModtag($hIalt);
    $Stk = SendModtagOpt($hStk);
    Luk();
   
   
?>

<table width="200" border="0" cellspacing="0" cellpadding="0" height="600">
    <tr height="90">
        <td valign="top" width="180" height="90"><?php echo $Afstemning['Spoergsmaal']; ?></td>
    </tr>
    <tr height="435">
  <td align="center" valign="top" width="180" height="435">
  <?php
     
      /*Dette forudsætter at du vil have en bjælke vises
     
      Bjælkens totale længde 150 px, og hver ende har starten/slutningen på bjælken en bredde på 15 px.
      Enderne vises hvis der er hhv  >0% i den ene ende og > 95% i den anden ende (håber der var nogen som forstod dette :P)*/
    for($i=0;$i<count($Stk);$i++) {
    extract($Stk[$i]);
       
    $Regner = $Stk[$i]['Stemmer'] / $Ialt['Antal'];
    $visStemmer = $Regner * 100;
    $enStemmer = $Regner * 150;
    $toStemmer = $Regner * 120;
 
  ?>
  <table width="150" border="0" cellspacing="0" cellpadding="0">
    <caption>
    <div align="left">
      <?php echo $Stk[$i]['Maerkat'] . ' - ' . substr($visStemmer, 0 , 5) . '%'; ?></div>
    </caption>
    <tr height="20">
    <td width="15" height="20" background="Billeder/Afstemning/Afstemning_Bar<?php if($enStemmer == 0) echo '_Tom'; ?>_01.gif"></td>
    <td width="120" height="20" background="Billeder/Afstemning/Afstemning_Bar_Tom_02.gif"><?php if($toStemmer > 5) echo '<img src="Billeder/Afstemning/Afstemning_Bar_02.gif" width="'.$toStemmer.'" height="20">'; ?></td>
    <td width="15" height="20" background="Billeder/Afstemning/Afstemning_Bar<?php if($enStemmer < 95){} echo '_Tom'; ?>_04.gif"></td>
    </tr>
  </table>
  <br>
  <?php

    unset($visStemmer);
    unset($enStenner);
    unset($toStemmer);
    unset($Regner1);

    }
   
    if($TotaleSvar[Antal] != 1)
    $stemmer = stemmer;
    else
    $stemmer = stemme;
   
    echo 'Baseret på ' . $TotaleSvar[Antal] . ' ' . $stemmer;
   
  ?>
  </td>
</tr>
</table>
<?php
     
    }else{
   
  $hMulighed = 'SELECT `ValgID`,`Maerkat` FROM `Afstemninger_Valg` WHERE `AfstemningID` = "'.$Afstemning[AfstemningID].'"';
 
  Forbind();
    $Mulighed = SendModtagOpt($hMulighed);
  Luk();
 
  ?>
<table width="200" border="0" cellspacing="0" cellpadding="0" height="600">
    <tr height="90">
        <td valign="top" width="180" height="90"><?php echo $Afstemning['Spoergsmaal']; ?></td>
    </tr>
    <tr height="435">
  <td valign="top" width="180" height="435">
  <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
    <input type="hidden" name="AfstemningID" value="<?php echo $Afstemning[AfstemningID]; ?>">
    <?php
     
    for($i=0;$i<count($Mulighed);$i++) {
      extract($Mulighed[$i]);
      $iAccess = $i;
      $Access = $iAccess+1;
     
      /*Hvert punkt er opsat således at der før mærkaten vises et tal fra 1 og opefter, og hvis man holder [Alt) nede, samtidigt med at man trykker på det pågældende nummer udfor sit valg, så bliver pågældende valgmulighed valgt (har ikke testet den hvis den kommer over 9 svarmuligheder, så det er nok en ide at begrænse sig, man skal jo heller ikke drukne brugeren i svarmuligheder*/
     
    ?>
    <input id="ID_Valg_<?php echo $Access; ?>" type="radio" name="ValgID" value="<?php echo $Mulighed[$i]['ValgID']; ?>"  accesskey="<?php echo $Access; ?>"> <label for="ID_Valg_<?php echo $Access; ?>"><b><?php echo $Access .'</b> - ' . $Mulighed[$i]['Maerkat']; ?></label>
    <p>
    <?php
     
    }
     
    ?>
    </b>
    <p>
      <input type="submit" name="Stem" value="Stem" accesskey="S">  <input type="reset" value="Annuller" accesskey="A"></p>
  </form>
  </td>
</tr>
</table>
<?php
   
  }
}
   
?>
- - - - - (Slut) - - - - -

ved ikke om du er interesseret i pointene bromer, men hvis du er så smid et svar, ellers nupper jeg dem selv.
Avatar billede horizon Nybegynder
10. oktober 2005 - 21:58 #6
og i tilfælde af at der er nogen som ikke ved hvad funktionerne Forbind, Send, SendModtag, SendModtagOpt og Luk betyder kommer de lige her:

<?php

//Forbind til server
function Forbind() {
    $server = "WWWW";
    $bruger = "XXXX";
    $kodeord = "YYYY";
    $database = "ZZZZ";

    if (!mysql_connect("$server","$bruger","$kodeord")) {
        udskriv_fejl("Kunne ikke oprette en forbindelse til MySQL - " . mysql_error());
    }

    if(!mysql_select_db("$database")) {
        udskriv_fejl("Kunne ikke vælge databasen: $database - " . mysql_error());
    }
}

//Hent fra database i optalt format
function SendModtagOpt($Query) {
  $Resultat = mysql_query($Query);

  if(!$Resultat) {
    udskriv_fejl("Kunne ikke udføre: <em>$Query</em>");
  }

  while($Raekke = mysql_fetch_array($Resultat)) {
    $Resultat_Array[] = $Raekke;
  }

  return $Resultat_Array;
}

//Hent fra database
function SendModtag($Query) {
    $SendModtag = mysql_query($Query);

    if(!$SendModtag) {
    udskriv_fejl("Kunne ikke udføre: <em>$Query</em>");
    }

    $Resultat = mysql_fetch_array($SendModtag);

    return $Resultat;
}

//Send til database
function Send($Query) {
    $Resultat = mysql_query($Query);

    if(!$Resultat) {
        udskriv_fejl("Kunne ikke udføre: <em>$Query</em> - " . mysql_error());
    }
}

//Luk forbindelse
function Luk() {
    if(!mysql_close()) {
        udskriv_fejl("Kunne ikke lukke forbindelsen til MySQL! - " . mysql_error());
    }
}

//Udskriv MySql fejl
function udskriv_fejl($fejl) {
    echo "<p>$fejl";

    if ($mysql_fejl == mysql_error()) {
        echo "<font color='#ff0000'><br>Fejlen er: <em>$mysql_fejl</em><br>Hvis du støder på denne fejl igen så send en mail til os, hvori du giver en fyldig beskrivelse af fejlen og hvad du gjorde lige inden fejlen opstod.";
    }

    exit;
}
?>
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