Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Losowanie jednej osoby
koszar93
post 26.01.2011, 15:24:22
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
 
Start new topic
Odpowiedzi (1 - 9)
gorden
post 26.01.2011, 15:35:18
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 26.01.2011, 16:31:22
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 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 26.01.2011, 16:47:37
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 26.01.2011, 18:15:29
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 26.01.2011, 18:46:48
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 tongue.gif
Go to the top of the page
+Quote Post
exood
post 26.01.2011, 18:56:34
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 27.01.2011, 01:17:45
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 27.01.2011, 08:44:03
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 winksmiley.jpg ale nie ma tam warunku na 100 rekordów i troszkę to zakręcone smile.gif
Go to the top of the page
+Quote Post
thek
post 27.01.2011, 09:25:06
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. }


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 08:37