Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: epoll

Sivun loppuun

folio [23.01.2004 14:23:53]

#

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>

petrinm [24.01.2004 11:08:22]

#

Toimii hyvin!

sooda [24.01.2004 15:59:07]

#

sikapitkä sorsa mutta sikahyvin toimiikin!

jrantala [24.01.2004 16:59:20]

#

P niinku purkkaa :)

jrantala [24.01.2004 16:59:54]

#

Ei vaiteskaa ;D OMG mua ;D

T.M. [24.01.2004 20:01:41]

#

ihan ok, mutta tuo parse() funktio pisti silmiin, kun siellä on vain trim komento :P

folio [26.01.2004 17:18:59]

#

> 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.

Kaido [04.03.2004 19:29:11]

#

Ihan Hyvä, siisti ja toimiva scripti


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta