Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP] Błąd skryptu głosowania
Forum PHP.pl > Forum > Przedszkole
JMDvP
Witam
Mam funkcjonujący mechanizm głosowania w html i php (prawdopodobnie 4.x) oparty na ciasteczkach, dla którego została przygotowana modyfikacja zabezpieczająca przed głosowaniem z tego samego IP. Lecz napisana w php5 prawdopodobnie.
Minimalnie edytowałem tak, że już nie wyświetla błędów, ale z jakiegoś powodu zawiesza się coś i nie idzie dalej.

Aktualnie plik odpowiedzialny za dopisanie głosu wygląda tak:

  1. <?PHP
  2. require('voter.php');
  3.  
  4. $voter = new Voter();
  5.  
  6. if($voter->isPossibleToVote()){
  7. $voter->saveVoteDate();
  8.  
  9. $file = fopen("/include/Konkurs/zaglebie2/sonda.txt","r+"); /*otwieramy plik sonda.txt*/
  10. $linia = fgets($file, 80);
  11. $tab = explode("#",$linia); /*zapisujemy linię do tablicy*/
  12. $tbl["a"] = $tab[0];/*którš zapisujemy do asocjacyjnej*/
  13. $tbl["b"] = $tab[1];
  14. $tbl["c"] = $tab[2];
  15. $tbl["d"] = $tab[3];
  16. $tbl["e"] = $tab[4];
  17. $tbl["f"] = $tab[5];
  18. $tbl["g"] = $tab[6];
  19. $tbl["h"] = $tab[7];
  20. $tbl["i"] = $tab[8];
  21. $tbl["j"] = $tab[9];
  22. $tbl["k"] = $tab[10];
  23. $tbl["l"] = $tab[11];
  24. $tbl["m"] = $tab[12];
  25. $tbl["n"] = $tab[13];
  26. $tbl["o"] = $tab[14];
  27. $tbl["p"] = $tab[15];
  28. $tbl["q"] = $tab[16];
  29. $tbl["r"] = $tab[17];
  30. $tbl["s"] = $tab[18];
  31. $tbl["t"] = $tab[19];
  32. $tbl["u"] = $tab[20];
  33. $tbl["v"] = $tab[21];
  34. $tbl["w"] = $tab[22];
  35. $tbl["x"] = $tab[23];
  36. $tbl["y"] = $tab[24];
  37. $tbl["z"] = $tab[25];
  38. $tbl["aa"] = $tab[26];
  39. $tbl["bb"] = $tab[27];
  40. $tbl["cc"] = $tab[28];
  41. $tbl["dd"] = $tab[29];
  42.  
  43.  
  44. ++$tbl[$_POST['odp']];/*zwiększamy o jeden iloœć osób głosujšcych na danš odpowiedŸ*/
  45. fseek($file, 0);/*przesuwamy strumień pliku do poczštku*/
  46. fwrite($file, $tbl["a"]."#".$tbl["b"]."#".$tbl["c"]."#".$tbl["d"]."#".$tbl["e"]."#".$tbl["f"]."#".$tbl["g"]."#".$tbl["h"]."#".$tbl["i"]."#".$tbl["j"]."#".$tbl["k"]."#".$tbl["l"]."#".$tbl["m"]."#".$tbl["n"]."#".$tbl["o"]."#".$tbl["p"]."#".$tbl["q"]."#".$tbl["r"]."#".$tbl["s"]."#".$tbl["t"]."#".$tbl["u"]."#".$tbl["v"]."#".$tbl["w"]."#".$tbl["x"]."#".$tbl["y"]."#".$tbl["z"]."#".$tbl["aa"]."#".$tbl["bb"]."#".$tbl["cc"]."#".$tbl["dd"]); /*zapisujemy dane do pliku oddzielajšc je "#"*/
  47.  
  48. Header("Location: http://...page=tak2");/*komunikat o akceptacji głosu*/
  49.  
  50. } else
  51. Header("Location: http://...page=nie2");/*komunikat o braku akceptacji głosu*/
  52. ?>


Kolejny plik odpowiedzialny za weryfikację ip:

  1. <?php
  2.  
  3. /**
  4.  * Class Voter
  5.  */
  6. class Voter
  7. {
  8.  
  9.  
  10. function isPossibleToVote()
  11. {
  12. $ip = $this->getIp();
  13. if ($ip === null) {
  14. return false; //nie można zidentyfikować IP
  15. }
  16.  
  17. $ips = $this->read();
  18.  
  19. if (!isset($ips[$ip])) {
  20. return true; //nie głosował jeszcze
  21. } elseif (strtotime($ips[$ip]) < strtotime("-30 minutes")) {
  22. return true; //głosował, ale czas minął
  23. } else {
  24. return false;
  25. }
  26. }
  27.  
  28. function saveVoteDate()
  29. {
  30. $ip = $this->getIp();
  31.  
  32. $ips = $this->read();
  33.  
  34. $ips[$ip] = date('Y-m-d H:i:s');
  35.  
  36. $this->write($ips);
  37. }
  38.  
  39. /**
  40.   * @return array
  41.   */
  42. function read()
  43. {
  44. if (file_exists('voting_ips.txt')) {
  45. $serializedData = file_get_contents('voting_ips.txt');
  46.  
  47. if ($serializedData) {
  48. return unserialize($serializedData);
  49. } else {
  50. return array();
  51. }
  52. } else {
  53. return array();
  54. }
  55. }
  56.  
  57. /**
  58.   * @param array $ips
  59.   */
  60. function write()
  61. {
  62. file_put_contents('voting_ips.txt', serialize($ips), LOCK_EX);
  63. }
  64.  
  65. /**
  66.   * @return string|null
  67.   */
  68. function getIp()
  69. {
  70. $ip_keys = array(
  71. 'HTTP_CLIENT_IP',
  72. 'HTTP_X_FORWARDED_FOR',
  73. 'HTTP_X_FORWARDED',
  74. 'HTTP_X_CLUSTER_CLIENT_IP',
  75. 'HTTP_FORWARDED_FOR',
  76. 'HTTP_FORWARDED',
  77. 'REMOTE_ADDR'
  78. );
  79. foreach ($ip_keys as $key) {
  80. if (array_key_exists($key, $_SERVER) === true) {
  81. foreach (explode(',', $_SERVER[$key]) as $ip) {
  82. // trim for safety measures
  83. $ip = trim($ip);
  84. // attempt to validate IP
  85. if ($this->validateIp($ip)) {
  86. return $ip;
  87. }
  88. }
  89. }
  90. }
  91.  
  92. return isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null;
  93. }
  94.  
  95. /**
  96.   * @param string $ip
  97.   * @return bool
  98.   */
  99. function validateIp($ip)
  100. {
  101. if (filter_var($ip, FILTER_VALIDATE_IP,
  102. FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false
  103. ) {
  104. return false;
  105. }
  106.  
  107. return true;
  108. }
  109. }
  110.  


Resztę, czyli prezentację wyników mam i powinna działać po przejściu etapu weryfikacji i dopisaniu głosu.
Czy mogę prosić o sprawdzenie kodu?
patwoj98
Czemu nie zapiszesz wyników w bazie danych?
Mniej roboty, a potem możesz sobie txt'ka wytworzyć przecież.
JMDvP
Dla mnie to obojętne, nie wiem co jest prostsze, biorę to co znajdę, mógłaby być i baza, to nie moja twórczość smile.gif
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.