Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skryptu wpisywania jednokrotnie liczby
Forum PHP.pl > Forum > Gotowe rozwiązania > Szukam
slawekjocker
Czesc prosil bym was abyscie ten skrypt: <?php
echo rand(1,100);
?>

zamienili na taki że można tylko z jednego ip 1 raz dziennie wylosować liczbę.


Pomoże ktoś?
markonix
Napisz to polsku i wykaż się wiekszą inicjatywną to na pewno ktoś Ci pomoże.

Jak można z adresu IP wylosować liczbę? Wyciągnąć losową cyfre ze stringu?
Szymciosek
Myślę, że chodzi mu o jakieś losowanie, ale żeby nie oszukiwać za bardzo to sprawdzanie ip i dopiero wtedy wstęp na dalszy ciąg losowania:
Załóżmy, że masz przycisk LOSUJ, który po naciśnięciu wylosuje Ci daną liczbę, czyli przed tym wszystkim na początku sprawdzał bym IP, czyli za każdym razem, gdy ktoś przycisk LOSUJ sprawdzasz i zapisujesz gdzieś jego IP np do pliku, gdy IP danego użytkownika jest już na liście blokujesz mu wtedy przycisk LOSUJ, a gdy nie ma zostawiasz przycisk odblokowany. Później trzeba byłoby pomyśleć nad czymś co skasuje zawartość pliku np o godzinie 0:00.
markonix
Od innej strony próbowałem rozszyfrować jego zdanie.

Szymciosek blokowanie przycisku jak najbardziej - ale tylko jako pierwsza linia ochorny.
Co do najlepszego rozwiązania zależy czy mamy do dyspozycji bazę?
slawekjocker
Mysql? Tak mamy smile.gif
Sephirus
Z uwagi na to, że szukasz jakiegoś gotowego skryptu to proszę:

  1.  
  2. /* Funkcja zwraca losowy numer z zakresu 1-100. Jeśli z danego IP już otrzymano tego dnia numer - zwraca false
  3.  * (działa na zasadzie plików. Pliki te mogą służyć także jako LOG */
  4. function getRandomNumber() {
  5. $date = new DateTime();
  6. $file = 'jakis/folder/tymczasowy/' . $date->format('Ymd') . '.txt'; // nazwa pliku na podstawie danego dnia (z określonym folderem)
  7.  
  8. $number = rand(1,100); // losujemy liczbę
  9.  
  10. if(file_exists($file)) { // jeśli tego dnia ktoś już losował liczbę
  11. if(strstr(file_get_contents($file),'*' . $_SERVER['REMOTE_ADDR'] . '*') !== false) // sprawdzamy czy aktualne IP już losowało
  12. return false; // zwracamy false jeśli losowało lub zapisujemy IP aby przy następnej próbie było wiadomo że ten IP losował
  13. file_put_contents($file,'*' . $_SERVER['REMOTE_ADDR'] . '* - wylosowana liczba: ' . $number . "\n",FILE_APPEND);
  14. } else { // jesli nie ma pliku zapisujemy IP
  15. file_put_contents($file,'*' . $_SERVER['REMOTE_ADDR'] . '* - wylosowana liczba: ' . $number . "\n");
  16. }
  17.  
  18. // Zwracamy wylosowaną liczbę
  19. return $number;
  20. }
  21.  
  22. $number = getRandomNumber();
  23.  
  24. if($number === false)
  25. echo 'Losowałeś już w tym dniu liczbę!';
  26. else
  27. echo 'Twoja wylosowana liczba to: '.$number;


jest to przykładowa funkcja, która będzie Ci takie liczby generować. To jest podstawa (idea), którą możesz sobie przerabiać i rozbudowywać.

Działa na plikach, zapisuje do plików adresy IP, które już losowały i dodatkowo jaką liczbę wylosowano - tak więc mogą służyć jako coś w rodzaju LOGa. Jest to oczywiście tylko moja propozycja "na szybko" wink.gif

Skrypt można przerobić tak, że danego dnia po pierwszym wylosowaniu liczby, funkcja będzie zwracała potem dokładnie tą liczbę czyli:

1. pierwsze wejście z danego IP - losowana jest i zwracana liczba - na przykład 88
2. drugie i każde kolejne wejście tego samego dnia - zwracana jest liczba 88 (zapisana dla danego IP)

Można to także zrobić na bazie danych jak wspominali moi przedmówcy
Szymciosek
A jak rozwiązać kwestię czyszczenie pliku z adresów IP ?
Mi przychodzi do głowy tylko cron, albo za każdym wejściem na losowanie sprawdzanie daty ostatniego losowania i na tej podstawie czyszczenie.
Orzeszekk
za kazdym wejsciem sprawdzanie kazdego losowania to moze troche zbyt czasochlonne.

ja bym to tak widzial. Obsluguj ten caly proces za pomocą jakiegos obiektu (i nie uzyskuj do niego dostepu innymi metodami niz ten obiekt). W konstruktorze obiektu daj takie cos (pseudokod)

if (obecnaData - dataOstatniegoCzyszczenia > 24)
{
$this->proceduraCzyszczaca();
}

i bedziesz miał takiego lazy-load crona.jesli nikt nie wejdzie na strone caly dzien to sie nie wyczysci.
ja mialem u siebie statystyki turniejów ktore wyswietlaly sie w kilku miejscach, i jesli minął czas wybrany na turniej to powinny się powyłączac - mialem do wyboru crona obslugujacego turnieje w tle lub taki lazy-loading, wybralem lazy-loading i sprawdzalo sie ok.

po prostu dane do wyswietlenia statystyk zbieralem obiektem obslugujacym caly ten proces turniejowy, i jesli przy tworzeniu obiektu proces wykryl ze jakis turniej juz sie zakonczyl to szybko dokanczal proces turniejowy itd i statystyka wyswietlala sie aktualna.
slawekjocker
A dalo by sie jeszce do tego skryptu dodac aby jak sie wylosuje liczbe to wyslac maila i zrobic tak aby nie mozna bylo zmienic wybranej liczby?
Szymciosek
Pewnie by się dało, do wysłania maila poszukaj formularza w php i go przerób, a jak mam rozumieć, że nie można zmienić liczby ? Przecież po naciśnięciu w przycisk LOSUJ automatycznie zostanie zrobione przekierowanie, adres IP zostanie zapisany i nikt z tego adresu nie będzie mógł losować znowu.
slawekjocker
Chodzi o to ze gdy ktos wysyla mailem tą liczbę to zeby nie mogł jej w tresci maila zmienic
Szymciosek
Myślę, że wystarczy wysłać plik czyli go wykonać z metodą POST, wtedy wszystkie zmienne przekazywane są wewnątrz skryptu (programu), może i jest na to jakaś metoda... ale zwykły Kowalski nie da rady.
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-2024 Invision Power Services, Inc.