Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Losowanie liczby w RAND
Forum PHP.pl > Forum > Przedszkole
Giluś
Cześć potrzebuję zrobić takie małe losowanie portów do ventrilo, i port ma się dodać do bazy danych mysql i potem uruchomić odpowiedni program ( Potrzebuje tylko losowanie uruchamianie już mam )

Dokładnie chciałbym zrobić taką pętle która mi na 100% nie wylosuje już istniejącego portu ( zapisanego w mysql - Tabela serwy kolumna port, stąd ma pobierać porty ) i jeszcze aby nie wylosowało kilku innych portów takich jak 3306 ( Mysql ) i kilku innych które sam będę sobie ustawiał.


Na razie posiadam tylko
  1. $rand2 = rand(1000,65536);
Tyle ( Taki przedział portów )
Wiem jak zrobić aby nie wylosowało jednej liczby np 3306, ale jak zrobić taką pętelkę aby nie za dużo zasobów zabierała ( serwera ) a w miarę dobrze pobierała dane z MySQL i je odpowiednio osadzała.
yevaud
moim zdaniem algorytm powinien wygladac tak

1. napisz funkcje ktora od przedzialow liczbowych podanych w array, odejmie jedna liczbe
2. napisz zapytanie ktore zwroci wszystkie porty
3. napisz funkcje ktora na podstawie tablicy przedzialow liczowych podanych w array, zwroci losowa liczbe ktora sie w nich nie zawiera, a jednoczesnie bedzie jakos ograniczona od gory
4. sklej to do kupy w petli
RiE
Definiujesz tablice do ktorej bedziesz dodawal 'zakazane' porty. Nastepnie w petli bedziesz sprawdzal warunkiem if czy dana wartosc znajduje sie na zakazanej liscie( in_array($wylosowana_Wartosc,$tablica) )

@up
Sry, nie zauwazylem ze ktos mnie juz ubiegl
Giluś
Ja myślałem żeby to zrobić tak:
Mój Kod
  1. $rand2 = rand(1000,65536);

Później przeszukać MySQL tak:
  1. lol = mysql_query("select port from serwy where port = $rand2");
i jeśli by wynik wyszedł np tak:

  1. if($lol == $rand2 ) echo "Tutaj zamiast echo jakieś powtórzenie";
  2. else echo "Tutaj zamiast echo reszta kodu ";


I teraz jeśli wyskoczy "else" to dać kolejny if który mniej więcej wyglądał by tak
  1. if($moje_porty_w_array == $rand2 ) echo "Tutaj zamiast echo jakieś powtórzenie";
  2. else echo "Tutaj zamiast echo reszta kodu ";


Nie wiem jak to będzie śmigało i czy będzie to optymalne i czy wszystko będzie się robiło w tle żeby użytkownik nie musiał odświeżać stronę lub nacisnąć przycisk OK. a tu dopiero się będzie szukało czy istnieje taki port czy nie... - Wszystko bym chciał zrobić typowo w tle.




Edit:
Czy istnieje jakaś funkcja która mi wykona ponownie kod w tle - tak jak tutaj pokazałem ?






