Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Powrót na początek skryptu
Forum PHP.pl > Forum > Przedszkole
Deusx
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. }
flashdev
Korzystanie z tego raczej nie jest zalecane, ale proszę, jest:

http://php.net/manual/en/control-structures.goto.php
Deusx
Możesz napisać czemu nie jest zalecane?
flashdev
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
Pilsener
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.
Deusx
Obecnie stosuję pętle, ale wykonuję się ponad 30 sek i jest błąd.
flashdev
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
Pilsener
Pokaż kod tej pętli, to zaraz przerobimy go tak, by wykonywał się szybciej.
Deusx
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ę ?
flashdev
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?
Pilsener
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.
Deusx
  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 smile.gif
Pilsener
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.

Deusx
Dzięki, spróbuję coś dzisiaj wykombinować smile.gif
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.