Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Losowanie jednej osoby
koszar93
post
Post #1





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 24.09.2010

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
gorden
post
Post #2





Grupa: Zarejestrowani
Postów: 486
Pomógł: 101
Dołączył: 27.06.2010

Ostrzeżenie: (0%)
-----


  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. }
Go to the top of the page
+Quote Post
koszar93
post
Post #3





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 24.09.2010

Ostrzeżenie: (0%)
-----


Dzięki wielkie. Oto mi chodziło (IMG:style_emoticons/default/smile.gif) )

Jeszcze mam pytanie odnośnie losowania.
System losuje po wejściu na stronę, da się żeby to robił bez wchodzenia na stronę?

Ten post edytował koszar93 26.01.2011, 16:33:59
Go to the top of the page
+Quote Post
exood
post
Post #4





Grupa: Zarejestrowani
Postów: 86
Pomógł: 16
Dołączył: 2.12.2009
Skąd: Płock/Warszawa

Ostrzeżenie: (0%)
-----


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"));


Go to the top of the page
+Quote Post
Noidea
post
Post #5





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


@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
Go to the top of the page
+Quote Post
gorden
post
Post #6





Grupa: Zarejestrowani
Postów: 486
Pomógł: 101
Dołączył: 27.06.2010

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
exood
post
Post #7





Grupa: Zarejestrowani
Postów: 86
Pomógł: 16
Dołączył: 2.12.2009
Skąd: Płock/Warszawa

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Noidea
post
Post #8





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


@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ą.
Go to the top of the page
+Quote Post
exood
post
Post #9





Grupa: Zarejestrowani
Postów: 86
Pomógł: 16
Dołączył: 2.12.2009
Skąd: Płock/Warszawa

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/winksmiley.jpg) ale nie ma tam warunku na 100 rekordów i troszkę to zakręcone (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
thek
post
Post #10





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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. }
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 21:50