Beste phphulp,
Hier mijn eerste topic.
Ik heb een poll systeem gevonden op internet.(kan zelf niet scripten).
Maar nu zet hij de votes in de database.
Maar ik wil dat als je 7x hebt gestemd niet meer kan stemmen.

hier de code:


<?php

    mysql_connect("localhost", "#", "#");
    mysql_select_db("#");
    
    if( isset( $_GET['p_id'] ) )
        // Id opgegeven, geselecteerde poll pakken
        $query = "SELECT * FROM polls WHERE id = '" . intval( $_GET['p_id'] ) . "' LIMIT 1";
    else
        // Geen id, laatst toegevoegde poll pakken
        $query = "SELECT * FROM polls ORDER BY id DESC LIMIT 1";    
        
    $result = mysql_query( $query ) or die( mysql_error() );
    
    if( mysql_num_rows( $result ) == 0 ) {
        echo "Geen poll geselecteerd!";
    } else {
    
        $fetch = mysql_fetch_assoc( $result );
        
        $voted = unserialize( $fetch['voted'] );        

        // Kijken of het IP al gestemd heeft
        if( isset( $voted[ $_SERVER['REMOTE_ADDR'] ] ) )
            $canvote = true;
        else
            $canvote = true;

        // Antwoorden deserializen en sorteren        
        $answers = unserialize( $fetch['answers'] );
        
        // Kijken of er deze keer gestemd is        
        if( isset( $_POST['voteon'] ) and $canvote ) {
            $voteon = base64_decode( $_POST['voteon'] );

            if( isset( $answers[ $voteon ] ) ) {
                // Klopt, stem verwerken
                $answers[ $voteon ]++;
                $voted[ $_SERVER['REMOTE_ADDR'] ] = $_POST['voteon'];
                mysql_query( "UPDATE polls SET votes = votes + 1, answers = '" . serialize( $answers ) . "', voted = '" . serialize( $voted ) . "' WHERE id = '" . $fetch['id'] . "' LIMIT 1" ) or die( mysql_error() );
                $canvote = false;
            }            
        }
        
        arsort( $answers );        
                
        if( $canvote )
            echo "<form method='POST'>";
            
        echo "<span style='font-weight: bold; font-family: arial;'>" . $fetch['question']  . "</span> (" . $fetch['votes'] . ")<hr style='width: 250px;' align='left' />";            
        
        foreach( $answers as $name => $count ) {
            if( $canvote )
                echo "<input type='radio' name='voteon' value='" . base64_encode( $name ) . "'> ";
                
            echo $name . "<br />";
                
            // Maten uitrekenen    
            @$onepercent = 100 / $fetch['votes'];
            $percent = round( $onepercent * $count , 1 );
            $width = 200 * ( $percent / 100 ) + 1;
            $margin = 200 - $width;
            
            // Als er al gestemd is, de gekozen optie een aner kleurtje geven
            $color = "#61a2f3";            
            if( !$canvote ) {
                if( trim( $voted[ $_SERVER['REMOTE_ADDR'] ] ) == trim( base64_encode( $name ) ) )
                    $color = "navy";
            }            
            
            echo "<div style='background-color: " . $color . "; border-top: 1px solid black; margin-right: " . $margin . "px; border-bottom: 1px solid black; width: " . $width . "px; height: 8px; overflow: hidden; display: inline;'></div> (" . $percent . "%)</span><hr style='width: 250px;' align='left' />";
        }
        
        if( $canvote )
            echo "<input type='submit' value='Stemmen'></form>";
    }

?>


Database:

CREATE TABLE `polls` (
  `id` int(10) NOT NULL auto_increment,
  `createdon` int(10) NOT NULL,
  `question` varchar(255) NOT NULL,
  `answers` text NOT NULL,
  `votes` int(10) NOT NULL,
  `voted` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; 


Met vriendelijke groet,
Slenger
Dan moet je zorgen dat je de user in laat loggen. Dan kan je in een tabel bijhouden hoevaak waarop gestemd is door een bepaalde user.

Een andere manier is er in feite niet.


Je kunt het met een cookie doen, maar die kunnen aangepast worden.

Als de bezoeker niet is ingelogd kun je het beste kiezen voor een sessie. Die bestaat niet meer bij het volgende bezoek, maar het voorkomt in ieder geval excessief spammen.

Kan je het met iets á la dit oplossen:


<?php
session_start();
if(!isset($_SESSION['vote']))
{
    $_SESSION['vote'] = 1;
}
elseif($_SESSION['vote'] >= 7)
{
    echo 'Je mag maar 7x stemmen!';
}
else
{
    $_SESSION['vote']++;
}
?>
hij zet het zo in db:


INSERT INTO `polls` (`id`, `createdon`, `question`, `answers`, `votes`, `voted`) VALUES
(1, 1229649445, 'Slenger', 'a:3:{s:21:"<img src="index.png">";i:4;s:5:"chill";i:0;s:3:"hoi";i:1;}', 5, 'a:1:{s:13:"212.178.82.23";s:4:"aG9p";}');

Die 5 staat voor aantal votes.

Kan ik daar ook niks mee?
Waarom sla je geserialiseerde data op in de database? Dat maakt het gebruik van de data gruwelijk langzaam.

Wat moet 1229649445 voorstellen? Wat is er mis met een echte datum met tijd? Lijkt mij toch minstens 100 keer eenvoudiger, kun je er nog eens iets mee gaan doen. Gebruik dus een DATETIME als datatype en zet daar een echte datumtijd in.

Verder horen backticks ` niet thuis in SQL, gooi die rotzooi weg, het zorgt voor bugs.
@pgFrank,

Het is niet mijn script.
Ik zocht gewoon een poll die ik kon bijwerken.
Maar dat lukt mij niet.
Dus daarom hoop ik dat iemand hier mij wil helpen.
Er zijn vast wel betere polls te vinden op internet, en anders heb ik ook nog wel een goed idee: zelf maken.
als je mijn profiel had gelezen had je gezien dat ik geen php ken
zo bedoelde ik dat ook niet.
Maar een poll systeem maken lukt me echt niet.
ik snap alleen nog maar echo enzo.
Dan leer je even verder ;) echo is echt de aller-aller-basis...

Reageren