Programowanie w języku PHP » FAQ

Jak zrobić sondę na plikach txt

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.

12 komentarzy

mcgryka9 2015-05-16 14:39

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

latrommi 2010-01-15 18:57

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

seba95 2008-05-05 19:57

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?

atchor 2006-07-05 22:10

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?

volky 2008-01-25 10:32

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

volky 2008-01-25 11:18

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 &lt;

Wolverine 2004-06-26 18:56

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

lofix 2004-06-14 14:22

mi to jakos nie chce dzialac :)


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

Wolverine 2004-06-13 18:37

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

Waldi 2004-06-13 18:04

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

Japcok 2004-06-11 22:23

CooBek wyluzuj men ;)

CooBek 2004-06-11 21:21

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