Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP]Robię sondaż, czyli zliczanie głosów na tak i nie
Forum PHP.pl > Forum > Przedszkole
ats2008
Witajcie,

Z góry mówię, że jestem totalnie początkujący w php, ale się nie poddaję smile.gif.

Założenie jest takie, żeby na pytanie były 2 możliwości odpowiedzi. Skrypt ma za zadanie zliczać głosy i po oddaniu głosu wyświetlić wynik głosy na tak i nie.

Po kilku dniach prób!!!, ocieraniu potu z czoła, korzystania z dziesiątków forów i postów, porad profesjonalistów i znachorów php - wymodziłem coś takiego - działa, ale jest totalnie siermiężne:

formularz (przyciski tak i nie):

  1. <div><form id="formtak" name="formyes">
  2. <input type="hidden" name="buttonyes" />
  3. <input type="submit" value="Tak" />
  4. </form></div>
  5.  
  6. <div><form id="formnie" name="formnie">
  7. <input type="hidden" name="buttonno" />
  8. <input type="submit" value="Nie" />
  9. </form></div>


skrypt dodający do pliku tak.txt lub nie.txt liczbę 1 po naciśnięciu odpowiedniego przycisku:

  1. <?php
  2. //Wczytanie z pliku liczby oraz dodanie do niej 1.
  3. $tak=file("tak.txt");
  4. $liczbatak=$tak[0];
  5. $takplus=$liczbatak + 1;
  6.  
  7. //Wczytanie z pliku liczby nie oraz dodanie do niej 1/
  8. $nie=file("nie.txt");
  9. $liczbanie=$nie[0];
  10. $nieplus=$liczbanie + 1;
  11.  
  12. //dodanie do tak.txt +1.
  13. if (isset($_REQUEST['buttonyes']))
  14. {$fp=fopen("tak.txt", "w+");
  15. //blokujemy plik tak.txt do zapisu:
  16. flock($fp, 2);
  17. //zapisujemy dane do pliku:
  18. fwrite($fp, $takplus);
  19. //odblokowujemy plik:
  20. flock($fp, 3);
  21. //zamykamy plik:
  22. fclose($fp);
  23. }
  24. //dodanie do nie.txt +1.
  25. else if (isset($_REQUEST['buttonno']))
  26. {
  27. $fnie=fopen("nie.txt", "w+");
  28. //opis jak powyżej
  29. flock($fnie, 2);
  30. fwrite($fnie, $nieplus);
  31. flock($fnie, 3);
  32. fclose($fnie);
  33. }
  34.  
  35. //wyświetla wynik po naciśnięciu submit
  36. if (isset($_REQUEST['buttonyes']) || isset($_REQUEST['buttonno']))
  37.  
  38. {print ' <p>Na Tak głosowało: '.fgets(fopen("tak.txt","r")).' osób.</p>
  39. <p>Na Nie głosowało: '.fgets(fopen("nie.txt", "r")).' osób.</p>';}
  40.  
  41. ?>


Jest może jakiś zgrabniejszy sposób na napisanie tego skryptu?. Szczególnie próbowałem inkrustować zmienną $liczbatak++ (lub $liczbanie++), ale zapisywało w pliku txt i wyświetlało coś takiego: id #3. O co chodzi?

I sorry za zawracanie gitary:).

Z góry dzięki,

Pozdrawiam.
DiH
Poległeś na etapie HTML. Jeżeli nie masz możliwości użycia MySQL, to możesz zrobić co następuje. Po pierwsze stwórz jeden <form>, w nim dwa radio buttony do wyboru, których value to odpowiednio 0 i 1.

Twój plik powinien mieć formę np:
A|B
Gdzie:
A - to liczba wszystkich głosów (zwiększana po każdym wywołaniu skryptu)
B - liczba głosów na nie (A-B = ilość głosów na tak)

Jeżeli w pliku będzie: 10|3, to używasz na jego zawartości funkcji explode i operujesz na uzyskanych w ten sposób danych. Jeżeli masz możliwość postawienia skryptu na php5, to używaj file_put_contents i file_get_contents zamiast serenady fopen, fwrite etc.

Pozdrawiam
ats2008
Dzięki stary,

teraz przechodzę w fazę testowań - napiszę wyniki. Pierwsze co mi jednak przychodzi do głowy to pytanie, a co się stanie jeśli będzie do wyboru więcej opcji? np. pięć? Nie uśmiecha mi się odejmować od A-(b+c+d+e+...+n), ale najpierw przetestuję smile.gif
bemol
podałeś możliwości TAK i NIE, więc nie rozumiem, dlaczego ma działać dla 5.
Wtedy możesz sobie po prostu zrobić A|B|C|D|E
i zapisywać wszystkie opcje.
Suma wszystkich to będzie liczba 'głosowań'.
ats2008
Witajcie, DiH zarobiłeś u mnie browca za pokazanie mi funkcji explode i resztę.

Co do większej ilości opcji to po przetestowaniu metody nie mam pytań i wątpliwości:). Ogólnie podoba mi się bardzo i polecam innym.

W necie jednak podawali często i gęsto tą starszą metodę z fwrite etc.

