Autor Zpráva
Ikki
Profil
Zdravím, chtěl bych se zeptat co je špatně na tomto kódu:
                    <ul class="nk-nav nk-nav-right hidden-md-down" data-nav-mobile="#nk-nav-mobile">
                        
                        
                        <?php while($row = mysqli_fetch_array($surmenu)){; 
                        if($row['typ'] == 0){echo '
                        <li>';}else{echo'<li class=" nk-drop-item">';}
                        echo '<a href="'.$row['odkaz'].'">'.$row['nazev'].'</a>';?>   
                            <ul class="dropdown">
                        <?php while($done = mysqli_fetch_array($commenu)){;
                        if($row['id'] == $done['id1']){?>    
                                <li>
                                  <a href="<?php echo $done['odkaz'];?>"><?php echo $done['nazev'];?></a>
                                </li>
                                <?php }}?>
                            </ul> <?php }?>
                            
                        </li>

Výpis mám udělaný takto:
$surmenu = $mysqli->query("SELECT * FROM menu WHERE id1=0 ORDER BY id");
$commenu = $mysqli->query("SELECT * FROM menu WHERE id1>=1 AND id2>=1 ORDER BY id");        

Funguje to krásně, pouze je problém v tom, že se submenu zobrazuje jen u první položky v menu, nikoli např. u třetí.

Database:
id, id1, id2, nazev, odkaz, typ, aktivni

id = id menu (parent)
id1 = id submenu (child)
id2 = označení/pozice submenu
typ = zda se jedná o submenu, či nikoli
Lonanek
Profil
Protože tam není načteno.
Ve smyčce WHILE nemá být za { znak ; - v obou cyklech
konstrukce smyčky je:
WHILE (podmínka)
{
  ... příkazy ...
}

Není patrné, kde jsou selecty. Při prvním průchodu "hlavní" smyčkou je druhý select dokončen a při dalším průchodu pak již nemá z čeho načítat.
Je nevhodně zvolena smyčka průchodu tabulkou. Nelze to řešit jednoprůchodovou smyčkou?
Keeehi
Profil
Lonanek:
Ten střední je tam sice navíc, ale myslím že ničemu zásadně nevadí.

Ikki:
Hlavní problém je v tom, že při prvním průchodu vnějším cyklem se proiteruje celý výsledek druhého dotazu a při dalším průchodu vnějšího cyklu už není uvnitř nad čím iterovat.

Je to strašně nečitelné, takže jsem to přepsal:
<?php
$surmenu = $mysqli->query("SELECT id, odkaz, nazev FROM menu WHERE id1=0 ORDER BY id");
while($row = mysqli_fetch_array($surmenu)) {
    $commenu = $mysqli->query("SELECT odkaz, nazev FROM menu WHERE id1=$row['id'] ORDER BY id"); 
    
    if($commenu->num_rows == 0) {
        echo '<li>';
        echo '<a href="'.$row['odkaz'].'">'.$row['nazev'].'</a>'
        echo '</li>';
    } else {
        echo '<li class="nk-drop-item">';
        echo '<a href="'.$row['odkaz'].'">'.$row['nazev'].'</a>'
        echo '<ul class="dropdown">';
        while($done = mysqli_fetch_array($commenu)) {
            echo '<li><a href="'.$done['odkaz'].'">'.$done['nazev'].'</a></li>';  
        }
        echo '</ul>';
        echo '</li>';
    }
}
?>

Případně by mělo jít použít u původního kódu $commenu->data_seek(0); před koncem vnějšího cyklu, tím se pointer nastaví na začátek a mělo by tím jít iterovat znovu. Má to tu výhodu, že bude položeno méně dotazů do databáze. Ještě by ten druhý dotaz měl jít přepsat, aby ty položky vracel ve správném pořadí a jakmile se dostane k položce z dalšího submenu, tak přeruší vnitřní smyčku. To by mělo být úplně nejefektivnější. Jelikož se ale jedná o malinkaté menu, bude vlastně úplně jedno, jak efektivní kód je.
Lonanek
Profil
Keeehi:
Vadit by neměl, ale ...
OT: S tím přepisem jsi mě předběhl.

Ikki:
Dle mě by se vše dalo řešit jedním dotazem a využít položky id2, za předpokladu, že menu = 0 a submenu pak 1, 2, ...
Chce to si jen trochu logicky pohrát s řazením a pak jen v jednom cyklu vše vypsat.
První se vypíše menu1, pak jeho submenu1, menu2 a jeho submenu2, ...
Ikki
Profil
Ten středník tam je z toho důvodu, že na našem hostingu byla PHP 5 a z nějakého důvodu to bez něj prostě nefungovalo.
Před pár minutami jsme to změnili, takže už tam opravdu potřebný není.

Jinak díky Keeehi, neuvědomil jsem si to :')

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: