Autor | Zpráva | ||
---|---|---|---|
Ikki Profil |
#1 · Zasláno: 24. 6. 2018, 00:38:45
Ahoj, nějak mi hlava nyní nebere, jak vlastně vypsat u všech lidí, které sleduji, zda tedy u nich mám follow (pokud ano, vypíše se unfollow), nebo ne (vypíše se sledovat). Pokud nejsem přihlášený hláška zůstává "sledováno".
if($_SESSION['email']){ $sledovani = date("d.m.Y H:i"); $followers_get = $mysqli->query("SELECT * FROM main_followers WHERE id_sledujiciho=".$_SESSION['id'].""); $follow_get = $followers_get->fetch_array(); if($follow_get['id_sledovaneho'] == $follow['id']){ echo '<a href="?unfollow='.$follow['id'].'" class="btn follow">Unfollow</a>';}else{echo '<a href="?follow='.$follow['id'].'" class="btn follow">Sledovat</a>';}} }else{echo '<a href="#" class="btn follow">Sledujících</a>';} echo ' Děkuji za pomoc, a vysvětlení. |
||
Keeehi Profil |
#2 · Zasláno: 24. 6. 2018, 01:22:43
Ikki:
Tak základem vypsání všech lidí bude zřejmě cyklus, že? Metoda fetch_array vrátí řádek výsledku. Při každém zavolání vrátí další, takže se musí volat v cyklu. Dá se to elegantně volat už přímo v podmínce toho cyklu. if($_SESSION['email']) { $sledovani = date("d.m.Y H:i"); $followers = $mysqli->query("SELECT * FROM main_followers"); while($follower = $followers->fetch_array()) { if($follower['id_sledovaneho'] === $_SESSION['id']){ echo '<a href="?unfollow='.$follower['id_sledovaneho'].'" class="btn follow">Unfollow '.$follower['jmeno'].'</a>'; } else { echo '<a href="?follow='.$follower['id_sledovaneho'].'" class="btn follow">Sledovat '.$follower['jmeno'].'</a>'; } } } else { echo '<a href="#" class="btn follow">Sledujících</a>'; } |
||
Ikki Profil |
#3 · Zasláno: 24. 6. 2018, 13:23:32
Keeehi:
takhle jsem to zkoušel také, jenže tady nastává ten problém, že pokud použiju cyklus, tak u každého uživatele se vypíšou všechny follow´s. Potřebuji vypsat 3 nejvíce sledované uživatele a pokud to vypíšu v cyklu, tak u každého mám "Sledovat, Unfollow, Sledovat", samozřejmě pořadí se mění dle uživatele, zda ho sleduji. Takhle to vypadá, jenže UNFOLLOW to vypíše jen u jednoho ze všech tří, které sleduji - ctrlv.cz/Una2 A když použiji cyklus, vypadá to takhle - ctrlv.cz/36j4 Při použití kódu, který jsi mi zaslal se zobrazí pouze "Karel Gott" a opět tři "follow, unfollow, follow". Celý kód vypadá takto; $followers= $mysqli->query("SELECT * FROM main_users ORDER BY followers DESC LIMIT 3"); while($follow = $followers->fetch_array()){echo ' <div class="media"> <div class="media-left"><a href="/profile/'.$follow['nickname'].'"><img src="'.$follow['avatar'].'" alt="" class="circle"></a></div> <div class="media-body media-middle"> <a href="/profile/'.$follow['nickname'].'"><h5>'.$follow['nickname'].'</h5></a> <div class="btn-group"> <a href="#" class="btn follower_count">'.$follow['followers'].'</a>'; if($_SESSION['email']){ $sledovani = date("d.m.Y H:i"); $followers_get = $mysqli->query("SELECT * FROM main_followers WHERE id_sledujiciho=".$_SESSION['id'].""); $follow_get = $followers_get->fetch_array(); if($follow_get['id_sledovaneho'] == $follow['id']){ echo '<a href="?unfollow='.$follow['id'].'" class="btn follow">Unfollow</a>';}else{echo '<a href="?follow='.$follow['id'].'" class="btn follow">Sledovat</a>';} }else{echo '<a href="#" class="btn follow">Sledujících</a>';} echo ' </div> </div> </div>';} Děkuji za pomoc, jsem bezradný. |
||
Keeehi Profil |
Ikki:
Ty ten cyklus tam máš, ale už o úroveň výše. Pak samozřejmě tam potřeba není ale z tvého kódu poznat nebylo. Z nového to už jasné je. $followers= $mysqli->query("SELECT * FROM main_users ORDER BY followers DESC LIMIT 3"); while($follow = $followers->fetch_array()) { echo ' <div class="media"> <div class="media-left"><a href="/profile/'.$follow['nickname'].'"><img src="'.$follow['avatar'].'" alt="" class="circle"></a></div> <div class="media-body media-middle"> <a href="/profile/'.$follow['nickname'].'"><h5>'.$follow['nickname'].'</h5></a> <div class="btn-group"> <a href="#" class="btn follower_count">'.$follow['followers'].'</a>'; if($_SESSION['email']) { $sledovani = date("d.m.Y H:i"); $followers_get = $mysqli->query("SELECT * FROM main_followers WHERE id_sledovaneho=$follow[nickname] AND id_sledujiciho=$_SESSION[id]"); if(mysqli_num_rows($followers_get) === 0){ echo '<a href="?follow='.$follow['id'].'" class="btn follow">Sledovat</a>'; } else { echo '<a href="?unfollow='.$follow['id'].'" class="btn follow">Unfollow</a>'; } } else { echo '<a href="#" class="btn follow">Sledujících</a>'; } echo ' </div> </div> </div>'; } Jinak víš že sloupeček followers v tabulce main_users je zbytečný? Stejné číslo dostaneš pomocí SELECT id_sledovaneho, COUNT(*) AS followers FROM main_followers GROUP BY id_sledovaneho ORDER BY followers DESC |
||
Ikki Profil |
#5 · Zasláno: 24. 6. 2018, 16:29:00
Ahoj, děkuji za pomoc.
Ještě jsem si to trošku upravil a funguje to bezvadně. Toho selectu na followers jsem si vědom, nicméně to má svůj důvod, ale asi to předělám. Uvidím v konečném výsledku, jak to bude fungovat. |
||
Keeehi Profil |
#6 · Zasláno: 24. 6. 2018, 16:44:27
Ikki:
„nicméně to má svůj důvod“ A mohu se zeptat jaký? Říká se tomu denormalizace (protože existují takzvané normální formy) a dělá se to třeba pokud by ta tabulka měla desítky milionů záznamů a výpočet by začal být pomalý a nadmíru zatěžoval databázi. Změny v tom sloupečku je pak dobré dělat automaticky pomocí triggerů a pokud by se dělaly ručně dalším sql dotazem pak by zase měly být v transakci. No a v neposlední řadě to může dělat problémy s atomicitou. |
||
Ikki Profil |
#7 · Zasláno: 24. 6. 2018, 16:58:11
Základní důvod byl ten, že jsem to chtěl dělat přehlednější pro mne.
Nicméně nakonec došlo k tomu, že potřebuji selectnout globálně followery, ale count mi to neumožní v globálním provedení tak, abych to mohl použít kdekoli a zároveň to nevyužíval zbytečně, protože se může stát, že danou funkci využiji dvakrát s danými podmínkami a pak už vůbec. A mělo to ještě jeden důvod, ale ten si teď nemohu vybavit. Poslední dobou zapomínám i boty. Ale pokud je to podle tebe blbost (jsi zkušenější), tak nebude problém to předělat. Nicméně se trošku bojím toho, že když se tam následně dostane několik set tisíc uživatelů, followerů, tak ten count nebude zvládat. |
||
Keeehi Profil |
#8 · Zasláno: 24. 6. 2018, 17:30:02
Ikki:
„Nicméně se trošku bojím toho, že když se tam následně dostane několik set tisíc uživatelů, followerů, tak ten count nebude zvládat.“ Tomu se říká premature optimization. Ano takový problém teoreticky nastat může a potom bude potřeba ho řešit. Jenže on často ani nenastane. Například pro to, že projekt nebude zase tak úspěšný a nebude mít tolik uživatelů. A nebo pokud úspěšný bude a bude mít spoustu uživatelů tak se to slabé místo ukáže nejdříve někde jinde. Například že nebude stíhat webserver a budeš jich muset mít více a nejdříve tedy budeš muset vyřešit loadbalancing. Nebo i kdyby se to týkalo databáze tak zjistíš, že úplně jiný dotaz je pomalý a bude potřeba optimalizovat nejdříve ten. Obecně se tedy doporučuje optimalizovat až ve chvíli kdy je to potřeba, protože dopředu nevíš, co bude tím úzkým hrdlem. |
||
Časová prodleva: 6 let
|
0