Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Modyfikacja skryptu sonda - dodanie informacji o głosowaniu
Forum PHP.pl > Forum > Przedszkole
asziatko
Witam,

Mam taki prosty skrypt sondy na stronę WWW

  1. <?
  2. $pyt = "Twoje Pytanie?";
  3. $odp[] = "1";
  4. $odp[] = "2";
  5. $odp[] = "3";
  6. $odp[] = "4";
  7. $glosowan = 1;
  8. $pl = "sonda.txt";
  9. $ip = $_SERVER["REMOTE_ADDR"];
  10. $o = $_GET["o"];
  11. $ile = count($odp);
  12. $f = fopen($pl, "r");
  13. $plik = fread($f, filesize($pl));
  14. fclose($f);
  15. preg_match_all("/$ip/i", $plik, $glos);
  16. if (($o>-1)and($o<$ile)and(count($glos[0])<$glosowan)) {
  17. $f = fopen($pl,"a");
  18. fputs($f, "<$o>$ip"); fclose($f);
  19. $plik .= "<$o>";
  20. }
  21. echo $pyt;
  22. for ($i=0;$i<$ile;$i++) {
  23. preg_match_all("/<$i>/i", $plik, $li);
  24. $wynik = "[". count($li[0]) ."]";
  25. echo "<br />$wynik <a href=\"strona.php?o=$i\">$odp[$i]</a>";
  26. }
  27. ?>


Skrypt zabezpieczony przed wielokrotnym głosowaniem. Zapis IP jest do pliku TXT. Brakuje mi w tym skrypcie takiej informacji jak:
  • Oddałeś Już Głos po kliknięciu po raz kolejny przez Użytkownika z tego samego adresu IP
  • Jak się odda głoś żeby pojawiała się informacja np. Dziękuje Twój Głoś Został Dodany.
Jak dodać i w którym miejscu w/w skryptu funkcję by dawała efekt informacji Oddałeś Już Głos i Dziękuje Twój Głoś Został Dodany?.
Lion_87
no ale skoro masz skrypt i chyba sprawdzasz czy takie ip oddalo juz glos to w czym problem?

jezeli oddal juz swoj glos wczesniej to po spr wstawiasz echo Oddałeś Już Głos
a jezeli nie oddał to po zapisaniu glosu wstawiasz echo z Dziękuje Twój Głoś Został Dodany
asziatko
Właśnie oto chodzi tylko nie wiem w którym to miejscu dać żeby wszystko ze sobą grało prawidłowo.
melkorm
no hmm a nie możesz dać np. zmiennej $error w której byś np. przechowywał treść błędu w zależności od sytuacji? i dać
  1. <?php
  2. if(error) echo $error;
  3. ?>

czy tam isset jak wolisz ;]

wyglądało by to np tak:
  1. <?php
  2. if (($o>-1)and($o<$ile)and(count($glos[0])<$glosowan)) {
  3. $f = fopen($pl,"a");
  4. fputs($f, "<$o>$ip"); fclose($f);
  5. $plik .= "<$o>";
  6. }
  7. else $error = 'Już oddałeś głos w tej sondzie!';
  8. ?>

;]
asziatko
Zrobiłem tak:

  1. <?
  2. $pyt = "Twoje Pytanie?";
  3. $odp[] = "1";
  4. $odp[] = "2";
  5. $odp[] = "3";
  6. $odp[] = "4";
  7. $glosowan = 1;
  8. $pl = "sonda.txt";
  9. $ip = $_SERVER["REMOTE_ADDR"];
  10. $o = $_GET["o"];
  11. $ile = count($odp);
  12. $f = fopen($pl, "r");
  13. $plik = fread($f, filesize($pl));
  14. fclose($f);
  15. preg_match_all("/$ip/i", $plik, $glos);
  16. if (($o>-1)and($o<$ile)and(count($glos[0])<$glosowan)) {
  17. $f = fopen($pl,"a");
  18. fputs($f, "<$o>$ip"); fclose($f);
  19. $plik .= "<$o>";
  20. }
  21. else $error = 'Już oddałeś głos w tej sondzie!';
  22. echo $pyt;
  23. for ($i=0;$i<$ile;$i++) {
  24. preg_match_all("/<$i>/i", $plik, $li);
  25. $wynik = "[". count($li[0]) ."]";
  26. echo "<br />$wynik <a href=\"strona.php?o=$i\">$odp[$i]</a>";
  27. }
  28. ?>


