Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Powrót na początek skryptu
Deusx
post
Post #1





Grupa: Zarejestrowani
Postów: 126
Pomógł: 2
Dołączył: 27.08.2006

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


Witam, czy w php jest możliwość wrócenia do docelowego punktu w skrycie ?


Chodzi mi dokładniej w wyszukanie wolnej pozycji, po przez losowanie

Czyli

  1. $liczba - rand(1,1000);
  2. $sprawdz = mysql_query('select `id` form tabela where `liczba` = '.$liczba.'');
  3.  
  4. if(!empty($sprawdz)) {
  5. liczba zajęta
  6. //
  7. //Jak teraz wrócić z powrotem z losowania ?
  8. //
  9. } else {
  10. //liczba wolna, wykonaj dalej skrypt
  11. }


Ten post edytował Deusx 27.08.2010, 18:07:04
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
flashdev
post
Post #2





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


Korzystanie z tego raczej nie jest zalecane, ale proszę, jest:

http://php.net/manual/en/control-structures.goto.php
Go to the top of the page
+Quote Post
Deusx
post
Post #3





Grupa: Zarejestrowani
Postów: 126
Pomógł: 2
Dołączył: 27.08.2006

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


Możesz napisać czemu nie jest zalecane?
Go to the top of the page
+Quote Post
flashdev
post
Post #4





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


Cytat(Deusx @ 27.08.2010, 19:08:44 ) *
Możesz napisać czemu nie jest zalecane?


owszem
http://www.google.pl/search?client=opera&a...-8&oe=utf-8

tutaj znacznie więcej -> http://www.google.pl/search?client=opera&a...-8&oe=utf-8

Edit:
Usunąłem link do wulgarnego bloga

Ten post edytował flashdev 27.08.2010, 18:14:01
Go to the top of the page
+Quote Post
Pilsener
post
Post #5





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Poza tym do tego służą pętle - wykonujesz pętle tak długo, aż uzbierasz tych losów ile chcesz i wtedy "wyskakujesz" z pętli używają słowa kluczowego break. I odpytywanie bazy za każdym razem także mija się z celem, można to zrobić jednym zapytaniem, są odpowiednie metody.
Go to the top of the page
+Quote Post
Deusx
post
Post #6





Grupa: Zarejestrowani
Postów: 126
Pomógł: 2
Dołączył: 27.08.2006

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


Obecnie stosuję pętle, ale wykonuję się ponad 30 sek i jest błąd.
Go to the top of the page
+Quote Post
flashdev
post
Post #7





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


Cytat(Deusx @ 27.08.2010, 19:13:37 ) *
Obecnie stosuję pętle, ale wykonuję się ponad 30 sek i jest błąd.


http://php.net/manual/en/function.set-time-limit.php
Go to the top of the page
+Quote Post
Pilsener
post
Post #8





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Pokaż kod tej pętli, to zaraz przerobimy go tak, by wykonywał się szybciej.
Go to the top of the page
+Quote Post
Deusx
post
Post #9





Grupa: Zarejestrowani
Postów: 126
Pomógł: 2
Dołączył: 27.08.2006

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


Wiem jak się limit zwiększa, jednak nie chcę go zwiększać, dlatego szukam alternatywy.


Pętla jest dość długa i skomplikowana - może dlatego się tak długo ładuje.


Ogólnie chodzi o to, żeby znaleźć wolną pozycję x:x

Pozycję te są nazwane w bazie
system, planet

system od 1 do 200
planet od 1 do 5

Jeżeli nie znajdzie, to daj komunikat, jeżeli znajdzie, to leć dalej. W obecnej pętli, są zawarte jeszcze dwie inne, które jeżeli pozycja jest zajęta, to +1


Źle to robię ?

Ten post edytował Deusx 27.08.2010, 18:22:13
Go to the top of the page
+Quote Post
flashdev
post
Post #10





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


Cytat(Deusx @ 27.08.2010, 19:13:37 ) *


Nie ma takiej możliwości, żeby różnica w czasie wykonywania tradycyjnej pętli, a tej z wykorzystaniem goto i label była znacząco duża.
Na pewno problem leży gdzie indziej. Może wykonujesz nieoptymalne zapytania?
Go to the top of the page
+Quote Post
Pilsener
post
Post #11





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Cytat
Ogólnie chodzi o to, żeby znaleźć wolną pozycję x:x
- prosiliśmy o kod i najlepiej strukturę tabel oraz opis efektu jaki chcesz uzyskać. Pewnie wystarczy połączyć dwie tabele relacją i użyć odpowiedniego zapytania, w ostateczności można zrobić iloczyn kartezjański tabel, na pewno i tak będzie szybciej niż select dla każdej kombinacji rekordów.
Go to the top of the page
+Quote Post
Deusx
post
Post #12





