[PHP] kniha návštěv - rozdělení příspevk 10 na tabulku

Webdesign, HTML, CSS, Flash, PHP, ASP, .NET, JavaScript. Kritika www stránek na Smetišti.

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod czbios 20. 11. 2005 11:49

nazdar závisláci!
Mockrát jste mi tady pomohli a zase žádám pomoc znova... :-)
mámknihu návštěv funguje :) .. ale chtěl bych tam samozřejmě ještě maličkost. velký počet příspěvku rozdělit do 10 nebo 20 na stránku a nemůžu přijít jak na to :-)

už mám udělaný že mi to rozpočítá na kolik stránek vyjde všechny příspěvky
Kód: Vybrat vše
$sql="select id from kniha order by id desc limit 1";
  $res=mysql_query($sql);
    if (!$res) {    echo mysql_errno() . "0. : " . mysql_error() . "\n";  };
    $zaznam=mysql_fetch_array($res);
    $zaznamy=$zaznam[0];
    $stranky=$zaznamy/10;
    $stranky=ceil($stranky);


a ted nevím jak to udělat aby to na klik reagovalo tak že to vypíše dalších 10 příspěvků .. .

výpis čísel a prvních 10 příspěvkůů už mám udělaný :

Kód: Vybrat vše
for($i=1;$i<=$stranky;$i++)
    :     
      ?>
       <form action="index1.php?sekce=<? echo("$sekce"); ?>" method="post">
        <input type="submit" name="<?php echo $i?>" value="<?php echo $i;?>">
       </form>
      <?php
      $dolnihranice=$i-1;
      $hornihranice=$i+9;
     
     if ($i==$stranky)
      :
       $sql="select jmeno,email,www,text,dc,ip from kniha order by id desc limit 0,10";
        $res=mysql_query($sql);
         if (!$res) {    echo mysql_errno() . "0. : " . mysql_error() . "\n";  };

        while($zaznam=mysql_fetch_array($res))
        :
         ?>
           <table id="vzkaz">
            <tr>
             <td id="levo">
              <?php echo $zaznam[0];?>
             </td>
             <td id="pravo">
                <?php echo $zaznam[4];?>
            </td>       
            </tr>
           <tr>
             <td id="levo">
               <?php echo $zaznam[1];?>
              </td>
             <td id="pravo">
               <?php echo $zaznam[5];?>
             </td>       
           </tr>
           <tr>
             <td id="levo">
               <?php echo $zaznam[2];?>
             </td>
             <td id="pravo">
               zruseni
             </td>       
           </tr>
           <tr>
             <td colspan=2 id="vzkaz">
               <?php echo $zaznam[3];?>
              </td>             
           </tr>
        </table>     
        <?php
        endwhile;
      endif;
    endfor;


a už to zkouším přes všechno možný.. přes odkaz jsem an to nepřišel ... a ted to nějak zkouším přes input submit .. poradí mi někdo ? prosím ?


// mbing : Téma přesunuto ● z Programování do Tvorba webových stránek a aplikací.
czbios
Junior
Uživatelský avatar

Odeslat příspěvekod miho 20. 11. 2005 12:55

Nejdrive si prostuduj zaklady PHP a SQL. Z tveho popisu jsem pochopil, ze nevis jak predat parametr pres querystring a jak nasledne pouzit klauzuli LIMIT. Veci jako echo("$sekce"); vypadaji hrozive. To jsou ale naproste zaklady.

Pouzivas alternativni formu zapisu cyklu a podminek, kterou pouziva tak 1% programatoru v PHP. Odhadem 90% ji ani vubec nezna takze budou z tveho kodu na vetvi a ty zase z jejich. Kde jsi na to vubec prisel na ty endif, endfor atd :-)

Pak si prostuduj nejaky priklad. Ty ted totiz vynalezas znova kolo a navic na to jdes spatne :-( Napr. Pocet zaznamu ziskat takto:
select id from kniha order by id desc limit 1
je spatne protoze to prestane fungovat kdyz nejake zaznamy smazes. spravne reseni je pres
select count(*) from kniha

Zkratka jdi na to od zacatku a stavej na solidnich zakladech. Sam sebe jsi hodil do hluboke vody ale neprospiva ti to.
miho
Hlavní administrátor
Uživatelský avatar

Odeslat příspěvekod neonn 20. 11. 2005 14:08

Nevim jestli ti to nejak pomuze, ale ja jsem tohle resil tak pred rokem :) ...
Nejdriv jsem hledal na netu, jak to vyresit, nasel jsem "LIMIT" v SQL dotazu a ruzne hotove scripty (1. den).
Pak jsem zkousel napsat svuj/upravit ukazkovy kod k obrazu svemu. Nejak mi to neslo. Vypinal jsem PC a asi tak do 5 min mi bliklo v hlave jak to udat (2. den).
A 3. den jsem to udelal :)