Oto moje rozwiązanie (działa) :

  1. <form method="">
  2. <input type="radio" name="tak" value="0" />Tak,
  3. <input type="radio" name="nie" value="1" />Nie.<br />
  4. <input type="submit" name="submit" value="Głosuj" />
  5. </form>


  1. <?php
  2. $file='suma.txt';
  3. //sprawdzamy, czy istnieje plik suma.txt
  4. $jestfile=file_exists($file);
  5. //jeśli plik nie został utworzony, tworzymy nowy plik i zapisujemy zawartość 0/0:
  6. if (!$jestfile){fopen($file, 'r+');
  7. $begin="0/0";
  8. file_put_contents($file, $begin);}
  9.  
  10. //pobieranie zawartości suma.txt w postaci np. 100/50.
  11. $suma = file_get_contents($file);
  12. //rozbijamy treść na części (elementy tablicy $part[0],...
  13. $part=explode("/", $suma);
  14.  
  15. //sprawdzamy, jaki był wybór:
  16. if (isset($_REQUEST["tak"]))
  17. {
  18. $part[0]++;
  19. $part[1]++;//dodajemy 1 do punktów na tak;
  20. $nie=($part[0]-$part[1]);
  21. echo "Ogółem było: <b>".$part[0]."</b> z czego na TAK: <b>".$part[1]."</b>, a na NIE: <b>".$nie."</b> głosów.";
  22.  
  23. }
  24. else if (isset($_REQUEST["nie"]))
  25. {
  26. $part[0]++;
  27. $nie=($part[0]-$part[1]);
  28. echo "Ogółem było: <b>".$part[0]."</b> z czego na TAK: <b>".$part[1]."</b>, a na NIE: <b>".$nie."</b> głosów.";
  29. }
  30.  
  31. else if (isset($_REQUEST["submit"]) && !isset($_REQUEST["nie"]) && !isset($_REQUEST["nie"])) echo "Nie dokonałeś wyboru, Koleś - spróbuj jeszcze raz!!!";
  32. //zapisujemy teraz wynik głosowania do pliku suma.txt.
  33. $newsuma=$part[0]."/".$part[1];
  34. file_put_contents($file, $newsuma);
  35. //well done, dzięki DiH :)
  36. ?>


Poza tym jest jeszcze sprawa utworzenia pliku suma.txt, tzn. założyłem sytuację, że tego pliku nie ma... i chciałbym, żeby skrypt go utworzył smile.gif.
Użyłem do tego funkcji fopen, a dokładniej: fopen($file, 'r+'), a potem dopisałem do niego wartość: 0/0.

Problem jest w tym, że kiedy usunę plik suma.txt do sprawdzenia, wywala mi coś taki komunikat: Warning: fopen(suma.txt) [function.fopen]: failed to open stream: No such file or directory in E:\wamp\www\temporary\explode\index.php on line 21 (21- to fopen).
ale jednocześnie zapisuje 0/0 do pliku, ale beznadziejnie to wygląda...

Znacie może jakieś inne sposoby utworzenia pliku txt bo w googlach faszerują fopen...

Z góry dzięki.

mortus
Przede wszystkim jeżeli jakiś plik otwierasz za pomocą fopen(...), to powinieneś go zamknąć za pomocą fclose(...). Może to jest przyczyna problemu, ale głowy za to nie dam?
EDIT:
Sprawdziłem to jeszcze raz i okazuje się, że funkcja file_get_contents($filename) zwraca false, jeżeli nie znajdzie pliku o nazwie $filename. Z kolei funkcja file_put_contents($filename, $content) sama otwiera plik, zapisuje zawartość i zamyka plik, w związku z czym nie ma potrzeby otwierania pliku za pomocą fopen(...). Poprawiony kod:
  1. <?php
  2. $filename = 'suma.txt';
  3. $content = file_get_contents($filename);
  4. if(!$content) {
  5. $part[0] = 0;
  6. $part[1] = 0;
  7. } else {
  8. $part = explode('/', $content);
  9. }
  10. if(isset($_REQUEST["tak"])) {
  11. $part[0]++;
  12. $part[1]++;
  13. $nie = ($part[0] - $part[1]);
  14. echo 'Ogółem było: <b>' . $part[0] . '</b> z czego na TAK: <b>' . $part[1] . '</b>, a na NIE: <b>' . $nie . '</b> głosów.';
  15. } else if(isset($_REQUEST["nie"])) {
  16. $part[0]++;
  17. $nie = ($part[0] - $part[1]);
  18. echo 'Ogółem było: <b>' . $part[0] . '</b> z czego na TAK: <b>' . $part[1] . '</b>, a na NIE: <b>' . $nie . '</b> głosów.';
  19. } else if (isset($_REQUEST["submit"]) && !isset($_REQUEST["tak"]) && !isset($_REQUEST["nie"])) {
  20. echo "Nie dokonałeś wyboru, Koleś - spróbuj jeszcze raz!!!";
  21. }
  22. $newcontent = $part[0] . '/' . $part[1];
  23. file_put_contents($filename, $newcontent);
  24. ?>
ats2008
Dzięki mortus, chyba na browary nie wyrobię smile.gif.

Najprostsze rozwiązania są najlepsze, Twoje rozwiązanie ze sprawdzeniem pliku txt bardzo mi się podoba. Po co kombinować z tworzeniem nowego, jak można to obejść smile.gif.

Teraz kod wygląda cacy.

Ogólnie, nie mam więcej pytań, temat do zamknięcia.

Pozdrawiam!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.