Autor Zpráva
Ikki
Profil
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
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>';
}
Jelikož neznám strukturu tabulky a tedy hlavně význam jejich sloupců, tak jsem to musel odhadnout. Reálně může ten dotaz vypadat trochu jinak a i sloupce použité dále v kódu mohou být jiné. Kostra by ale měla být takto správně.
Ikki
Profil
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>';}
Tabulka main_followers a část z main_users - ctrlv.cz/D9eQ & ctrlv.cz/VrNm

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>';
}
Prosím, formátuj nějak normálně ten kód. Jak to nemáš odsazené, tak je to téměř nečitelné.


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
Sloupeček followers je tedy redundantní a je ho potřeba měnit pokaždé, když se v tabulce main_followers něco změní. Ona ta redundance má v určitých případech smysl ale celé je to pak dobré dělat trochu na vyšší úrovni. Hlavně by měl člověk u toho vědět co dělá a jaké jsou důsledky.
Ikki
Profil
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
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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0