Ale ted k tomu scriptu:

Ja jsem si nejdriv nadefinoval konstantu, kolik ma byt clanku na stranku:
Kód: Vybrat vše
define('ROWS', 10);


Pak jsem si zjistil, kolik je celkem clanku a stran (ale neni to moc dobre udelane):
Kód: Vybrat vše
// ZJISTENI POCTU CLANKU PRO PRACI SE STRANKOVANIM
if (empty($_GET['total']))  {
$MQ_total = mysql_query('SELECT count(*) AS pocet FROM ' .$what_type);
$MF_total = mysql_fetch_array($MQ_total);
$total = $MF_total['pocet'];
}
else  {
$total = $_GET['total'];
}
// POCET CLANKU ZJISTEN
$pages = ceil($total/ROWS); // ZJISTENI POCTU STRAN


Nacteni clanku na stranu podle mnozstvi:
Kód: Vybrat vše
$MQ_art = mysql_query('SELECT artID, nadpis, popis, autor, kat, date
FROM ' .$what_type .' ORDER BY date DESC LIMIT ' .$from .' , ' .ROWS);

// Zformatovani clanku do HTML
while(...) {
...
}


A na konec stranky hodim odkazy na dalsi strany:
Kód: Vybrat vše
// ZACINAM S VYPOCTEN STRANKOVANI
//ZACATEK SMYCKY
for ($i = 0; $i < $pages; $i++) {
$od = ($i*ROWS)+1;
$do = ($i*ROWS)+ROWS;
  // POKUD JE VYPOCITAVANA STRANA AKTUALNI
  if (($i*ROWS) == $from) {
    // POKUD JESTE NEJSME NA KONCI
    if ((($i*ROWS)+ROWS) <= $total)  {
    echo '[ ' .$od .'-' .$do .' ] ';
    }
    // POKUD JSME NA KONCI
    else  {
    echo '[ ' .$od .'-' .$total .' ] ';
    }
  }
  // POKUD VYPOCITAVANA STRANA AKTIVNI NENI
  else  {
    // POKUD JESTE NEJSME NA KONCI
    if ((($i*ROWS)+ROWS) <= $total)  {
    echo '<a href="index.php?what_type=' .$what_type .'&amp;from=' .($i*ROWS) .'">' .'[ ' .$od .'-' .$do .' ]' .'</a> ';
    }
    else  {
    echo '<a href="index.php?what_type=' .$what_type .'&amp;from=' .($i*ROWS) .'">' .'[ ' .$od .'-' .$total .' ]' .'</a> ';
    }
  }
}


No ten kod asi moc prehledny neni, ale aspon neco. Ale je hodne zpusobu jak si to udelat... treba na linuxsoft.cz (myslim) nemaji stranky, ale jenom predchozi, dalsi, prvni, posledni. Ale to se mi moc nelibil.

Hlavne me vy skusenejsi v PHP nekamenujte :)... s PHP jsem zacinal. Jak jsme rikal, je to kod rok stary...
Before talking crap about someone, check the room... :)
SH*T HAPPENS! :)
neonn
Junior
Uživatelský avatar

Odeslat příspěvekod neonn 20. 11. 2005 14:15

MIHO:
Jo, nevim jak czbios, ale ja znam zapis if(): ... endif; a podobne z knizky od Koska. Jinak to na netu bude taky, ale nepidil jsem se po tom.

Ja jsem taky takhle zacinal. Zjistil jsem si zaklady, pak uz jenom vymyslet jak nejakou vec udelat (vzdycky jsem nejdrivv skusil trochu popremyslet, az pak hledat), vzit prehled fci a makat :) ...

Me se takhle delalo dobre (i kdyz to neni moc efektivni), ale mel jsem z toho lepsi pocit :)...
Before talking crap about someone, check the room... :)
SH*T HAPPENS! :)
neonn
Junior
Uživatelský avatar

Odeslat příspěvekod czbios 20. 11. 2005 14:47

miho píše:Nejdrive si prostuduj zaklady PHP a SQL. Z tveho popisu jsem pochopil, ze nevis jak predat parametr pres querystring a jak nasledne pouzit klauzuli LIMIT. Veci jako echo("$sekce"); vypadaji hrozive. To jsou ale naproste zaklady.

