Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Skrypt do losowania bez powtórzeń -jak
malinowy
post 17.12.2013, 19:10:05
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 17.12.2013

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


witam,

jestem początkujący w PHP, natomiast mam doswiadcenie w innych językach programowania,
także nie jestem pewien, czy będę się posługiwał językiem PHP-owym.

Potrzebuję napisać funkcję/procedurę, która będzie przyjmowała jeden parametr - nr_osoby.

Skrpt mawylosowaćz bazy dowolną osobę, która jeszcze nie była wylosowana i przy tej osobie zapisać, że jest już wylosowana.

Czyli logika miałaby być taka (trochę po Oracle-owemu);

select nr_osoby from osoby
into v_wylosowana_osoba
where wylosowany='N'
and nr_osoby != :parametr_nr_osoby
/* to po mysql-owemu*/
ORDER BY RAND()
LIMIT 1 ;

update osoby set wylosowa='Y where nr_osoby=v_wylosowana_osoba;
commit;

if v_wylosowana_osoba not null then
return v_wylosowana_osoba ;
else
return "już wszyscy wylosowani";
end if;

Proszę o pomoc.

Go to the top of the page
+Quote Post
Kshyhoo
post 17.12.2013, 20:02:45
Post #2





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




To raczej MySQL a nie PHP. Losowanie z bazy (tu losuję jedną osobę":
  1. SELECT nr_osoby FROM osoby ORDER BY rand() LIMIT 1

Do tego dodać jedynie warunek, żeby nie losowało już wylosowanych. Zapisać chyba sobie poradzisz?


--------------------
Go to the top of the page
+Quote Post
malinowy
post 17.12.2013, 22:21:04
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 17.12.2013

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


Cytat(Kshyhoo @ 17.12.2013, 20:02:45 ) *
Do tego dodać jedynie warunek, żeby nie losowało już wylosowanych. Zapisać chyba sobie poradzisz?


No właśnie, ja jestem na etapie, że nie wiem jak to ubrać w php.

Jak przekazać parametr do funkcji php i go wykorzystać w mysql i potem coś zwrócić z tej funkcji.

Proszę o pomoc lub namiar na jakiś przykład.


Go to the top of the page
+Quote Post
Kshyhoo
post 17.12.2013, 22:39:57
Post #4





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




A gdzie tu PHP? Wszystko zrób po stronie MySQL. Przypisz jedynie wynik do zmiennej:
  1. $wylosowana_osoba = "SELECT nr_osoby FROM osoby WHERE wylosowany=0 ORDER BY rand() LIMIT 1";

I masz jakiś numer.
A do bazy:
  1. $zapytanie = "UPDATE osoby SET wylosowany=1 WHERE nr_osoby=$wylosowana_osoba";

Mogłem gdzieś zapomnieć o jakimś ciapku tongue.gif

EDIT: wywaliłem warunki, bo przecież swoje musisz dać...

Ten post edytował Kshyhoo 17.12.2013, 22:42:45


--------------------
Go to the top of the page
+Quote Post
malinowy
post 18.12.2013, 10:14:08
Post #5





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 17.12.2013

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


wydaje mi się, że w MySQL mam to obsłużone, bo

  1. SELECT nr FROM g2013_osoby WHERE losowal='N' AND nr != '1' ORDER BY rand() LIMIT 1"


zwraca mi jedną wartość, zawsze inną, zgodnie z zalożeniem.


Ale jak to ubiorę w

  1. $q_wylosowana_osoba = "SELECT nr FROM g2013_osoby WHERE losowal='N' and nr != '".$_GET['p1']."' ORDER BY rand() LIMIT 1";
  2. $wylosowana_osoba = mysql_query($q_wylosowana_osoba, $conn) or die(mysql_error());
  3. $r_wylosowana_osoba = mysql_fetch_assoc($wylosowana_osoba);
  4. $totalRows_osoby = mysql_num_rows($osoby);
  5. //$row_ososby2 = mysql_fetch_assoc($ososby2);
  6. echo "<div class=\"alert alert-success\">".$r_wylosowana_osob['nr']." </div>";


to mam błąd

Warning: mysql_num_rows() expects parameter 1 to be resource, null given in /home/malin/domains/malin.pl/public_html/gwiazdka2013/load.php on line 15

O co chodzi?
Go to the top of the page
+Quote Post
Turson
post 18.12.2013, 10:20:52
Post #6





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


  1. $q_wylosowana_osoba = "SELECT nr FROM g2013_osoby WHERE losowal='N' and nr != '".$_GET['p1']."' ORDER BY rand() LIMIT 1";

Nie bierz integerów w '' ani "", $_GET w zapytaniu bezpośrednio = sql incjection

  1. $wylosowana_osoba = mysql_query($q_wylosowana_osoba, $conn)

mysql_query(zapytanie,połaczenie) ? W mysql nie używa się połączenia w mysql_query. Łączysz się z bazą wcześniej i tyle.


  1. $r_wylosowana_osoba = mysql_fetch_assoc($wylosowana_osoba);
  2. $totalRows_osoby = mysql_num_rows($osoby);

Liczysz wyniki dla $osoby, które nie istnieje?

  1. echo "<div class=\"alert alert-success\">".$r_wylosowana_osob['nr']." </div>";

Widzę, że wyżej masz osoba a nie osob
Go to the top of the page
+Quote Post
malinowy
post 18.12.2013, 15:19:26
Post #7





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 17.12.2013

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


Od razu lepiej smile.gif

Dziękuję.

Już był o ogródku, już witał się z gąską.
Dodałem parę warunków i znowu schody ;-(

Cytat(Turson @ 18.12.2013, 10:20:52 ) *
  1. $q_wylosowana_osoba = "SELECT nr FROM g2013_osoby WHERE losowal='N' and nr != '".$_GET['p1']."' ORDER BY rand() LIMIT 1";

Nie bierz integerów w '' ani "", $_GET w zapytaniu bezpośrednio = sql incjection


Jak nie biorę integerów w '' ani "" to nie działa.
Ale po dodaniu warunków, jak biorę w '', to też nie działa.

Zapytanie z warunkami, które zwraca wartość w MySQL:
  1. SELECT nr FROM g2013_osoby
  2. WHERE nr !=3
  3. AND para !=3
  4. AND wylosowany =0
  5. AND wylosowany !=3
  6. ORDER BY rand() LIMIT 1


W php:
  1. $q1 = $_GET['p1'];
  2.  
  3. //echo $q1;
  4.  
  5. $q_wylosowana_osoba = "
  6. SELECT nr, imie FROM g2013_osoby
  7. WHERE nr !=".$_q1."
  8. and para !=".$_q1."
  9. and wylosowany =0
  10. and wylosowany !=".$_q1."
  11. ORDER BY rand() LIMIT 1
  12. ";
  13.  
  14. $wylosowana_osoba = mysql_query($q_wylosowana_osoba) or die(mysql_error());
  15. $r_wylosowana_osoba = mysql_fetch_assoc($wylosowana_osoba);
  16. //$totalRows_osoby = mysql_num_rows($osoby);
  17. //$row_ososby2 = mysql_fetch_assoc($ososby2);
  18. //$q_update = "update g2013_osoby SET wylosowany='".$r_wylosowana_osoba['nr']."' where nr='".$_q1."'";
  19. //$wylosowana_osoba_u = mysql_query($q_update) or die(mysql_error());
  20.  
  21. echo "<div class=\"alert alert-success\">Wylosowany numer to - <span id='wynik'>".$r_wylosowana_osoba['nr']."</span> - <strong>".$r_wylosowana_osoba['imie']." !</strong> </div>";
  22.  



Błędy:
*) wersja, gdy parametr jest bez '' - and para !=".$_q1."
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'and para != and wylosowany =0 and wylosowany != ORDER BY rand() LIMIT 1' at line 3

*) wersja, gdy parameter jest w '' - and para !='".$_q1."' (oczywiście we wszystkich wystąpieniach).

