PHP FAQ

Jak zrobić sondę na plikach txt

Wolverine

Kolejny mini art z cyklu bajery na strony WWW bez baz danych. Tym razem stworzymy sonde.

Oczywiście jak zwykle na sam początek, zabezpieczam się, że być może istnieją lepsze/łatwiejsze sposoby, ale nie ma ich na 4p.

Na początek stworzymy kilka plików:

poll.php - będzie to główny skrypt sondy
vote.php - skrypt zapisujący oddany głos
poll.txt - gdzie będą znajdować się odpowiedzi na pytanie
poll_q.txt - tutaj będzie pytanie do naszej sondy
poll_a.txt - zbiór odpowiedzi

Pamiętajmy o ustawieniu CHMODów plików txt na 666.

Zawartość pliku poll.php:

<?
  function file_GetLine ($filename, $index) {
    $file = fopen ($filename, "r");
    $line = -1;
    while (!feof ($file)) {
      $buffer = fgets($file, 4096);
      $line++;
      if ($line == $index) {
        fclose ($file);
        return $buffer;
      }
    }
    fclose ($file);
  }
 
  function file_InsertLine ($filename, $line) {
    $fp = fopen ($filename, "a");
    flock($fp, LOCK_EX);
    fputs ($fp, $line . "rn");
    flock($fp, LOCK_UN);
    fclose ($fp);
  }
 
  function file_ReadFromFile ($filename) {
    $fp = fopen ($filename, "r");
    $file = fread($fp, filesize ($filename));
    fclose ($fp);
    return $file;
  }
 
  function Voted() {
    $votes = file('poll.txt');
    for($q=0;$q<count($votes);$q++) {
      $vote = explode('`', $votes[$q]);
      if ($_SERVER['REMOTE_ADDR'] == $vote[1]) {
        return 1;
      }
    }
    return 0;
  }
 
  function GetA($index) {
    return file_GetLine('poll_a.txt', $index);
  }
 
  echo(file_ReadFromFile('poll_q.txt') . '<br /><br />');
 
  $as = file('poll_a.txt');
 
  $voted = Voted();
  if($voted == 1) {
    $votes = file('poll.txt');
    for($q=0;$q&lt;count($votes);$q++) {
      $vote = explode('`', $votes[$q]);
      $w = $vote[0];
      $v[$w]++;
    }
 
    for ($q=0;$q<count($as);$q++) {
      if(!isset($v[$q])){
        $v[$q] = 0;
      }
    }
    foreach($v as $key => $value) {
      if ($value &gt; $max) { $max = $value; }
    }
    if ($max &lt; 25) { $e = 2; }
    if ($max &lt; 10) { $e = 4; }
    if ($max < 5) { $e = 10; }
    foreach($v as $key => $value) {
      echo(GetA($key) . ' - ' . $value . '<br />');
      $width = $value * $e;
      if ($width &gt; 50) { $width = 50; }
      echo('<hr style="height:4px;border:2px solid #666;" align="left" width="' . $width . '" />');
    }
  } else {
    echo('<form method="POST" action="vote.php">');
    for ($q=0;$q&lt;count($as);$q++) {
      echo('<input type="radio" name="vote" value="' . $q . '" > ' . $as[$q] . '<br />');
    }
    echo('<br /><input type="submit" value="Glosuj"></form>');
  }
?&gt;

Plik vote.php:

<?
  function file_InsertLine ($filename, $line) {
    $fp = fopen ($filename, "a");
    flock($fp, LOCK_EX);
    fputs ($fp, $line . "rn");
    flock($fp, LOCK_UN);
    fclose ($fp);
  }
 
  $vote = $_POST['vote'];
  file_InsertLine('poll.txt', $vote . '`' . $_SERVER['REMOTE_ADDR'] . '`');
  header('Location: index.php'); //Tutaj adres strony, na której includujemy sonde
?>

Użycie:

Teraz wystarczy, że napiszemy pytanie (plik poll_q.txt) i odpowiedzi (plik poll_a.txt, jedna pod drugą) i mamy gotową sonde. Żeby umieścić ją na swojej stronie wpisz w żądanym miejscu

<? include ('poll.php'); ?>

. Sonda zabezpiecza się przed ponownym głosowaniem poprzez zapisywanie numerów IP głosujących.

FAQ

12 komentarzy

hm.. troche dziwny skrypt wedlug mnie ale jestem poczatkowym programista w php ale nie oto chodzi chodzi o fragment pliku
$vote = $_POST['vote'];
file_InsertLine('poll.txt', $vote . '' . $_SERVER['REMOTE_ADDR'] . '');
header('Location: index.php');
nie wiem zabardzo jak na moj skrypt go zmienic bo mam cos takiego (fragment)
$son = '00.000.000.000'; //adres ip
if ($_SERVER['REMOTE_ADDR'] == $son)
i teraz nie wiem jak fragment $son = '00.000.000.000'; //adres ip przenies do pliku a w tym zrobic to zeby z niego to czytalo
ju prubowalem tak:
require_once('ip.txt')
if ($_SERVER['REMOTE_ADDR'] == $son)
i podobnie ale nie dzialalo zna ktos moze rade na ten problem?

Specjalnie zarejestrowalem sie na tym portalu, zeby podziekowac :) DZIEKI!
btw. jak dodac, zeby mozna bylo zobaczyc ile lacznie ludzie glosow oddali? :) pzdr!

a jak bym chciał więcej pytań niż jedno? Co trzeba zrobić?

Notice: Undefined variable: v in \poll.php on line 56
Notice: Undefined index: 0 in
\poll.php on line 56
Notice: Undefined variable: max in ***\poll.php on line 65

jak temu zaradzic?

W poll.php
źle przekodowało na stronę
wszystkie momenty z < zamieniamy na znak mniejsze "<"
a > na ">"

udało mi się w końcu uruchomić :D a tak jeszcze dodając od siebie
to się można pobawić w rozbudowe tego skrypciku
ja sobie grafike ulepszam w linijce nr 74
echo('');
Ogólnie oceniając skrypt to za prostotę jego i za wyłumaczenie o co chodzi to 9/10
minus za to że nie ma mozliwości pobrania go wtedy można by było uniknąć błedów typu przekodowania znaków na hieroglify typu <

Poprawione, brakowalo tam funkcji GetLine, ale co do 'Empty delimiter' ... u mnie jest normalnie :/

mi to jakos nie chce dzialac :)


Warning: explode(): Empty delimiter. in /usr/home/karol/public_html/sonda/poll.php on line 20

Chodzi o index.php? Po prostu tam dajesz adres na ktory ma przejsc po glosowaniu. Jesli to tylko sonda to zamien index.php na poll.php

a mi po zagłosowaniu wywala ze nie może znaleźć pliku :(

CooBek wyluzuj men ;)

Jaa to mam szczęście!! [glowa] Wlasnie przed chwila sie glowilem nad swoja sonda do serwisu, akurat skonczylem, patrze na 4p a tu wskazwka Wolverine'a !! Trza być zdolnym.. ;-( ;d