Pouzivas alternativni formu zapisu cyklu a podminek, kterou pouziva tak 1% programatoru v PHP. Odhadem 90% ji ani vubec nezna takze budou z tveho kodu na vetvi a ty zase z jejich. Kde jsi na to vubec prisel na ty endif, endfor atd :-)

Pak si prostuduj nejaky priklad. Ty ted totiz vynalezas znova kolo a navic na to jdes spatne :-( Napr. Pocet zaznamu ziskat takto:
select id from kniha order by id desc limit 1
je spatne protoze to prestane fungovat kdyz nejake zaznamy smazes. spravne reseni je pres
select count(*) from kniha


Zkratka jdi na to od zacatku a stavej na solidnich zakladech. Sam sebe jsi hodil do hluboke vody ale neprospiva ti to.


s tím co říkáš silně nesouhlasím... alternativní zápis je hojně používaný a je daleko přehlednější než složené závorky, neív majk ty ale já se vyzná v obou způsobech a když náhodou nemůžeš najít nějakou tu závorku tak jistě používáš něco jak otřeba pspad který ti je najde ;-) dále řešení podle count(*) ynám je to zatím pouze provizorní , scripty píšu tak že jsi udělám holou neopracovanou kostrua pak v nich hledám chyby a rozvíjím ;-) a pokud vím , nežádal jsem tě o hledání a filozofickou přednášku o tom kolik procent programátorů ppoužívá to a to.. to si můžu poprosit pan gogla a mám to taky . .ale ptal jsem an nějaké racionální řešení které by fungovalo v navogaci dělanou mým způsobem ;-) děkuji za konstruktivní příspěvek do tohoto topicu
czbios
Junior
Uživatelský avatar

Odeslat příspěvekod czbios 20. 11. 2005 14:51

neonn píše:MIHO:
Jo, nevim jak czbios, ale ja znam zapis if(): ... endif; a podobne z knizky od Koska. Jinak to na netu bude taky, ale nepidil jsem se po tom.

Ja jsem taky takhle zacinal. Zjistil jsem si zaklady, pak uz jenom vymyslet jak nejakou vec udelat (vzdycky jsem nejdrivv skusil trochu popremyslet, az pak hledat), vzit prehled fci a makat :) ...

Me se takhle delalo dobre (i kdyz to neni moc efektivni), ale mel jsem z toho lepsi pocit :)...

jj přesně tak já jsem to samý ;-)
czbios
Junior
Uživatelský avatar

Odeslat příspěvekod czbios 20. 11. 2005 14:55

neonn píše:Nevim jestli ti to nejak pomuze, ale ja jsem tohle resil tak pred rokem :) ...
Nejdriv jsem hledal na netu, jak to vyresit, nasel jsem "LIMIT" v SQL dotazu a ruzne hotove scripty (1. den).
Pak jsem zkousel napsat svuj/upravit ukazkovy kod k obrazu svemu. Nejak mi to neslo. Vypinal jsem PC a asi tak do 5 min mi bliklo v hlave jak to udat (2. den).
A 3. den jsem to udelal :)

Ale ted k tomu scriptu:

Ja jsem si nejdriv nadefinoval konstantu, kolik ma byt clanku na stranku:
Kód: Vybrat vše
define('ROWS', 10);


Pak jsem si zjistil, kolik je celkem clanku a stran (ale neni to moc dobre udelane):
Kód: Vybrat vše
// ZJISTENI POCTU CLANKU PRO PRACI SE STRANKOVANIM
if (empty($_GET['total']))  {
$MQ_total = mysql_query('SELECT count(*) AS pocet FROM ' .$what_type);
$MF_total = mysql_fetch_array($MQ_total);
$total = $MF_total['pocet'];
}
else  {
$total = $_GET['total'];
}
// POCET CLANKU ZJISTEN
$pages = ceil($total/ROWS); // ZJISTENI POCTU STRAN