Wylosowany numer to - - !

Czyli wartości $r_wylosowana_osoba['nr'] i $r_wylosowana_osoba['imie'] mają null.

Jak zrobię :
$q1 = $_GET['p1'];

echo $q1;

zwraca mi wartość z parametru.

W czym problem?
Go to the top of the page
+Quote Post
Kshyhoo
post 18.12.2013, 15:27:40
Post #8





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Zmienne w zapytaniu w pojedyncze ciapki, czyli ' (apostrofy).

I bez łączenia ciągów, czyli bez . (kropek).


--------------------
Go to the top of the page
+Quote Post
malinowy
post 18.12.2013, 18:59:37
Post #9





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 17.12.2013

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


Cytat(Kshyhoo @ 18.12.2013, 15:27:40 ) *
Zmienne w zapytaniu w pojedyncze ciapki, czyli ' (apostrofy).

I bez łączenia ciągów, czyli bez . (kropek).


Tak działa ;-)

Miałem też błąd w nazwie zmiennej.

Dzięki.

================


Panowie,
a tu co jest nie tak ?

Baza zwraca rekord na takie zapyanie:
  1. SELECT o1.nr AS nr, o1.wylosowal AS wylosowal, o2.imie AS imie
  2. FROM g2013_osoby o1
  3. LEFT JOIN g2013_osoby o2 ON o1.nr = o2.wylosowany_przez
  4. WHERE o1.nr =1 LIMIT 1


