Autor Zpráva
mattyZEM
Profil
Ahoj, mám WHILE na nadpisy sekcí v menu, a WHILE na odkazy v menu, takto:

        $sekceq=mysql_query("SELECT * FROM menu_sekce WHERE msprihlasen = '0' and msprava = '0'");
        $menuq=mysql_query("SELECT * FROM menu_odkazy WHERE moprihlasen = '0' and moprava = '0'");
        while($menu=mysql_fetch_assoc($menuq)){
            if($menu['mosoubor'] == $soubor){$class =' class="active"';}else {$class='';}
            if($menu['motarget'] == 1){$target= ' target="blank"';}else {$target='';}
            $pole[] = $menu['mosekce'];
            $pole[] .= '<li'.$class.'><a href="'.$menu['mohref'].'"'.$target.'>'.$menu['moname'].'</a></li>';
        }
        while($sekce=mysql_fetch_assoc($sekceq)){      
          $prvni=substr($sekce['msnazev'], 0, 1);
          $zbytek=substr($sekce['msnazev'], 1);
          $msid=$sekce['msid'];
          
          echo '<div class="menu_nadpis"><span class="menu_nadpis_prvni">'.$prvni.'</span>'.$zbytek.'</div>';
          echo '<ul>';
          foreach($pole as $odkaz){
            if($odkaz[0]==$msid){
              echo $odkaz[1];
            }
          }
          echo '</ul>';         
        }

Problém je v tom, že $odkaz[0] funguje (tj. to ID sekce [řádek #6]), ale $odkaz[1] (tj odkaz [řádek #7]) ne (na řádcích #17,18)
Notice: Uninitialized string offset: 1 in .....\index.php on line X


Sorry za název, za "odděleně" má být čárka, a lepší název mě nenapadl :(
SwimX
Profil
Za to může asi řádek #7. Zruš tu tečku.
pole[] .= '<li'.$class.'><a href="'.$menu['mohref'].'"'.$target.'>'.$menu['moname'].'</a></li>';

Já to ale většinou dělám jinak:
$sekceq=mysql_query("SELECT * FROM menu_sekce WHERE msprihlasen = '0' and msprava = '0'");
while($sekce=mysql_fetch_assoc($sekceq)){    
  $prvni=substr($sekce['msnazev'], 0, 1);
  $zbytek=substr($sekce['msnazev'], 1);
  echo '<div class="menu_nadpis"><span class="menu_nadpis_prvni">'.$prvni.'</span>'.$zbytek.'</div>';
  echo '<ul>';
  
  $menuq=mysql_query("SELECT * FROM menu_odkazy WHERE moprihlasen = '0' and moprava = '0' and mosekce = {$sekce['msid']}");
  while($menu=mysql_fetch_assoc($menuq)){
    if($menu['mosoubor'] == $soubor){$class =' class="active"';}else {$class='';}
    if($menu['motarget'] == 1){$target= ' target="blank"';}else {$target='';}          
    echo '<li'.$class.'><a href="'.$menu['mohref'].'"'.$target.'>'.$menu['moname'].'</a></li>';
  }
  echo '</ul>';
}

Sice se provede hodně dotazů na db, ale zase se ušetří čas zpracováváním.

Nejlepší by bylo načísto to rovnou celé seřazené v jednom SQL dotazu. Ale nikdy jsem se nad tím nezamyslel natolik, abych ho vyplodil, zkus o to požádat v kategorii databáze na webu, jistě někdo poradí.
mattyZEM
Profil
SwimX:
Já to ale většinou dělám jinak:
S prominutím to děláš blbě. Nejsem nějaký odborník, ale u tohoto budeš do sql cpát více příkazů než musíš, protože budeš zadávat Xkrát příkaz do sql navíc.

Btw, pořád to nefunguje :(
SwimX
Profil
mattyZEM:
ano sql příkazů se provede víc, ale zase nebudu cpát všechno do pole a pak ho procházet v každé sekci celé znova a znova. težko říct co bude rychlejší, nejlepší by bylo to co píšu na konci příspěvku.

má to být takle: místo obou řádek 6,7 dej tudle:
$pole[] = array($menu['mosekce'], '<li'.$class.'><a href="'.$menu['mohref'].'"'.$target.'>'.$menu['moname'].'</a></li>');
mattyZEM
Profil
SwimX:
má to být takle
Thank you sir.

Jsi moje záchrana o.O
Alphard
Profil
Nebo takhle, je to skoro stejné, ale osobně se mi to líbí víc.
 $pole[$menu['mosekce']][] = '<li'.$class.'><a href="'.$menu['mohref'].'"'.$target.'>'.$menu['moname'].'</a></li>';

    // sem možná podmínku pro případ, že je daná sekce prázdná
    foreach($pole[$msid] as $odkaz){
        echo $odkaz;
    }


SwimX:
ale zase nebudu cpát všechno do pole a pak ho procházet v každé sekci celé znova a znova. težko říct co bude rychlejší
Myslím, že procházení pole bude (do určité velikosti) podstatně rychlejší. Obecně se doporučuje minimalizovat počet dotazů na databázi. Vytahovat menu 10 dotazy při každém reloadu mi nepřipadá jako dobrý nápad.
SwimX
Profil
Alphard:
A co to dostat do jednoho dotazu, nešlo by to? :)
mattyZEM
Profil
Alphard:
ale osobně se mi to líbí víc.
Jediný důvod proč to použít a klidně to použiju :)
Alphard
Profil
SwimX:
A co to dostat do jednoho dotazu, nešlo by to? :)
Šlo by to, jestli je zájem. Ale mám bohužel zkušenost, že se člověk často snaží a tazatel nakonec stejně použije jednodušší řešení.
Stačil by jednoduchý join a seskupení při výpisu.

mattyZEM:
Jediný důvod proč to použít a klidně to použiju
Nenutím vás. Psal jsem vám odpověď a před odesláním jsem zjistil, že SwimX byl rychlejší, toť vše.
mattyZEM
Profil
Alphard:
Nenutím vás
O to nejde, jen pokud je to v něčem lepší, tak to použiji.
SwimX
Profil
mattyZEM:
asi snažší orientace, protože stejně to pole musí mít nějaký klíč, tak proč mu nedat id položky. A pak nemusí být položka $pole pole, stačí string, takže menší zátěž. Asi je to lepší.

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