Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [HTML][PHP]Robię sondaż, czyli zliczanie głosów na tak i nie
ats2008
post 22.02.2010, 19:36:51
Post #1





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 11.06.2009
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
DiH
post 22.02.2010, 20:14:29
Post #2





Grupa: Zarejestrowani
Postów: 251
Pomógł: 34
Dołączył: 7.01.2010

Ostrzeżenie: (0%)
-----


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

Ten post edytował DiH 22.02.2010, 20:19:40
Go to the top of the page
+Quote Post
ats2008
post 23.02.2010, 20:28:52
Post #3





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 11.06.2009
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
bemol
post 23.02.2010, 20:39:28
Post #4





Grupa: Zarejestrowani
Postów: 286
Pomógł: 29
Dołączył: 5.04.2007
Skąd: Rymanów Zdrój/Rzeszów

Ostrzeżenie: (0%)
-----


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


--------------------
Tym ludziom zaufałem i dobrze na tym wyszedłem:
kresh
Darti
piotrekkr
Bez nich wiele bym nie zrobił. Dzięki im za to!
Go to the top of the page
+Quote Post
ats2008
post 23.02.2010, 22:42:27
Post #5





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 11.06.2009
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.



Ten post edytował ats2008 23.02.2010, 22:50:35
Go to the top of the page
+Quote Post
mortus
post 23.02.2010, 23:48:24
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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


Ten post edytował mortus 24.02.2010, 09:16:05
Go to the top of the page
+Quote Post
ats2008
post 24.02.2010, 21:45:03
Post #7





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 11.06.2009
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.08.2025 - 23:23