a php mam null:

  1. $_q1 = $_GET['p1'];
  2.  
  3. $q_weryfikacja = "SELECT o1.nr as nr, o1.wylosowal as wylosowal, o2.imie as imie
  4. FROM g2013_osoby o1
  5. LEFT JOIN g2013_osoby o2 ON o1.nr = o2.wylosowany_przez
  6. WHERE o1.nr ='$_q1' LIMIT 1";
  7.  
  8. $weryfikacja = mysql_query($q_weryfikacja) or die(mysql_error());
  9. $wer = $weryfikacja['wylosowal'];
  10. echo $wer ;


Ten post edytował malinowy 18.12.2013, 19:00:49
Go to the top of the page
+Quote Post
Kshyhoo
post 18.12.2013, 19:04:13
Post #10





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Żeby "zobaczyć", co PHP chce pobrać z MySQL:
  1. echo $q_weryfikacja;

Bo może przez $_q1 = $_GET['p1']; nic nie przechodzi...
Po za tym, trzeba by to "ubrać" w jakieś pętle kontrolne. Jak pobrał, to to, jak nie pobrał, to tamto... I wtedy można się bawić wink.gif


--------------------
Go to the top of the page
+Quote Post
malinowy
post 18.12.2013, 20:54:32
Post #11





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 17.12.2013

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


  1. $_q1 = $_GET['p1'];
  2.  
  3. echo $_q1;


oddaje wartość $_q1 do html

natomiat, takie coś:

  1.  
  2. $_q1 = $_GET['p1'];
  3.  
  4. //echo $_q1;
  5.  
  6. $q_weryfikacja = "SELECT o1.nr as nr, o1.wylosowal as wylosowal, o2.imie as imie
  7. FROM g2013_osoby o1
  8. LEFT JOIN g2013_osoby o2 ON o1.nr = o2.wylosowany_przez
  9. WHERE o1.nr ='$_q1' LIMIT 1";
  10.  
  11. $weryfikacja = mysql_query($q_weryfikacja) or die(mysql_error());
  12. $wer = $weryfikacja['wylosowal'];
  13. echo "$wer = ".$wer ;


zwraca tylko "=" - znak równości.

czyli $wer jest null.
Dlaczego null?
BTW. Dlaczego string nie zwraca nawy zmiennej ?

Go to the top of the page
+Quote Post
Kshyhoo
post 18.12.2013, 20:56:55
Post #12





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




A nawiązujesz połączenie z bazą danych?


--------------------
Go to the top of the page
+Quote Post
Turson
post 18.12.2013, 21:10:01
Post #13





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Wykonujesz zapytanie ale nie pobierasz wyników... mysql_fetch_assoc()
Go to the top of the page
+Quote Post
malinowy
post 18.12.2013, 21:15:31
Post #14





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 17.12.2013

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


najpierw mam

  1. <?php require_once('Connections/conn.php'); ?>


potem

  1. mysql_select_db($database_conn, $conn);
  2.  
  3. $_q1 = $_GET['p1'];
  4.  
  5. $q_weryfikacja = "SELECT o1.nr as nr, o1.wylosowal as wylosowal, o2.imie as imie
  6. FROM g2013_osoby o1
  7. LEFT JOIN g2013_osoby o2 ON o1.nr = o2.wylosowany_przez
  8. WHERE o1.nr ='$_q1' LIMIT 1";
  9.  
  10. $weryfikacja = mysql_query($q_weryfikacja) or die(mysql_error());
  11. $wer = $weryfikacja['wylosowal'];
  12. echo "$wer = ".$wer ;
  13.  


i nie ma nic ;-(

a może to ma znaczenie, że kolumna w bazie jest intetger a $_q1 jest pobierane jako text?
Go to the top of the page
+Quote Post
Turson
post 18.12.2013, 21:30:29
Post #15





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Cytat(Turson @ 18.12.2013, 21:10:01 ) *
Wykonujesz zapytanie ale nie pobierasz wyników... mysql_fetch_assoc()

Przeczytaj jeszcze raz
Go to the top of the page
+Quote Post
malinowy
post 18.12.2013, 21:41:55
Post #16





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 17.12.2013

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


Cytat(Turson @ 18.12.2013, 21:30:29 ) *
Przeczytaj jeszcze raz


No dokładnie ;-)

Nie widziałem wcześniej Twojej odpowiedzi - miałem nieodświeżoną stronę.


Dziękuję ponownie.

Mam nadzieję, że to już wszystko w tym temacie.
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: 28.04.2025 - 07:38