Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Losowanie bez powtorzen + nowe pytania
Forum PHP.pl > Forum > Przedszkole
saren_as
Witam!
Chce osiagnac cos takiego:
Mam w bazie 8 osob. Kazda z tych osob musi wylosowac jedna osobe (pomijajac siebie), ale warunkiem jest to, iz jezeli osoba nr_1 wylosowala nr_5 bedzie on (nr_5) juz nie dostepny dla innych.
Opis:
Zblizaja sie swieta wiec...
Jest nas osiem osob i chcemy zrobic losowanie kto komu kupi prezent. Jedna osoba kupi cos tylko dla jednej osoby. Problem w tym, ze musimy zrobic losowanie, a jestesmy w tej chwili daleko od siebie. W ramach nauki php wymyslilem sobie, ze stworze stronke na ktorej to skrypt wylosuje za nas ta osobe.
Prosze o pomysly jak to moge rozwiazac. Moje rozwiazanie:
- tworze baze z tabelami losujacy i wylosowany
- kazdy z nas loguje sie i skrypt pobiera wszystkich z bazy (poza zalogowana osoba), a nastepnie losowo wybiera jedna osobe.
Problem w tym, ze nie wiem jak zrobic cos takiego, aby po wylosowaniu jednej osoby nie byla ona juz dostepna dla innych.
Zapraszam do pomocy:) Zaznaczam, ze chcial bym tego dokonac "sam" - nie chce gotowych skryptow ... chyba ze sie poddam.
Pozdrawiam!
Maxik
Do tabeli z osobami dodaj sobie jeszcze jedno pole, available tinyint(1) i jeśli ta osoba zostanie wylosowana zmień available z 0 na 1 przykładowo, losuj z tych u których available jest na 0.
saren_as
Nie wiem czy dobrze zrozumialem, ale chodzi chyba o to, ze bede musial recznie zmieniac te wartosci z 0 na 1 questionmark.gif

Ja wymyslilem sobie to tak. Jeden z nas wchodzi na index.html, gdzie znajduje sie link podpisany imieniem kazdego z nas. Po kliknieciu na niego skrypt losuje jedna osobe (zapytanie sql wyklucza wylosowanie siebie samego) a nastepnie kasuje ja z bazy danych. W ten sposob nastepna osoba nie bedzie mogla wylosowac tej samej osoby. Jest to takie moje rozwiazanie, ale napewno nie jest one optymalne z racji tego iz sie dopiero ucze. Czekam na jakies sugestie.

Jak moge zrobic, aby ten kto juz raz losowal nie mogl ponownie nacisnac linku do losowania lub np. F5?
W moim rozwiazaniu musze stworzyc dla kazdego z nas oddzielny link do oddzielnego skryptu. Czy moge jakos przekazac poprze klikniecie na link zmiennej z imieniem?
Maxik
Nie ręcznie, a zapytaniem do bazy:
  1. UPDATE tabela SET available=1 WHERE id=1


Po wylosowaniu osoby o id 1 powyższe zapytanie wykluczy ja, z głosowania. Losuj funkcją rand" title="Zobacz w manualu PHP" target="_manual i sprawdzaj czy wylosowany numer nie został już wybrany, jeśli tak losuj kolejną liczbę, aż do skutku.