Nacteni clanku na stranu podle mnozstvi:
Kód: Vybrat vše
$MQ_art = mysql_query('SELECT artID, nadpis, popis, autor, kat, date
FROM ' .$what_type .' ORDER BY date DESC LIMIT ' .$from .' , ' .ROWS);

// Zformatovani clanku do HTML
while(...) {
...
}


A na konec stranky hodim odkazy na dalsi strany:
Kód: Vybrat vše
// ZACINAM S VYPOCTEN STRANKOVANI
//ZACATEK SMYCKY
for ($i = 0; $i < $pages; $i++) {
$od = ($i*ROWS)+1;
$do = ($i*ROWS)+ROWS;
  // POKUD JE VYPOCITAVANA STRANA AKTUALNI
  if (($i*ROWS) == $from) {
    // POKUD JESTE NEJSME NA KONCI
    if ((($i*ROWS)+ROWS) <= $total)  {
    echo '[ ' .$od .'-' .$do .' ] ';
    }
    // POKUD JSME NA KONCI
    else  {
    echo '[ ' .$od .'-' .$total .' ] ';
    }
  }
  // POKUD VYPOCITAVANA STRANA AKTIVNI NENI
  else  {
    // POKUD JESTE NEJSME NA KONCI
    if ((($i*ROWS)+ROWS) <= $total)  {
    echo '<a href="index.php?what_type=' .$what_type .'&amp;from=' .($i*ROWS) .'">' .'[ ' .$od .'-' .$do .' ]' .'</a> ';
    }
    else  {
    echo '<a href="index.php?what_type=' .$what_type .'&amp;from=' .($i*ROWS) .'">' .'[ ' .$od .'-' .$total .' ]' .'</a> ';
    }
  }
}


No ten kod asi moc prehledny neni, ale aspon neco. Ale je hodne zpusobu jak si to udelat... treba na linuxsoft.cz (myslim) nemaji stranky, ale jenom predchozi, dalsi, prvni, posledni. Ale to se mi moc nelibil.

Hlavne me vy skusenejsi v PHP nekamenujte :)... s PHP jsem zacinal. Jak jsme rikal, je to kod rok stary...

to mi právě nepomůže tohle .. dole jak uvadíš část kodu
Kód: Vybrat vše
  echo '<a href="index.php?what_type=' .$what_type

tak já mám právě za idnex.php? -- anvigaci mám tam nějakou porměnou skeci podle který se rozlišuje co a jak semá vkládat .. a to je ten problém ... jinak jsem to prozatimně vyřešil tak že jsem nechávám posledních 600 příspěvků to zobrazí .. čili 60 záložek ... po 10 příspěvcích .. není to moc hezký řešení halvně ne na něco frekventovanějšího ..ale snad to bdue nějak stačit
czbios
Junior
Uživatelský avatar

Odeslat příspěvekod czbios 20. 11. 2005 14:56

miho píše:Nejdrive si prostuduj zaklady PHP a SQL. Z tveho popisu jsem pochopil, ze nevis jak predat parametr pres querystring a jak nasledne pouzit klauzuli LIMIT. Veci jako echo("$sekce"); vypadaji hrozive. To jsou ale naproste zaklady.

Pouzivas alternativni formu zapisu cyklu a podminek, kterou pouziva tak 1% programatoru v PHP. Odhadem 90% ji ani vubec nezna takze budou z tveho kodu na vetvi a ty zase z jejich. Kde jsi na to vubec prisel na ty endif, endfor atd :-)

Pak si prostuduj nejaky priklad. Ty ted totiz vynalezas znova kolo a navic na to jdes spatne :-( Napr. Pocet zaznamu ziskat takto:
select id from kniha order by id desc limit 1
je spatne protoze to prestane fungovat kdyz nejake zaznamy smazes. spravne reseni je pres
select count(*) from kniha

Zkratka jdi na to od zacatku a stavej na solidnich zakladech. Sam sebe jsi hodil do hluboke vody ale neprospiva ti to.

ji nak příkaldy sjem už studoval.. neměl j sstracha člověk se učí nejlíp když heldá něco co nikdy nedělal ;-) ne že jenom opisuje něčí práci tak jak to ty doporučuješ .. mě to všechno fachá akorát že mi tam překáží navigace .. :( tohle mmi pomoz vyřešit
czbios
Junior
Uživatelský avatar

Odeslat příspěvekod khihihi 20. 11. 2005 15:05

nepouzivajte for( ; ; )! je pomaly, ceknite si nejaky ten benchmark..
esteticky krajsie je nechat indexovu premennu doklusat k 0 a prirodzene tak ukoncit while()
Naposledy upravil khihihi dne 20. 11. 2005 15:05, celkově upraveno 1
Moderátor diskusného fóra Živě.cz ve výslužbě
khihihi
VIP uživatel
Uživatelský avatar

Odeslat příspěvekod neonn 20. 11. 2005 15:05

2czbios:
to nebylo myšleno jako hotova vec, ale jako inspirace :)

vzal jsem to proste tak jak to mam v scriptu... u me to slouzi jako strankovani CLANKU z databaze.
$what_type ... tabulka s clanky (napr HW, SW...)

Takze kdyz hodis pryc z adres $what_type a das si tam napevno do scriptu (SQL) nazev tabulky, tak uz to bude trochu bliz tomu co potrebujes.

