Deusx
27.08.2010, 18:04:29
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
$sprawdz = mysql_query('select `id` form tabela where `liczba` = '.$liczba.'');
liczba zajęta
//
//Jak teraz wrócić z powrotem z losowania ?
//
} else {
//liczba wolna, wykonaj dalej skrypt
}
flashdev
27.08.2010, 18:06:37
Korzystanie z tego raczej nie jest zalecane, ale proszę, jest:
http://php.net/manual/en/control-structures.goto.php
Deusx
27.08.2010, 18:08:44
Możesz napisać czemu nie jest zalecane?
flashdev
27.08.2010, 18:10:59
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-8tutaj znacznie więcej ->
http://www.google.pl/search?client=opera&a...-8&oe=utf-8Edit:
Usunąłem link do wulgarnego bloga
Pilsener
27.08.2010, 18:12:33
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
27.08.2010, 18:13:37
Obecnie stosuję pętle, ale wykonuję się ponad 30 sek i jest błąd.
flashdev
27.08.2010, 18:14:45
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
27.08.2010, 18:16:24
Pokaż kod tej pętli, to zaraz przerobimy go tak, by wykonywał się szybciej.
Deusx
27.08.2010, 18:16:43
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
27.08.2010, 18:20:04
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
27.08.2010, 18:26:34
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
27.08.2010, 18:31:17
$LastSettedGalaxyPos = $_POST['uklad'];
$LastSettedSystemPos = 1;
$LastSettedPlanetPos = 1;
while (!isset($newpos_checked)) { for ($Galaxy = $LastSettedGalaxyPos; $Galaxy <= 5; $Galaxy++) {
for ($System = $LastSettedSystemPos; $System <= 200; $System++) {
for ($Posit = $LastSettedPlanetPos; $Posit <= 4; $Posit++) {
switch ($LastSettedPlanetPos) {
case 1:
$LastSettedPlanetPos += 1;
break;
case 2:
$LastSettedPlanetPos += 1;
break;
case 3:
if ($LastSettedSystemPos == 200) {
$LastSettedGalaxyPos += 1;
$LastSettedSystemPos = 1;
$LastSettedPlanetPos = 1;
break;
} else {
$LastSettedPlanetPos = 1;
}
$LastSettedSystemPos += 1;
break;
}
break;
}
break;
}
break;
}
$Galaxy = $_POST['uklad'];
$QrySelectGalaxy = "SELECT * ";
$QrySelectGalaxy .= "FROM {{table}} ";
$QrySelectGalaxy .= "WHERE ";
$QrySelectGalaxy .= "`galaxy` = '". $Galaxy ."' AND ";
$QrySelectGalaxy .= "`system` = '". $System ."' AND ";
$QrySelectGalaxy .= "`planet` = '". $Planet ."' ";
$QrySelectGalaxy .= "LIMIT 1;";
$GalaxyRow = doquery( $QrySelectGalaxy, 'galaxy', true);
if ($GalaxyRow["id_planet"] == "0") {
$newpos_checked = true;
}
if (!$GalaxyRow) {
CreateOnePlanetRecord ($Galaxy, $System, $Planet, $NewUser['id'], $UserPlanet, true);
$newpos_checked = true;
}
if ($newpos_checked) {
doquery("UPDATE {{table}} SET `config_value` = '". $LastSettedSystemPos ."' WHERE `config_name` = 'LastSettedSystemPos';", 'config');
doquery("UPDATE {{table}} SET `config_value` = '". $LastSettedPlanetPos ."' WHERE `config_name` = 'LastSettedPlanetPos';", 'config');
}
}
To jest cała pętla
Pilsener
27.08.2010, 18:41:09
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
27.08.2010, 18:52:45
Dzięki, spróbuję coś dzisiaj wykombinować
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.