Bez rezultatów, sonda się wyświetla ale nie ma Już oddałeś głos w tej sondzie!.
melkorm
tak. bo go nie wyświetlasz smile.gif daj na dole
  1. <?php
  2. if(isset($error)) echo $error;
  3. ?>
i wyświetli ci się błąd ;]
asziatko
Faktycznie, dałem

  1. <?php
  2. if(isset($error)) echo $error;
  3. ?>


i wyświetla mi się napis Już oddałeś głos w tej sondzie!. Jedyny ból jest taki że on się wyświetla cały czas. Jak wejde na podstronę z sondą to już jest on widoczny. Jak klikne w daną odpowiedz, owszem głos jest nie ważny ale napis też jest.
batman
@asziatko popraw bbcode.
asziatko
Przepraszam za bbcode ale nie wiem gdzie on się znajduje.


wysłałem Ci PW z informacją co i jak
~batman
Lion_87
Cytat
Przepraszam za bbcode ale nie wiem gdzie on się znajduje.

klikasz na przycisk PHP i wszawiasz kod pomiedzy znaczniki.


moze tak?
  1. <?php
  2. if(isset($error)) (echo $error;)
  3. ?>
asziatko
Lion_87 dałem tak

Kod
<?php
      if(isset($error)) (echo $error;)
      ?>


i pojawia się błąd

Parse error: syntax error, unexpected T_ECHO in /home/serwer/public_html/sonda.php on line 31 a 31 linią jest

Kod
if(isset($error)) (echo $error;)


batman dzięki instrukcje na PW.
Lion_87
a skopiuj i wklej to :

  1. <?php
  2. if (isset($error)) {
  3.    echo $error;
  4.   }
  5. ?>
asziatko
Po zmianie na

Kod
<?php
if (isset($error)) {
    echo $error;
   }
?>


w ogóle nie zlicza głosów sonda.
melkorm
ok. no to jest oczywiste że wyświetla się zawsze bo akcja jest na tej samej stronei co sonda winksmiley.jpg
wrzuć w HTML w forma:
  1. <input type="hidden" name="submit" value="1" />


i kod php taki :
  1. <?
  2. $pyt = "Twoje Pytanie?";
  3. $odp[] = "1";
  4. $odp[] = "2";
  5. $odp[] = "3";
  6. $odp[] = "4";
  7. $glosowan = 1;
  8. $pl = "sonda.txt";
  9. $ip = $_SERVER["REMOTE_ADDR"];
  10. $o = $_GET["o"];
  11. $ile = count($odp);
  12. $f = fopen($pl, "r");
  13. $plik = fread($f, filesize($pl));
  14. fclose($f);
  15. preg_match_all("/$ip/i", $plik, $glos);
  16. if (($o>-1)and($o<$ile)and(count($glos[0])<$glosowan)) {
  17. $f = fopen($pl,"a");
  18. fputs($f, "<$o>$ip"); fclose($f);
  19. $plik .= "<$o>";
  20. }
  21. else if($_GET['submit']) {
  22.    $error = 'Już oddałeś głos w tej sondzie!';
  23. }
  24. echo $pyt;
  25. for ($i=0;$i<$ile;$i++) {
  26. preg_match_all("/<$i>/i", $plik, $li);
  27. $wynik = "[". count($li[0]) ."]";
  28. echo "<br />$wynik <a href=\"strona.php?o=$i\">$odp[$i]</a>";
  29. }
  30. if (isset($error)) {
  31.     echo $error;
  32.    }
  33. ?>
asziatko
melkorm zrobiłem tak jak napisałeś wrzuciłem Twoją modyfikację + w HTML
  1. <input type="hidden" name="submit" value="1" />