Do wykluczenia tych co głosowali zrób sobie jeszcze jedno pole np. losowal tinyint(1) NOT NULL i jeśli ta osoba już losowała to zablokuj taką opcję.
saren_as
Czy dobrze tworze ta tabele z wylosowanymi, bo wywala mi blad w 4 lini
  1. CREATE TABLE `wylosowany` (
  2. `wylosowany_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `wylosowany_name` varchar(255) NOT NULL DEFAULT '',
  4. `wylosowany_available` tinyint(1) NOT NULL DEFAULT '0';



EDIT: Bledu juz nie ma...pospieszylem sie, ale chodzi mi w sumie czy o taki wyglad tabeli Ci chodzi?
Maxik
Nie twórz do tego osobnej tabeli. Dodaj te 2 pola do tabeli z użytkownikami.
saren_as
...EDIT...

Troche mi zeszlo, ale w koncu mam cos takiego i odziwo nawet mi dziala. Mam jednak jeszcze kilka niewiadomych:

  1. <?php
  2.  
  3. $connect = mysql_connect('localhost', 'root', 'saren')
  4.  or die ('Connecting failed');
  5. mysql_select_db('prezenty')
  6.  or die (mysql_error());
  7.  
  8. //pobranie zmiennej w celu okreslenia kim jest osoba aktualnie losujaca
  9. $name_losujacy = $_GET['$name_losujacy'];
  10.  
  11. // losowanie osoby z pominieciem tej, ktora wlasnie losuje oraz tych, ktrorzy zostali juz wylosowani
  12. $RANDOM = mysql_query ("SELECT `name`, `losowal` FROM `users` " .
  13.                       "WHERE `name` != '$name_losujacy' AND `available` = '0' " .
  14.                       "ORDER BY RAND() LIMIT 1")
  15.  or die (mysql_error());
  16.  
  17. while ($row = mysql_fetch_array($RANDOM)) {
  18.  
  19.  $name_wylosowany = $row['name'];
  20.  
  21. }
  22.  
  23. // pobranie zmiennej wskazujacej czy dana osoba wylosowala juz kogos wczesniej
  24. $LOSOWAL = mysql_query ("SELECT `name`, `losowal` FROM `users` " .
  25.                        "WHERE `name` = '$name_losujacy' ")
  26.  or die (mysql_error());
  27.  
  28. while ($row = mysql_fetch_array($LOSOWAL)) {
  29.  
  30.  $losowal = $row['losowal'];
  31. }  
  32.  
  33. // wyswietlenie wynikow w zaleznosci od spelnionych warunkow
  34. if ($losowal > 0) {
  35. echo "Juz brales udzial w losowaniu i wylosowales $name_wylosowany "; // TUTAJ MAM PROBLEM ! ! !
  36. } else {
  37.  
  38. $random =<<<EOD
  39.   <tr>
  40.     <td><center>$name_wylosowany</center></td>
  41.   </tr>
  42. EOD;
  43.  
  44. // table_start
  45. $table=<<<EOD
  46. <h2><center>Swiateczne prezenty</center></h2>
  47. <table width="70%" border="1" cellpadding="2" cellspacing="2" align="center">
  48.   <tr>
  49.     <th>$name_losujacy wylosowales...</th>
  50.   </tr>
  51. EOD;
  52.  
  53. // zamieniam wartosc available, aby nie moza bylo wylosowac jeszcze raz tej osoby
  54. $SET_1 = mysql_query ("UPDATE `users` SET `available` = '1' " .
  55.                      "WHERE `name` = '$name_wylosowany' ")
  56.  
  57. // zamieniam wartosc losowal, aby ta osoba nie mogla jeszcze raz kogos wylosowac  
  58. $SET_2 = mysql_query ("UPDATE `users` SET `losowal` = '1' " .
  59.                      "WHERE `name` = '$name_losujacy' ")
  60.  
  61. echo $table;
  62. echo $random;
  63. }
  64. ?>

W skrypcie zaznaczylem poprzez //TUTAJ MAM PROBLEM miejsce problemu (linia 36). Osoba, ktora juz wczesniej kogos wylosowala nie moze jeszcze raz tego uczynic. Tak tez sie dzieje przy pomocy uzytej instrukcji IF, ale chcial bym, aby poza informacja, ze juz brala udzial w losowaniu wyswietlilo sie kogo ta osoba wczesniej wylosowala (w ramach przypomnienia) Jak wiec przypisac na stale tej osobie swojego partnera?
Prosze takze o wskazanie mi bledow jakie popelnilem piszac moj pierwszy skrypt smile.gif
Pozdrawiam i dzieki za pomoc !

...EDIT...

OK widze, ze nikt nie wie jak mi pomoc wiec zadam inne pytanie.
W lini 34 mam
if ($losowal > 0) {
dziala to tak jak ma, ale dla czego, gdy wezme
if ($losowal = 1) {
juz nie dziala? Warunek ten zaklada to samo wiec powinno to dziala w ten sam sposob na obydwu przykladach. Moze mi to ktos wytlumaczyc?

PS. Ewentualnie prosze tez o pomoc ze wczesniejszym problemem (linia 36).

Pozdrawiam!
melkorm
wcześniejszy prblem :

zamiast staus_avaiblem ożesz wrzucać id użytkownika którego wylosował ... wyjdzie na to samo

drugi problem :

  1. <?php
  2. if ($losowal = 1) {
  3. ?>


ponieważ to jest operator przypisania a nie porównania, porównujesz za pomocą podwójnego równasię smile.gif
saren_as
Cytat(melkorm @ 4.11.2008, 16:43:45 ) *
wcześniejszy prblem :

zamiast staus_avaiblem ożesz wrzucać id użytkownika którego wylosował ... wyjdzie na to samo


Nie bardzo wiem o co Ci chodzi. Jezeli uzytkownik 'a' wylosowal 'b' to w momencie, gdy 'a' nacisnie jeszcze raz link do losowania zostanie poinformowany, ze juz dokonal losowania i nie moze jeszcze raz tego uczynic. Ja chcial bym, aby dodatkowo wyswietlilo mu, ze wylosowal juz 'b'. Nie wiem jak to zrobic poniewaz w zadnym miejscu nie jest na stale przypisana wartosc wylosowanego elementu. Baza tylko zaznacza, ze juz "kogos" wylosowal. Prosze o dalsza pomoc i z gory dzieki.

PS. Co do problemu powyzej (dalem ==1 zamiast =1) miales racje wiec oczywiscie ... 'pomogl' i dzieki za wyjasnienie zagadki.
seba22
I jeżeli publikujesz ten serwer w sieci internet, to zmień hasło roota.
saren_as
Cytat(seba22 @ 5.11.2008, 10:37:07 ) *
I jeżeli publikujesz ten serwer w sieci internet, to zmień hasło roota.

Narazie jest to moja zabawa w php wiec wszystko stoi na localhost'cie czyli jest to bezpieczne. Dzieki w kazdym badz razie za info i napewno sie dostosuje.
Co do mojego problemu to dalej nie znalazlem rozwiazania. Chyba musze do tego dodac logowanie i wtedy do danego loginu podpiac jakies cookies lub sesje, ale to tylko moje przypuszczenia. Czekam na wskazowki i dzieki za zainteresowanie!
Pozdrawiam!
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.