Ale mozna lip vyjde kdyz si neco vymyslis sam (nebo pochopis to moje/jine z netu a prepises), nez jakykoliv navod strojove prepisovat (upravovat nazvy tabulek...)
Before talking crap about someone, check the room... :)
SH*T HAPPENS! :)
neonn
Junior
Uživatelský avatar

Odeslat příspěvekod cypisek 20. 11. 2005 15:22

Priznam se, ze jsem pred odpovedi necetl ty vsechy kody, ale strankovani bych udelal takto:

$kdezmeskoncili = addslashes($_GET['kdejsmeskoncili']);

SELECT * FROM tabulak LIMIT $kdezmeskoncili,10
.........
$kdezmeskoncili = $kdezmeskoncili+10;


Do toho selectu samozrejme nedat tu promenou primo.
cypisek
Kolemjdoucí

Odeslat příspěvekod BetWithLowe(smazano) 20. 11. 2005 15:59

tohle je věc, která je dávno vyřešená a objevuje se na každých stránkách. Jak řekl miho, nevymýšlejte kolo a najděte si to už hotové, plně funkční a optimalizované. A neberte to jako tak, že proč bych opisoval cizí kódy, udělám si to rači sám. Tohle se normálně děla i v profesionálních produktech, že se použije už něco vymyšlené, ale kvalitní...
BetWithLowe(smazano)
Junior

Odeslat příspěvekod czbios 20. 11. 2005 18:42

BetWithLowe píše:tohle je věc, která je dávno vyřešená a objevuje se na každých stránkách. Jak řekl miho, nevymýšlejte kolo a najděte si to už hotové, plně funkční a optimalizované. A neberte to jako tak, že proč bych opisoval cizí kódy, udělám si to rači sám. Tohle se normálně děla i v profesionálních produktech, že se použije už něco vymyšlené, ale kvalitní... /quote]
jé to hezký... taky to budu dělat ale teď se učím... a rptoože se učí mdůkladně tohle nejlepší způsob jak se naučit.. :-)
czbios
Junior
Uživatelský avatar

Odeslat příspěvekod czbios 20. 11. 2005 18:53

cypisek píše:Priznam se, ze jsem pred odpovedi necetl ty vsechy kody, ale strankovani bych udelal takto:

$kdezmeskoncili = addslashes($_GET['kdejsmeskoncili']);

SELECT * FROM tabulak LIMIT $kdezmeskoncili,10
.........
$kdezmeskoncili = $kdezmeskoncili+10;


Do toho selectu samozrejme nedat tu promenou primo.

jo máš pravdu ale celej můj problém je o interakci navigace tvořené index1.php?sekce=kniha a stránkováním ....

měl jsme to udělané a funkční .. když by scriptběžel ve vlastní okně ale pokud běží někde jinde to znamená script je pomocí include vložen do nějakého prvku div na stráncea tam se zobrazuje je to horší .. když totoiž stránkování vypíšu jako pouhý odkza kdeterý bude nějak takto :



Kód: Vybrat vše
<a href="index1.php?pocet=10">1</a>

Kód: Vybrat vše
<a href="index1.php?pocet=20">2</a>

Kód: Vybrat vše
<a href="index1.php?pocet=30">3</a>


tak při kliku na tento odkaz nakonec stránka zobrazí to co je přirazeno proměnné sekce za případu že je prázdná protože výsledná url nakonec vypadá takto :

Kód: Vybrat vše
http://kadantrida.wz.cz/index1.php?pocet=20


například což je sekce="" a pro tento stav je přiřazen právě nějaká jiná stránká, nějaká strána úvodní protože jestliže se proměnná sekce plní při každém kliku na nějaký odkaz na stránce , třeba navigace tak při prvních příchodu na stránku proměnná sekce je prázdná a je tedy potřeba zobrazit nějakou úvodní stránku .... .

Asi si teď začínám uvědomovat že sem dotza napsal asi špatně .. vlastně celý problém trčí v tom co jsem zde napsal
czbios
Junior
Uživatelský avatar

Odeslat příspěvekod loldaolda 20. 11. 2005 19:51

khihihi píše:nepouzivajte for( ; ; )! je pomaly, ceknite si nejaky ten benchmark..
esteticky krajsie je nechat indexovu premennu doklusat k 0 a prirodzene tak ukoncit while()

for( ;; ) ze je pomaly? To snad ne... Co teda pouzivat? While?

For je podle me nejelegantnejsi cyklus :-/
loldaolda
Junior
Uživatelský avatar

Další stránka

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků