Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z klasą
Forum PHP.pl > Forum > Przedszkole
Nicc0
Witam. Ostatnio zacząłem bawić się programowaniem obiektowym. Chodzi tutaj mianowicie o zasięg zmiennych. Przeczytałem trochę artykułów na ich temat i natrafiłem na problem, którego nie potrafię rozwiązać.

Mam taki kod: (Nie jestem święcie przekonany, że jest on dobry)

  1. public function SpamBot() {
  2.  
  3. global $InfoBot, $info_nr, $flood;
  4.  
  5. if(empty($infoBot)) {
  6. $InfoBot = true;
  7. $info_nr = 1;
  8. }
  9.  
  10. if($InfoBot) {
  11. $this->sendMessage("Wiadomosc nr ".$info_nr);
  12.  
  13. if ($info_nr = 10) {
  14. $info_nr = 1;
  15. } else {
  16. $info_nr++;
  17. }
  18. $flood = time() + 60;
  19. $InfoBot = false;
  20. } else {
  21. if(time() > $flood) {
  22. $InfoBot = true;
  23. }
  24. }
  25. }


Dodam iż funkcje wywołuje w pętli na zasadzie:

  1. do {
  2. $this->SpamBot();
  3. } while (true);


W skrócie: moim zamiarem było, aby funkcja wysyłała wiadomość po kolei od 1 do 10 co X sekund, w tym przypadku co 60. Innym sposobem zrobić tego nie umiałem.

Z góry dzięki, za wszystkie odpowiedzi.
Turson
Zmienne powinieneś przekazywać jako parametr albo własność klasy a nie global.
nospor
Cytat
i natrafiłem na problem, którego nie potrafię rozwiązać.
Z racji ze wrozek u nas nie ma to i my ci niestety tez nie powiemy jak go rozwiązac. Co innego, gdybys raczyl napisac jakiz to masz ten problem, ale tak jak teraz, nie da sie.
tzm
Ja się dziwie że widząc funkcję SpamBot w ogóle odpisujecie na jego pytania.

Idź z tym w cholerę ale nie tu. To forum z klasą, a nie żadne anonymousowe syfy.
ZaXaZ
@mitorski, to może być zabezpieczenie anty floodowe,

if ($info_nr = 10) { //?
Nicc0
@turson: Trochę o tym poczytałem, coś kombinowałem i wystrugałem coś takiego. Ale nie pykło. (kod niżej)
@nospor: Tak wyszło, mój błąd. Wyleciało z głowy, aby opisać dokładniej problem.
@mitorski: Dzięki, za pomoc.
@ZaXaZ: Nie do końca, ale zabezpieczenie floodowe jest.

  1. class bot {
  2.  
  3. private $SpamBotInfo;
  4. private $SpamBotInfoNr;
  5. private $SpamBotFlood;
  6.  
  7. public function SpamBot() {
  8.  
  9. if(empty($this->SpamBotInfo)) {
  10. $this->SpamBotSet(true, 1); //Ustawienie parametrow podczas pierwszego wywolania.
  11. }
  12.  
  13. if($this->SpamBotInfo) { // Zabezpieczenie Floodowe
  14. echo ("Wiadomosc nr.".$this->SpamBotInfoNr."</br>");
  15.  
  16. if ($this->SpamBotInfoNr = 10) { // Jesli funkcja wykona sie 10 razy reset $InfoNr
  17. $InfoNr = 1;
  18. } else {
  19. $this->SpamBotAddInfo($InfoNr); // Jesli nie, wykona sie funkcji ktora doda do +1
  20. }
  21. $Flood = time() + 60; // Ustawienie Anty Floodu na 1 min
  22. $InfoBot = false; // I zmiana ustawienie false, aby funkcja nie mogla sie wykonac.
  23.  
  24. $this->SpamBotSet($InfoBot, $InfoNr, $Flood); // Wstawienie wszystkich argumentow
  25. } else {
  26. if(time() > $this->SpamBotFlood) { // jesli aktualny czas jest wiekszy od anty floodu
  27. $this->SpamBotSet(true); // ustawie SpamBotInfo na true
  28. }
  29. }
  30. }
  31.  
  32. private function SpamBotAddInfo(&$InfoNr) {
  33. $InfoNr++;
  34. }
  35.  
  36. private function SpamBotSet($InfoBot, $InfoNr = null, $Flood = null) {
  37. $this->SpamBotInfo = $InfoBot;
  38. if($InfoNr != null) $this->SpamBotInfoNr = $InfoNr;
  39. if($Flood != null) $this->SpamBotFlood = $Flood;
  40. }
  41.  
  42. }
  43. $bot = new bot();
  44. do {
  45. $bot->SpamBotHitbox();
  46. } while(true);


Problem jest w tym, że nie działa AntyFlood. Tutaj udało mi się to naprawić mianowicie z true i false zrobic zmienne typu string. I w ifie dać $this->SpamBotInfo == "true", ale na mój gust wygląda to dziwnie.
Drugim problemem jest $InfoNr tzn. bez przerwy ma przypisaną wartość 1. @turson mnie naprowadził, ale nie potrafię tego ogarnąć.

#Edit, Zaraz dam w kodzie opisy co i jak.

#Edit2, Teraz tak myślę, gapiąc się na ten kod, że można by było wywalić cały $SpamBotInfo i zrobić w pierwszym if'ie
  1. if(time() > $this->SpamBotFlood)
suchyMTW
pierwszy błąd:
  1. if ($this->SpamBotInfoNr = 10)

powinno być:
  1. if ($this->SpamBotInfoNr == 10)
Nicc0
Dzięki wszystkim za pomoc, szczególnie dla krzysh, którego tutaj z nami nie ma. Temat do zamknięcia.

Kawałek kodu do bota na IRC'u biggrin.gif Jeszcze raz dzięki.

  1. class bot {
  2.  
  3. private $SpamBotInfo = false;
  4. private $SpamBotInfoNr = 1;
  5. private $SpamBotFlood;
  6.  
  7. public function SpamBot() {
  8.  
  9. if($this->SpamBotInfo) { // Zabezpieczenie Floodowe
  10. echo ("Wiadomosc nr.".$this->SpamBotInfoNr."</br>".PHP_EOL);
  11.  
  12. if ($this->SpamBotInfoNr == 10) { // Jesli funkcja wykona sie 10 razy reset $InfoNr
  13. $this->SpamBotInfoNr = 1;
  14. } else {
  15. $this->SpamBotInfoNr++; // Jesli nie, wykona sie funkcji ktora doda do +1
  16. }
  17. $this->SpamBotFlood = time() + 60; // Ustawienie Anty Floodu na 1 min
  18. $this->SpamBotInfo = false; // I zmiana ustawienie false, aby funkcja nie mogla sie wykonac.
  19. } else {
  20. if(time() > $this->SpamBotFlood) { // jesli aktualny czas jest wiekszy od anty floodu
  21. $this->SpamBotInfo = true; // ustawie SpamBotInfo na true
  22. }
  23. }
  24. }
  25.  
  26. }
  27.  
  28. $bot = new bot();
  29. do {
  30. $bot->SpamBot();
  31. } while(true);
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.