Simppeli tekstitiedostoja hyödyntävä gallup.
asennus:
1. Kopioi tiedostot epoll.php ja epinstall.php palvelimelle
2. Luo datafile (epdata.txt) ja chmod 666
3. Aseta kysymys ja vaihtoehdot (epinstall.php)
4. Poista epinstall.php (tai suojaa salanalla)
5. Luo vote_bar.gif tai kopioi se yllämainitusta osoitteesta. Voit tietenkin käyttää myös omaa kuvaa (yksivärinen 1x1 -kuva kaikista kätevin).
6. Valmista
epoll.php
<?php $epoll = new epoll; class epoll { var $polldata, $datafile, $setcookie, $trackip, $timeout, $php_self; function epoll() { $this->datafile = 'epdata.txt'; // cdmod esim. 666 /* tallennetaanko ip-osoite? ( 1 / 0 ) */ $this->trackip = 1; /* asetetaanko eväste ( 1 / 0 ) */ $this->setcookie = 1; /* aika jonka jälkeen voi äänestää uudelleen, sekunteina */ $this->timeout = 60 * 60 * 24 * 30; /* tulostettavien 'viivojen' maksimileveys */ $this->maxwidth = 150; /* polku - vaatii muutosta mikäli liittänyt gallupin sivullesi esim. icludella */ $this->php_self = 'epoll.php?'; // esim. "index.php?sivu={$pageid}&" if( $this->loadData() ) { if( $this->isVoted() ) $this->showResults(); else $this->showQuestion(); } else { echo 'epoll error'; } } function loadData() { if( ! file_exists($this->datafile) ) return false; $this->polldata = @unserialize(file_get_contents($this->datafile)); if( ! is_array($this->polldata) ) return false; return true; } /** * Tarkistetaan onko käyttäjä äänestänyt jo aikaisemmin, ja tallennetaan * tarvittaessa uusi ääni tietokantaa. * */ function isVoted() { /* tarkistetaan löytyykö eväste */ if( $this->setcookie && isset($_COOKIE['epvoted']) ) return true; /* löytyykö ip-osoitetta */ if( $this->trackip && isset($this->polldata['ips'][$_SERVER['REMOTE_ADDR']]) ) if( $this->polldata['ips'][$_SERVER['REMOTE_ADDR']] + $this->timeout > time() ) return true; /* onko äänestetty? */ if( isset($_GET['vote']) and $this->validate($_GET['vote']) ) { $this->polldata['votes'][$_GET['vote']] += 1; /* tallennetaako ip-osoite? */ if( $this->trackip ) { $this->polldata['ips'][$_SERVER['REMOTE_ADDR']] = time(); /* säilytettään 40 viim. ip-osoitetta */ $this->polldata['ips'] = array_slice($this->polldata['ips'], -40); } /* asetetaanko eväste? */ if( $this->setcookie ) @setcookie("epvoted", TRUE, time() + $this->timeout); /* tallennetaan data */ if( $fp = @fopen($this->datafile, "w") ) { @fwrite($fp, serialize($this->polldata)); @fclose($fp); } return true; } return false; } function validate($data) { /* onko $_GET['vote'] mahdollinen vastausvaihtoehto */ if( ! is_numeric($data) || $data < 0 || $data >= count($this->polldata['options']) ) return false; return true; } /** * Tulostetaan kysymys * */ function showQuestion() { echo "<b>{$this->polldata['question']}</b><br /><br />\r\n"; for($i=0, $j=count($this->polldata['options']); $i<$j; $i++) { echo "» <a href='{$this->php_self}vote={$i}'>{$this->polldata['options'][$i]}</a><br>"; } } /** * Tulostetaan tulokset * */ function showResults() { $totalvotes = array_sum($this->polldata['votes']); echo "<b>{$this->polldata['question']}</b><br /><br />\r\n"; for($i=0, $j=count($this->polldata['options']); $i<$j; $i++) { $option = $this->polldata['options'][$i]; $votes = $this->polldata['votes'][$i]; $percents = @round($votes/$totalvotes*100)."%"; $imgwidth = @round($votes/$totalvotes*$this->maxwidth); echo "{$option} - {$percents} ({$votes})<br />\r\n"; // piirrettävä viiva, oleellisinta $imgwidth echo "<img src='vote_left.gif' height='10' vspace='2' />"; echo "<img src='vote_bar.gif' width='{$imgwidth}' height='10' vspace='2' />"; echo "<img src='vote_right.gif' height='10' vspace='2' /><br />\r\n"; } echo "<br />ääniä: {$totalvotes}\r\n"; } } ?>
epinstall.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>epoll asennus</title> <style> td { font-family: Tahoma; font-size: 0.7em; } </style> </head> <body> <form action="<?php print $_SERVER['PHP_SELF']; ?>" method="POST"> <table border="0" cellpadding="5" cellspacing="0" align="center" width="600"> <tr><td colspan="2"><h3>epoll asennus</h2></td></tr> <?php /* Datafile */ $datafile = 'epdata.txt'; define("CRLF", "\r\n"); function parse($string) { $string = trim($string); // $string = addslashes($string); return $string; } if( isset($_POST['act']) && $_POST['act'] == 'submit' ) { if( empty($_POST['question']) || empty($_POST['options']) ) { echo ' <tr><td colspan="2">tyhjää</td></tr>',CRLF; } else { $question = parse($_POST['question']); $options = array_map("parse", explode(CRLF, $_POST['options'])); $optioncount = count($options); $votes = array_fill(0, $optioncount, 0); if( $optioncount < 2 ) { echo ' <tr><td colspan="2">väh. 2 vaihtoehtoa</td></tr>',CRLF; } elseif( $optioncount > 12 ) { echo ' <tr><td colspan="2">max. 12 vaihtoehtoa</td></tr>',CRLF; } else { $polldata = array(); $polldata['question'] = $question; $polldata['options'] = $options; $polldata['votes'] = $votes; $polldata['ips'] = array(); if( $fp = @fopen($datafile, "w") ) { @fwrite($fp, serialize($polldata)); @fclose($fp); echo ' <tr><td colspan="2">tiedosto ',$datafile,' luotu onnistuneesti</td></tr>',CRLF; } else { echo ' <tr><td colspan="2">virhe avatessa tiedostoa',$datafile,'</td></tr>',CRLF; } @setcookie("epvoted", FALSE, time()); } } } else { ?> <td width="100">kysymys:</td> <td><input type="text" name="question" size="50"></td> </tr> <tr> <td valign="top">vaihtoehdot:<br>(1 / rivi)</td> <td><textarea name="options" cols="40" rows="7"></textarea></td> </tr> <tr> <td><input type="hidden" name="act" value="submit"</td> <td><input type="submit" value="tallenna"></td> </tr> <?php } ?> </table> </form> </body> </html>
Toimii hyvin!
sikapitkä sorsa mutta sikahyvin toimiikin!
P niinku purkkaa :)
Ei vaiteskaa ;D OMG mua ;D
ihan ok, mutta tuo parse() funktio pisti silmiin, kun siellä on vain trim komento :P
> ihan ok, mutta tuo parse() funktio pisti silmiin, kun siellä on vain trim komento :P
Joo, olet aivan oikeassa, funktio on täysin turha tuollaisenaan. Mutta jos jälkeenpäin löytyy tarvetta lisätä tuohon jotain, onnistuu se huomattavasti helpommin kun tuossa on tuo ko. funktio.
Ihan Hyvä, siisti ja toimiva scripti
Aihe on jo aika vanha, joten et voi enää vastata siihen.