. Sonda się wyświetla, ale nic nie pisze że Już Oddałeś Głos w Sondzie!. Plik sonda.php daje przez include i wygląda to tak
Kod
<input type="hidden" name="submit" value="1" /><?php include('sonda.php');?>
.
melkorm
hm powinno działać ... a czy napewno ten input znajduje się między tagami formularza? może pokaż cały kod html snitch.gif?
asziatko
melkorm, tak to wygląda u mnie

  1. <div id="sonda">
  2. <div class="r1 tlo"></div><div class="r2 tlo"></div>
  3. <div class="r3 tlo"></div><div class="r4 tlo"></div>
  4. <div class="srodek tlo"><input type="hidden" name="submit" value="1" /><?php include('sonda.php');?></div>
  5. <div class="r4 tlo"></div><div class="r3 tlo"></div>
  6. <div class="r2 tlo"></div><div class="r1 tlo"></div>
  7. </div>
melkorm
no dobrze a gdzie jest :
  1. <form action="" method="get" >


?
asziatko
Dałem tak

  1. <div id="sonda">
  2. <div class="r1 tlo"></div><div class="r2 tlo"></div>
  3. <div class="r3 tlo"></div><div class="r4 tlo"></div>
  4. <div class="srodek tlo"><form action="" method="get" ><input type="hidden" name="submit" value="1" /><?php include('sonda.php');?></form></div>
  5. <div class="r4 tlo"></div><div class="r3 tlo"></div>
  6. <div class="r2 tlo"></div><div class="r1 tlo"></div>
  7. </div>


i nie działa worriedsmiley.gif .
melkorm
Hm. Dobra zacznijmy od początku :
czy głos przychodzi z innej strony? jeżeli tak to tam wrzuć ten przycisk "hidden" :]
asziatko
Tak wygląda u mnie plik sonda.php

Kod
<?
  $pyt = "Pytanie?";
  $odp[] = "Odp 1";
  $odp[] = "Odp 2";
  $odp[] = "Odp 3";
  $odp[] = "Odp 4";
  $glosowan = 1;
  $pl = "glosy.txt";
  $ip = $_SERVER["REMOTE_ADDR"];
  $o = $_GET["o"];
  $ile = count($odp);
  $f = fopen($pl, "r");
  $plik = fread($f, filesize($pl));
  fclose($f);
  preg_match_all("/$ip/i", $plik, $glos);
  if (($o>-1)and($o<$ile)and(count($glos[0])<$glosowan)) {
  $f = fopen($pl,"a");
  fputs($f, "<$o>$ip"); fclose($f);
  $plik .= "<$o>";
  }
  else if($_GET['submit']) {
  $error = '<div class="oddanie_glosu">Już Oddałeś Głos w Sondzie!</div>';
  }
  echo $pyt;
  for ($i=0;$i<$ile;$i++) {
  preg_match_all("/<$i>/i", $plik, $li);
  $wynik = "[". count($li[0]) ."]";
  echo "
  $wynik <a href=\"index.php?o=$i\">$odp[$i]</a>";
  }
  if (isset($error)) {
  echo $error;
  }
  ?>


On jest includowany w taki sposób
Kod
<?php include('sonda.php');?>


i jest dany do

  1. <div id="sonda">
  2. <div class="r1 tlo"></div><div class="r2 tlo"></div>
  3. <div class="r3 tlo"></div><div class="r4 tlo"></div>
  4. <div class="srodek tlo"><form action="" method="get" ><input type="hidden" name="submit" value="1" /><?php include('sonda.php');?></form></div>
  5. <div class="r4 tlo"></div><div class="r3 tlo"></div>
  6. <div class="r2 tlo"></div><div class="r1 tlo"></div>
  7. </div>


Plik sonda.php znajduje się w katalogu głownym strony.
melkorm
a daj zamiast:
  1. <?php
  2. echo "$wynik <a href=\"index.php?o=$i\">$odp[$i]</a>";
  3. ?>


to:

  1. <?php
  2. echo $wynik.'<a href="index.php?o='.$i.'&submit=1">'.$odp[$i].'</a>';
  3. ?>

i wywal forma i przycisk :|
asziatko
Teraz działać działa. Dałem

Kod
<div id="sonda">
<div class="r1 tlo"></div><div class="r2 tlo"></div>
<div class="r3 tlo"></div><div class="r4 tlo"></div>
<div class="srodek tlo"><?php include('sonda.php');?></div>
<div class="r4 tlo"></div><div class="r3 tlo"></div>
<div class="r2 tlo"></div><div class="r1 tlo"></div>
</div>