RiE
I za kazdym razem bedziesz sprawdzal czy wylosowany port jest w bazie? Lepiej zrob cos takiego:
  1. $query="select * from serwy";
  2. $query=mysql_query($query);
  3. while($wynik=mysql_num_rows)
  4. {
  5. $tab_porty[]=$wynik['port'];
  6. }
  7. // Tu mozesz dodac inne porty do tablicy;
  8. do{
  9. $losowy_port=rand(1000,65536);
  10. }while(!in_array($losowy_port,$tab_porty)
Giluś
RiE twój kod pokazuje błąd w ostatniej linijce całej strony ( nie twojego kodu - a strona jest poprawna )
  1. Parse error: syntax error, unexpected T_STRING in C:\Program Files\WebServ\httpd-users\cc\test.php on line 20


Cały kod:
  1. <?php
  2. require_once('var/ustawienia.php');
  3. require_once('zalogowany.php');
  4.  
  5. $query="select * from porty";
  6. $query=mysql_query($query);
  7. while($wynik=mysql_num_rows)
  8. {
  9. $tab_porty[]=$wynik['port'];
  10. }
  11.  
  12. // Tu mozesz dodac inne porty do tablicy;
  13. do{
  14. $losowy_port=rand(1000,65536);
  15. }while(!in_array($losowy_port,$tab_porty)
  16.  
  17. ?>



Już wiem o co chodzi while(!in.. - Brakuje zamknięcia nawiasu


Dodałem na końcu ")" i ";"
Ale otrzymałem za to inny błąd:

  1. Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 35 bytes) in C:\Program Files\WebServ\httpd-users\cc\test.php on line 11




RiE
O przepraszam!
Z rozpedu popelnilem 'drobny' blad
  1. $query="select * from serwy";
  2. $query=mysql_query($query);
  3. while($wynik=mysql_fetch_array($query))
  4. {
  5. $tab_porty[]=$wynik['port'];
  6. }
  7. // Tu mozesz dodac inne porty do tablicy;
  8. do{
  9. $losowy_port=rand(1000,65536);
  10. }while(!in_array($losowy_port,$tab_porty)

Teraz powinno byc dobrze
Giluś
Coś nie śmiga ten kod, ładuje się bardzo długo
RiE
  1. $query="select * from serwy";
  2. $query=mysql_query($query);
  3. while($wynik=mysql_fetch_array($query))
  4. {
  5. $tab_porty[]=$wynik['port'];
  6. }
  7. // Tu mozesz dodac inne porty do tablicy;
  8. do{
  9. $losowy_port=rand(1000,65536);
  10. }while(in_array($losowy_port,$tab_porty));
  11. echo 'Port: '.$losowy_port.'';

Giluś
Cytat(RiE @ 19.02.2011, 12:03:43 ) *
  1. $query="select * from serwy";
  2. $query=mysql_query($query);
  3. while($wynik=mysql_fetch_array($query))
  4. {
  5. $tab_porty[]=$wynik['port'];
  6. }
  7. // Tu mozesz dodac inne porty do tablicy;
  8. do{
  9. $losowy_port=rand(1000,65536);
  10. }while(in_array($losowy_port,$tab_porty));
  11. echo 'Port: '.$losowy_port.'';



Dzięki wielkie za ten kod smile.gif

Jeszcze jedno pytanie jak dodać tablicę z własnymi portami ( zablokowanymi ) do tego skryptu ?
$tablica = array ('3600');
Bo tutaj nie działa za bardzo jak dodam po tab_porty
  1. while(in_array($losowy_port,$tab_porty));




Valdi_B
Cytat(Giluś @ 19.02.2011, 12:12:58 ) *
Jeszcze jedno pytanie jak dodać tablicę z własnymi portami ( zablokowanymi ) do tego skryptu ?
$tablica = array ('3600');

Jest funkcja array_merge (łączenie tablic).
Pytanie tylko, czy jest sens tworzyć jakąś dodatkową tablicę, a potem dołączać jej treść do tab_porty?
A może ładuj numery "zakazanych" portów wprost do tab_porty:
  1. $tab_porty[] = <nr portu>;
(dla kolejnych zakazanych portów).
Ta treść powinna być w miejscu gdzie masz komentarz:
// Tu możesz dodać ...
Z uwagi na przejrzystość kodu, może lepiej wywołaj w tym miejscu funkcję, a doładowanie numerów do tab_porty zrób właśnie w tej funkcji.
Giluś
A da się jeszcze bardziej przerobić ten kod, tzn
Adres IP:
192.168.1.1 - Posiada porty 3000, 3002, 1000 ( przykładowe )
No i teraz już się nie da zarejestrować ponownie tych portów, a ja chcę aby można było zarejestrować jesli jest inny ip tzn:
192.168.1.1 - Posiada port 3000 ( tylko 1x )
192.168.1.2 - Może też posiadać port 3000 ( tylko 1x )
192.168.1.3 - Też może posiadać port 3000 ( tylko 1x )
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.