Autor Zpráva
ludvalb
Profil
Zdravím, mám následující funkci, která by mi měla vytvářet stránkování dle jednotlivých tránek, ale bohužel nefunguje správně. Zdá se mi, že podmínka if neskončí pokud není první stránka platná a hodnoty se přenesou do ostatních podmínek což mi zapříčiní, že pak mám stránkování všude stejné. Zkoušel jsem různé varianty zápisu if ale bohužel mi nic nepomohlo. Nevědel by někdo jak problém vyřešit.

Předem moc děkuji.

function strankovani(){
$page=$_GET["page"];
if ($page==vytiskle-doklady){ 
  $zobrazit_strankovani = true;
  $sql = mysql_query('SELECT * from (SELECT * from deni_prehled UNION ALL SELECT * from zaloha_deni_prehled) prehled WHERE autoID>0  AND date!="0000-00-00" GROUP BY autoID ORDER BY date DESC, autoID DESC');
  $query = mysql_query('SELECT vytiskle_doklady from nastaveni');
  $radku = mysql_result($query,0,'vytiskle_doklady');
  $pocet = mysql_num_rows($sql)/$radku;
}elseif($page==nevytiskle-doklady){ 
  $zobrazit_strankovani = true;
  $sql = mysql_query('SELECT * from (SELECT * from deni_prehled UNION ALL SELECT * from zaloha_deni_prehled) prehled WHERE autoID<0  AND date!="0000-00-00" GROUP BY autoID ORDER BY date DESC, autoID');
  $query = mysql_query('SELECT nevytiskle_doklady from nastaveni');
  $radku = mysql_result($query,0,'nevytiskle_doklady');
  $pocet = mysql_num_rows($sql)/$radku;
}elseif($page==doklady-shop){ 
  $zobrazit_strankovani = true;
  $sql = mysql_query('SELECT * from (SELECT * from prehled_shop UNION ALL SELECT * from zaloha_prehled_shop) shop WHERE date!="0000-00-00" GROUP BY autoID ORDER BY date DESC, autoID DESC');
  $query = mysql_query('SELECT doklady_shop from nastaveni');
  $radku = mysql_result($query,0,'doklady_shop');
  $pocet = mysql_num_rows($sql)/$radku;
}elseif($page==doklady-vracene-zbozi){ 
  $zobrazit_strankovani = true;
  $sql = mysql_query('SELECT * FROM vracene_zbozi GROUP BY ID ORDER BY ID DESC');
  $query = mysql_query('SELECT doklady_vracene_zbozi from nastaveni');
  $radku = mysql_result($query,0,'doklady_vracene_zbozi');
  $pocet = mysql_num_rows($sql)/$radku;
}elseif($page==koupene-bez-dokladu){ 
  $zobrazit_strankovani = true;
  $sql = mysql_query('SELECT autoID from prodej WHERE nazev LIKE "%'.$find.'%" OR ean LIKE "%'.$find.'%"');
  $query = mysql_query('SELECT koupene_bez_dokladu from nastaveni');
  $radku = mysql_result($query,0,'koupene_bez_dokladu');
  $pocet = mysql_num_rows($sql)/$radku;
}elseif($page==prodane-bez-dokladu){ 
  $zobrazit_strankovani = true;
  $sql = mysql_query('SELECT prehled.produktID, prehled.ks_prodej from (SELECT * from deni_prehled UNION ALL SELECT * from zaloha_deni_prehled) prehled WHERE autoID<0  AND date!="0000-00-00" GROUP BY produktID ORDER BY 2 DESC');
  $query = mysql_query('SELECT prodane_bez_dokladu from nastaveni');
  $radku = mysql_result($query,0,'prodane_bez_dokladu');
  $pocet = mysql_num_rows($sql)/$radku;
}elseif($page==uvod){ 
  $zobrazit_strankovani = true;
  $sql = mysql_query('SELECT autoID from prodej WHERE nazev LIKE "%'.$find.'%" OR ean LIKE "%'.$find.'%"');
  $query = mysql_query('SELECT sklad from nastaveni');
  $radku = mysql_result($query,0,'sklad');
  $pocet = mysql_num_rows($sql)/$radku;
}elseif($page==trvanlivost){ 
  $zobrazit_strankovani = true;
  $sql = mysql_query('SELECT nazev, datum from prodej WHERE datum!="0000-00-00" ORDER BY 2');
  $query = mysql_query('SELECT trvanlivost from nastaveni');
  $radku = mysql_result($query,0,'trvanlivost');
  $pocet = mysql_num_rows($sql)/$radku;
}elseif($page==registrace){ 
  $zobrazit_strankovani = true;
  $sql = mysql_query('SELECT autoID from registrace WHERE jmeno LIKE "%'.$find.'%"');
  $query = mysql_query('SELECT registrace from nastaveni');
  $radku = mysql_result($query,0,'registrace');
  $pocet = mysql_num_rows($sql)/$radku;
}elseif($page==registrace-shop){ 
  $zobrazit_strankovani = true;
  $sql = mysql_query('SELECT autoID from registrace_shop WHERE jmeno LIKE "%'.$find.'%"');
  $query = mysql_query('SELECT registrace_shop from nastaveni');
  $radku = mysql_result($query,0,'registrace_shop');
  $pocet = mysql_num_rows($sql)/$radku;
}
    
echo 'Stránka ';
  for ($i = 0;$i<$pocet;$i++) {
    $str=$radku*$i.','.$radku;
    $stranka=$i+1;
    echo '<a href=index.php?page='.$page.'&str='.$str.'>'.$stranka.' </a>';
  }
}

