Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Losowanie jednej osoby
Forum PHP.pl > Forum > Przedszkole
koszar93
Witam, napisałem skrypt na system loterii (system losuje z dodanych osób jedną i ta wylosowana dostaje nagrodę).

Zrobiłem dodawanie zgłoszeń. I teraz chce, że po zgłoszeniu się 100 osób system wylosuje 1 osobę. Graczy zapisanych mam w bazie. Takie mam tabele: id, name, acc_id.

Jakiej funkcji użyć aby wylosować jedną osobę z tych 100 zapisanych w bazie?

A i jeszcze jedno. Jak zrobić żeby już po wylosowaniu tej jednej osoby system wyczyścił całkowicie tą bazę w której znajdują się ci zapisani. Dodam że w kolumnie id mam auto_increment.

gorden
  1. $query = mysql_num_rows(mysql_query("SELECT * FROM `nazwa_tabeli`"));
  2. if($query == 100) {
  3. $los = rand(1,100);
  4. $query = mysql_fetch_row(mysql_query("SELECT `name`, `acc_id` FROM `nazwa_tabeli` WHERE `id`='$los'"));
  5. echo 'Wygrywa: '.$query[0];
  6. //i jeszcze zapisanie wygranego gdzies
  7. mysql_query("TRUNCATE TABLE `nazwa_tabeli`");
  8. } else {
  9. //rejestracja
  10. }
koszar93
Dzięki wielkie. Oto mi chodziło smile.gif)

Jeszcze mam pytanie odnośnie losowania.
System losuje po wejściu na stronę, da się żeby to robił bez wchodzenia na stronę?
exood
Cytat(gorden @ 26.01.2011, 15:35:18 ) *
  1. $query = mysql_fetch_row(mysql_query("SELECT `name`, `acc_id` FROM `nazwa_tabeli` WHERE `id`='$los'"));

a co jeżeli nie będzie takiego ID bo np. ktoś/cos usunął rekord?
lepiej byłoby tak:
  1. $query = mysql_fetch_row(mysql_query("SELECT `name`, `acc_id` FROM `nazwa_tabeli` ORDER BY RAND() LIMIT 1"));


Noidea
@exood takie zapytanie jest bardzo mało wydajne (dla każdego wiersza tabeli losowana jest osobna liczba losowa + sortowanie całej tabeli).
Lepiej jest zrobić to w kilku krokach;

1. maxID := SELECT MAX( id ) FROM tabela
2. randNumber := rand( 1, maxID )
3. randID := SELECT MIN( id ) FROM tabela WHERE id >= randNumber
4. SELECT * FROM tabela WHERE id = randID

Jak się uprzeć, to można to zrobić w jednym zapytaniu z podzapytaniami
gorden
Ja robiłem pętlę: sprawdzanie, czy wiersz o danym id istnieje, jeśli pojawi się jakaś luka, to odejmuje id wszystkim wierszom z wartościom powyżej luki o jeden, aż nie będzie pustego miejsca. Nie wiem czy to dobre rozwiązanie, ale działało tongue.gif
exood
Cytat(Noidea @ 26.01.2011, 18:15:29 ) *
@exood takie zapytanie jest bardzo mało wydajne (dla każdego wiersza tabeli losowana jest osobna liczba losowa + sortowanie całej tabeli).


wiem, że jest mało wydajne ... ale nie dla 100 rekordów, kwestię wydajności w tym wypadku można uznać za najmniejszy problem.
Twoje rozwiązanie jest niemalże identyczne jak gordena - również nie przewiduje braku konkretnego id w bazie.
Noidea
@exood Przewiduje. Przypatrz się zapytaniu w punkcie 3, a dokładnie warunkowi.

Jeśli w tabeli ma być 100 rekordów, to faktycznie nie ma co się szczypać z optymalizacją.
exood
Cytat(Noidea @ 27.01.2011, 01:17:45 ) *
@exood Przewiduje. Przypatrz się zapytaniu w punkcie 3, a dokładnie warunkowi.


faktycznie, nie zwróciłem uwagi winksmiley.jpg ale nie ma tam warunku na 100 rekordów i troszkę to zakręcone smile.gif
thek
Max(id) może być mylące jeśli ktoś się skasuje zanim nastąpi losowanie.
  1. //pobiera z bazy liczbę osób oraz ich id porozdzielane przecinkami, byśmy mieli do czynienia tylko z faktycznie tam będącymi
  2. list( $ile, $numery ) = mysql_fetch_row(mysql_query("SELECT count(id), GROUP_CONCAT(id) FROM `nazwa_tabeli`"));
  3. if($ile == 100) {
  4. //z listy numerków tworzymy tablicę
  5. $numery = explode( ',', $numery );
  6. //i losujemy jeden
  7. $los = array_rand( $numery );
  8. //a teraz wyciągamy ddane wylosowanego
  9. $query = mysql_fetch_row(mysql_query("SELECT `name`, `acc_id` FROM `nazwa_tabeli` WHERE `id`='$los'"));
  10. echo 'Wygrywa: '.$query[0];
  11. //i nie zapomnijmy zapisać wygranego jak chcesz... dowolna forma. Ja nie robiłem tego więc
  12. //i czyścimy całą tabelę
  13. mysql_query("TRUNCATE TABLE `nazwa_tabeli`");
  14. } else {
  15. //brak stówki, więc rób co chcesz tutaj...
  16. }
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.