Autor | Zpráva | ||
---|---|---|---|
potom Profil |
Ahoj, poradíte prosím, jak zrychlit nebo řešit lépe? Trvá moc dlouho.
Zkusím vysvětlit: Jedná se o systém na rezervaci vstupenek: Zjednodušeně - proměná $string obsahuje plánek sálu, který se přetransformuje na checkboxy - sedadla - obsazená neaktivní, volná aktivní: $string= "[6kino10] [6kino9] [6kino8] [6kino7] [6kino6] [6kino5] [6kino4] [6kino3] [6kino2] [6kino1] [7kino10] [7kino9] [7kino8] [7kino7] [7kino6] [7kino5] [7kino4] [7kino3] [7kino2] [7kino1] [8kino10] [8kino9] [8kino8] [8kino7] [8kino6] [8kino5] [8kino4] [8kino3] [8kino2] [8kino1] [9kino10] [9kino9] [9kino8] [9kino7] [9kino6] [9kino5] [9kino4] [9kino3] [9kino2] [9kino1] [10kino10] [10kino9] [10kino8] [10kino7] [10kino6] [10kino5] [10kino4] [10kino3] [10kino2] [10kino1] [11kino10] [11kino9] [11kino8] [11kino7] [11kino6] [11kino5] [11kino4] [11kino3] [11kino2] [11kino1] [12kino10] [12kino9] [12kino8] [12kino7] [12kino6] [12kino5] [12kino4] [12kino3] [12kino2] [12kino1] [13kino10] [13kino9] [13kino8] [13kino7] [13kino6] [13kino5] [13kino4] [13kino3] [13kino2] [13kino1] [14kino10] [14kino9] [14kino8] [14kino7] [14kino6] [14kino5] [14kino4] [14kino3] [14kino2] [14kino1] [15kino12] [15kino11] [15kino10] [15kino9] [15kino8] [15kino7] [15kino6] [15kino5] [15kino4] [15kino3] [15kino2] [15kino1]"; $newstring = preg_replace_callback('#\[(.*?)\]#', function($match) use($conn2,$get_novarezervace) { //id sedadla v hranaté závorce se vyhledá v seznamu sedadel, zjistím jestli vůbec existuje, a zjistím jeho iterní ID $qq = "SELECT id from position WHERE storno = '0' AND disabled = '0' AND seat_id= '$match[1]' order by sedadlo * 1 LIMIT 1 "; $result2 = $conn2->query($qq); if ($result2->num_rows > 0) {while($positions = $result2->fetch_assoc()) { //zjistím, jestli pro toto ID sedadla byla koupena vstupenka $result3 = $conn2->query("SELECT id from tickets WHERE storno = '0' AND position = '$positions[id]' AND refund_for_ticket IS NULL AND event_id = '$get_novarezervace' LIMIT 1"); if ($result3->num_rows > 0) { while($tickets = $result3->fetch_assoc()) { // obsazené sedadlo hodí disabled checkbox $outext .= '<input class="styled " type="checkbox disabled" disabled><label for="seat'.$positions[id].'"></label>'; }} else { // volné sedadlo hodí funkční checkbox $outext .= '<input id="seat'.$positions[id].'" class="styled limitThree" name="seat'.$positions[id].'" type="checkbox" value="1" '.$dis_able.'><label for="seat'.$positions[id].'"></label>' ; } }} return $outext; }, $string ); echo $newstring; Poradíte jak udělat lépe a urychlit vykonání skriptu bez nějakého zásadního zásahu? Děkuji za pomoc. |
||
blaaablaaa Profil |
#2 · Zasláno: 19. 10. 2021, 08:17:02
potom:
Logika by měla být obrácená - v db bys měl vědět, jaká sedadla chceš vybrat, k nim si pak zjistit, zda už je obsazené či ne. Pak budeš mít jen jeden dotaz namísto 2n dotazů. Případně, prasáčtěji a bez nutnosti úpravy struktury, lze vybrat všechna sedadla přes WHERE seat_id IN('6kino10', '6kino9', ...) a k nim pak přes LEFT JOIN na tickets doplnit informaci o obsazenosti.
|
||
N71 Profil * |
#3 · Zasláno: 19. 10. 2021, 21:51:12
potom:
Máš callback s dvěma SQL dotazy, který se opakuje cca 100×. Což je samozřejmě špatně. V databázi navíc používáš textové typy pro booleovské hodnoty (patrně bez indexu) a řadíš podle matematického výrazu (takže definitivně bez indexu). Velký špatný. Celé to smaž a začni znovu. Měl by ti stačit jeden SQL dotaz – získání všech rezervací. Podle nich pak vykresli rozhraní. |
||
Časová prodleva: 3 roky
|
0