A jak zrobić <br /> żeby [47] było ustawione na równi z Era?.

Można to zobaczyć na http://www.btsy.eu/tarnow.html . I żeby wyniki były po lewej stronie nie po prawej?.

W ramach testu mogę prośić o kliknięcie w odpowiedz i żeby zobaczyć jak będzie wyglądało głosowanie?. I po oddaniu głosu kliknąć raz jeszcze czy pojawia się Już Oddałeś Głos w Sondzie!?.

Ja już sprawdzić nie mogę bo już oddałem głos.
melkorm
zamień popzrednie na :
  1. <?php
  2. echo '<p><a href="index.php?o='.$i.'&submit=1">'.$odp[$i].'</a> '.$wynik.'</p>';
  3. ?>

i powinno być dobrze ... . Ty naparwde nie rozumiesz tego kodu? :]

no i niby działa ;p
asziatko
melkorm uwierz mi mało co rzeczy rozumiem z PHP. Chciał bym, naprawde chciał bym się nauczyć i rozumieć PHP i pisać proste a funkcjonalne skrypty na swoje potrzeby bo tak za każdym razem wstyd prosić Was na Forum o pomoc. Dobrze że jest takie Forum w ogóle!. Ale jak trzeba to już muszę napisać prośbę o pomoc.

Teraz sam prostą rzecz zrobiłem - wyniki przeniosłem na lewą stron ęi zamiast <p></p> dałem tylko <br />.

Dużo lepiej radze sobie w HTML'u.
Szunaj85
Weź też pod uwagę, że nie wszyscy mają stałe IP. Niektórzy mają zmienne IP przez co ktoś może zagłosować pare razy i twój skrypt nic na to nie poradzi. To natomiast skutkuje tym, że sonda jest nie do końca wiarygodna. happy.gif
michalkjp
Cytat(Szunaj85 @ 6.10.2008, 23:17:59 ) *
Weź też pod uwagę, że nie wszyscy mają stałe IP. Niektórzy mają zmienne IP przez co ktoś może zagłosować pare razy i twój skrypt nic na to nie poradzi. To natomiast skutkuje tym, że sonda jest nie do końca wiarygodna. happy.gif


Ja bym dodał jeszcze jakąś identyfikacje za pomocą ciasteczka. Po samym IP nie powinno się blokować sondy, bo są duże sieci z wieloma maszynami za NAT'em i blokowanie takiego IP nie jest dobrym pomysłem na popularnej stronie. Jest jeszcze jakiś dobry sposób na identyfikację użytkownika (poza wymyślnym skanowaniem ofiary nmapem i zapisywaniem informacji o niej winksmiley.jpg)?
asziatko
Witam,

A jest możłiwość jeszcze dokonać takiej zmiany że w momencie zagłosowania pojawia się np. Dziękuje Za Oddanie Głosu a dopiero później jak użytkownik wchodzi z tego samego IP pojawia się Już Oddałeś Głos w Sondzie?.
Szunaj85
Jasne, że tak.
Proponuję napisać warunek.
Jeżeli IP osoby biorącej udział w sondzie nie znajduje się w pliku txt wyświetl "Dziękuje Za Oddanie Głosu",
w przeciwnym wypadku wyświetl "Już Oddałeś Głos w Sondzie" i zablokuj możliwość dodania głosu.
Pamiętaj jednak o tym co napisałem Ci wcześniej! rolleyes.gif
asziatko
Szunaj85 zdaje sobie sprawę że

Cytat
Weź też pod uwagę, że nie wszyscy mają stałe IP. Niektórzy mają zmienne IP przez co ktoś może zagłosować pare razy i twój skrypt nic na to nie poradzi. To natomiast skutkuje tym, że sonda jest nie do końca wiarygodna.


Ruchu w sondzie nie ma aż tak duże, jak by była taka luź, doskonała to by punktowało dla Serwisu. Ale narazie mi taka wystarczy. Ewentualnie ją tylko zmienić/zmodyfikować pod względem właśnie tego warunku co piszesz Szunaj85. A mógł byś mi napisać zarys jak taki warunek ma wyglądać?. Znając moje doświadczenie w PHP nie wiele dam rady ale spróbuje, nie mówie nie...
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.