Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Losowanie liczby w RAND, Z wyjątkiem kilku cyfr
Giluś
post 19.02.2011, 10:46:53
Post #1





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


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.
Go to the top of the page
+Quote Post
yevaud
post 19.02.2011, 10:54:26
Post #2





Grupa: Zarejestrowani
Postów: 471
Pomógł: 89
Dołączył: 29.07.2008
Skąd: Warszawa

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


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
Go to the top of the page
+Quote Post
RiE
post 19.02.2011, 10:58:17
Post #3





Grupa: Zarejestrowani
Postów: 97
Pomógł: 45
Dołączył: 5.05.2010

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


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

Ten post edytował RiE 19.02.2011, 11:25:24
Go to the top of the page
+Quote Post
Giluś
post 19.02.2011, 11:08:06
Post #4





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


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 ?








Ten post edytował Giluś 19.02.2011, 11:30:54
Go to the top of the page
+Quote Post
RiE
post 19.02.2011, 11:32:24
Post #5





Grupa: Zarejestrowani
Postów: 97
Pomógł: 45
Dołączył: 5.05.2010

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


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)
Go to the top of the page
+Quote Post
Giluś
post 19.02.2011, 11:43:52
Post #6





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


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






Ten post edytował Giluś 19.02.2011, 11:48:32
Go to the top of the page
+Quote Post
RiE
post 19.02.2011, 11:49:35
Post #7





Grupa: Zarejestrowani
Postów: 97
Pomógł: 45
Dołączył: 5.05.2010

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


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

Ten post edytował RiE 19.02.2011, 11:50:01
Go to the top of the page
+Quote Post
Giluś
post 19.02.2011, 11:53:34
Post #8





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


Coś nie śmiga ten kod, ładuje się bardzo długo
Go to the top of the page
+Quote Post
RiE
post 19.02.2011, 12:03:43
Post #9





Grupa: Zarejestrowani
Postów: 97
Pomógł: 45
Dołączył: 5.05.2010

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


  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.'';

Go to the top of the page
+Quote Post
Giluś
post 19.02.2011, 12:12:58
Post #10





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


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));






Ten post edytował Giluś 19.02.2011, 12:31:28
Go to the top of the page
+Quote Post
Valdi_B
post 19.02.2011, 17:08:14
Post #11





Grupa: Zarejestrowani
Postów: 107
Pomógł: 30
Dołączył: 19.02.2011
Skąd: Warszawa

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


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.
Go to the top of the page
+Quote Post
Giluś
post 20.02.2011, 10:12:33
Post #12





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


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 )
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: 18.05.2024 - 20:21