Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Losowanie bez powtorzen + nowe pytania, [PHP][MySQL]
saren_as
post 29.10.2008, 16:20:59
Post #1





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 21.07.2008

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


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!

Ten post edytował saren_as 3.11.2008, 15:25:23
Go to the top of the page
+Quote Post
Maxik
post 29.10.2008, 16:24:38
Post #2





Grupa: Zarejestrowani
Postów: 726
Pomógł: 129
Dołączył: 10.01.2008
Skąd: Gdańsk

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


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.


--------------------
Pomogłem? Kliknij przycisk Pomógł pod pomocnym Ci postem.
http://maxik.me/
Go to the top of the page
+Quote Post
saren_as
post 30.10.2008, 14:46:51
Post #3





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 21.07.2008

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


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?
Go to the top of the page
+Quote Post
Maxik
post 30.10.2008, 16:13:02
Post #4





Grupa: Zarejestrowani
Postów: 726
Pomógł: 129
Dołączył: 10.01.2008
Skąd: Gdańsk

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


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ę.


--------------------
Pomogłem? Kliknij przycisk Pomógł pod pomocnym Ci postem.
http://maxik.me/
Go to the top of the page
+Quote Post
saren_as
post 30.10.2008, 16:39:23
Post #5





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 21.07.2008

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


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?

Ten post edytował saren_as 30.10.2008, 16:42:59
Go to the top of the page
+Quote Post
Maxik
post 30.10.2008, 16:40:46
Post #6





Grupa: Zarejestrowani
Postów: 726
Pomógł: 129
Dołączył: 10.01.2008
Skąd: Gdańsk

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


Nie twórz do tego osobnej tabeli. Dodaj te 2 pola do tabeli z użytkownikami.


--------------------
Pomogłem? Kliknij przycisk Pomógł pod pomocnym Ci postem.
http://maxik.me/
Go to the top of the page
+Quote Post
saren_as
post 4.11.2008, 16:40:27
Post #7





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 21.07.2008

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


...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!

Ten post edytował saren_as 4.11.2008, 16:42:32
Go to the top of the page
+Quote Post
melkorm
post 4.11.2008, 16:43:45
Post #8





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


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


--------------------
Go to the top of the page
+Quote Post
saren_as
post 5.11.2008, 10:33:26
Post #9





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 21.07.2008

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


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.
Go to the top of the page
+Quote Post
seba22
post 5.11.2008, 10:37:07
Post #10





Grupa: Zarejestrowani
Postów: 293
Pomógł: 4
Dołączył: 28.01.2005

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


I jeżeli publikujesz ten serwer w sieci internet, to zmień hasło roota.


--------------------
Go to the top of the page
+Quote Post
saren_as
post 5.11.2008, 13:33:16
Post #11





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 21.07.2008

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


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!

Ten post edytował saren_as 5.11.2008, 13:33:53
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: 26.04.2025 - 01:51