Grupa: Zarejestrowani
Postów: 126
Pomógł: 2
Dołączył: 27.08.2006

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


  1.  
  2. $LastSettedGalaxyPos = $_POST['uklad'];
  3. $LastSettedSystemPos = 1;
  4. $LastSettedPlanetPos = 1;
  5. while (!isset($newpos_checked)) {
  6. for ($Galaxy = $LastSettedGalaxyPos; $Galaxy <= 5; $Galaxy++) {
  7. for ($System = $LastSettedSystemPos; $System <= 200; $System++) {
  8. for ($Posit = $LastSettedPlanetPos; $Posit <= 4; $Posit++) {
  9. $Planet = round (rand ( 1, 5) );
  10.  
  11. switch ($LastSettedPlanetPos) {
  12. case 1:
  13. $LastSettedPlanetPos += 1;
  14. break;
  15. case 2:
  16. $LastSettedPlanetPos += 1;
  17. break;
  18. case 3:
  19. if ($LastSettedSystemPos == 200) {
  20. $LastSettedGalaxyPos += 1;
  21. $LastSettedSystemPos = 1;
  22. $LastSettedPlanetPos = 1;
  23. break;
  24. } else {
  25. $LastSettedPlanetPos = 1;
  26. }
  27. $LastSettedSystemPos += 1;
  28. break;
  29. }
  30. break;
  31. }
  32. break;
  33. }
  34. break;
  35. }
  36.  
  37.  
  38. $Galaxy = $_POST['uklad'];
  39.  
  40. $QrySelectGalaxy = "SELECT * ";
  41. $QrySelectGalaxy .= "FROM {{table}} ";
  42. $QrySelectGalaxy .= "WHERE ";
  43. $QrySelectGalaxy .= "`galaxy` = '". $Galaxy ."' AND ";
  44. $QrySelectGalaxy .= "`system` = '". $System ."' AND ";
  45. $QrySelectGalaxy .= "`planet` = '". $Planet ."' ";
  46. $QrySelectGalaxy .= "LIMIT 1;";
  47. $GalaxyRow = doquery( $QrySelectGalaxy, 'galaxy', true);
  48.  
  49. if ($GalaxyRow["id_planet"] == "0") {
  50. $newpos_checked = true;
  51. }
  52.  
  53. if (!$GalaxyRow) {
  54. CreateOnePlanetRecord ($Galaxy, $System, $Planet, $NewUser['id'], $UserPlanet, true);
  55. $newpos_checked = true;
  56. }
  57. if ($newpos_checked) {
  58. doquery("UPDATE {{table}} SET `config_value` = '". $LastSettedSystemPos ."' WHERE `config_name` = 'LastSettedSystemPos';", 'config');
  59. doquery("UPDATE {{table}} SET `config_value` = '". $LastSettedPlanetPos ."' WHERE `config_name` = 'LastSettedPlanetPos';", 'config');
  60. }
  61. }



To jest cała pętla (IMG:style_emoticons/default/smile.gif)

Ten post edytował Deusx 27.08.2010, 18:32:35
Go to the top of the page
+Quote Post
Pilsener
post
Post #13





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Chyba wiem o co Ci chodzi, niestety tak tego nie zrobisz. Jak rozumiem, masz w bazie jakieś tam układy, planety, galaktyki i chcesz rozlosować z wolnej puli? Musisz stworzyć indeks, który przechowa wszystkie obecnie założone kombinacje na zasadzie:

123987456 - pierwsze 3 cyfry galaktyka, następne 3 planeta, następne 3 układ.

Następnie generujesz taki indeks losowo i sprawdzasz w bazie, czy on istnieje - jeśli tak, to wykonujesz losowanie ponownie aż znajdziesz wolny.

Oczywiście wszystko zależy od tego, ile jest wolnych kombinacji - jeśli mało, to bardziej opłaca się zrobić odwrotnie: pobrać wszystkie wolne kombinacje do tablicy i z nich wylosować jedną lub więcej.

Go to the top of the page
+Quote Post
Deusx
post
Post #14





Grupa: Zarejestrowani
Postów: 126
Pomógł: 2
Dołączył: 27.08.2006

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


Dzięki, spróbuję coś dzisiaj wykombinować (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 2.10.2025 - 22:45