Funkci pak následně volám na daném místě pomocí.

<?php
strankovani();
?>
Davex
Profil
Především bych se nesnažil o odčítání nedefinovaných konstant $page==vytiskle-doklady a používal řetězce v uvozovkách.
Tori
Profil
ludvalb:
1. Funkce by si nic neměla magicky zjišťovat sama, hodnotu $_GET['page'] jí předávejte parametrem.
2. Řetězce (viz podmínky) pište v uvozovkách, to je příčinou chyby.*
3. Když potřebujete jen zjistit počet řádků, SELECT COUNT(*) je podstatně lepší než SELECT * + mysql_num_rows. Používat řazení je v tomto případě IMHO rovněž zbytečné.
4. V některých SQL dotazech používáte nedefinovanou proměnnou $find, výsledkem bude nejspíš WHERE jmeno LIKE '%%', celou podmínku s LIKE lze tedy vynechat.

* Vysvětlení pro případné zájemce: Pokud by neuvozené řetězce obsahovaly jen písmena, chyba by nevznikla. Ale pokud obsahují pomlčku, PHP to nevyhodnotí jako nedefinovanou konstantu "vytiskle-doklady", nýbrž pokus odečíst od sebe dvě nedefinované konstanty ("vytiskle" a "doklady"). Před odečítáním se obě musí převést na číslo - výsledkem je 0 - 0, tedy nula. Před následujícím porovnáním čísla a řetězce ($page == 0) se řetězec musí převést na číslo, výsledek také nula - podmínka (kterákoli obsahující pomlčku) tedy projde.
Joker
Profil
ludvalb:
Nejsem si jistý, co přesně znamená popis toho problému, respektive jak si to představit.

Ale jinak v tom kódu je -bez urážky- chyb jak máku.
0. Na vývojovém prostředí si nastavte error_reporting na E_ALL a případně vypisování hlášek na obrazovku, jestli nevíte, kde je log. Pak se snažte řešit každou hlášku, kterou skript vypíše.
1. Řetězce se dávají do uvozovek. ("vytiskle-doklady" atd.)
2. Funkce by měla pokud možno být oddělená od okolního prostředí. $page=$_GET["page"]; - proč nepoužijete parametr?
3. elseif, elseif, elseif, elseif, elseif,… Slyšel jste o switch? Tím by se zároveň některé věci daly řešit elegantněji.
4. Když jste ty samé příkazy kopíroval (či psal) znovu a znovu do jednotlivých IF větví (některé jsou totožné ve všech deseti), nepomyslel jste si, že to je divné, že přece musí být lepší způsob?
5. Pokud dotaz na počet řádků vrátí nulu nebo něco, co se na nulu konvertuje (nečíselný řetězec, prázdný řetězec, atd.), skončí skript na dělení nulou.
6. Celkově se vůbec neřeší selhání nějakého dotazu.
7. Pokud $pocet bude 0, vypíše se jen "Stránka ".
8. To samé (bod 7.) nastane, když $page nespadne do žádné větve.
9. Nepoužívejte SELECT * FROM tabulka, když chcete jen zjistit počet řádků.
10. 'SELECT vytiskle_doklady from nastaveni' a pak se použije jen první výsledek. To zavání nějakým divným návrhem databáze.
Tori
Profil
Ještě mě napadlo: Zkuste místo tohoto dotazu:
SELECT * from (
  SELECT * from deni_prehled 
  UNION ALL 
  SELECT * from zaloha_deni_prehled) prehled 
WHERE autoID>0  AND date!="0000-00-00" 
GROUP BY autoID 
ORDER BY date DESC, autoID DESC
použít následující. Měly by se lépe využít indexy. U obou tabulek předpokládám index na sloupci autoID. V prvním dotazu (= bez poddotazu) by asi měla být ta větší tabulka.
SELECT SUM(c) FROM (
  SELECT COUNT(*) c FROM zaloha_deni_prehled
    WHERE autoID > 0 AND `date` != "0000-00-00"
  UNION ALL 
  SELECT COUNT(*) c FROM deni_prehled d
    WHERE autoID > 0 AND `date` != "0000-00-00"
    AND NOT EXISTS (SELECT * FROM zaloha_deni_prehled z WHERE z.autoID = d.autoID)
) u

Tohle bude možná ještě jednodušší, optimizér si s tím umí poradit, zdá se:
SELECT COUNT(*) FROM (
  SELECT autoID FROM deni_prehled
    WHERE autoID > 0 AND `date` != "0000-00-00"
  UNION DISTINCT
  SELECT autoID FROM zaloha_deni_prehled
    WHERE autoID > 0 AND `date` != "0000-00-00"
) u
abc
Profil
ř. 3 -> if ($page=="vytiskle-doklady"){
ř. 8 podobně
dál jsem nečetl
edit: zapoměl jsem si refreshnout, takže s křížkem po funuse :-)

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