Autor Zpráva
Trickle
Profil
Ahoj
Prosil bych o rady. Pro někoho to bude asi prkotina. Mám kód pro výpis novinek a následně i stránkování. První problém je když mám v DB méně novinek než co udám v rows (třeba rows"10" ale novinek mám v DB jen 5) tak se skript zblázní a nic nevykonává.Prosím jak to lze ošetřit? A druhá věc je když se tvoří poslední odkaz Konec. Mám v DB třeba 6 novinek tak jak lze vyčíst z kódu zobrazuje se prázdná stránka s pořadovým číslem 7.
Za případné rady Děkuji a přidávám i kód:
<?php

  define ("ROWS",2 );    
  if (!isset($_GET["celkem"]))
  
  {
    $vysledek=mysql_query("select count(*) as pocet from clanky");
    $zaznam=mysql_fetch_array($vysledek); 
    $celkem=$zaznam["pocet"];
  }  
  else
  {
      $celkem=$_GET["celkem"];
  }
  if ($celkem>ROWS)
  {
    if (!isset($_GET["od"])) $od=1; else $od=$_GET["od"]; 
    $vysledek=mysql_query("select * from clanky order by id desc"." limit ".($od-1).", ".ROWS);
    while ($zaznam=@MySQL_Fetch_Array($vysledek)){
    
    echo "<table>";
    echo "<tr><b>".$zaznam["titulek"]."</b></tr>";
    echo "<td>".$zaznam["text"]."</td>";
    echo "</table>";
    
    
  }
   
       if ($od==1) echo ""; 
      else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=1\">Začátek</a>&nbsp;|&nbsp;";
      
       if ($od<ROWS) echo ""; 
      else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=".($od-ROWS)."\">Předchozí</a>&nbsp;|&nbsp;";
    
       if ($od+ROWS>$celkem) echo ""; 
      else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=".($od+ROWS)."\">Následující</a>&nbsp;|&nbsp;";
    
       if ($od>$celkem-ROWS) echo "<BR>"; 
      else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=".($celkem-$celkem%ROWS+1)."\">Konec</a><BR>";
  }
?>

Zkoušel jsem něco v tom smyslu že :
       if ($od>$celkem-ROWS) echo "<BR>"; 
      else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$konecnylimit=$celkem%ROWS==0?$celkem-ROWS+1:$celkem-$celkem%ROWS+1 \">Konec</a><BR>";
  }
ale nic.
tiso
Profil
Tento skript zo stránky PHP (39) - Zobrazujeme a stránkujeme data obsahuje chyby, riešenie nájdeš v diskusii pod ním.
Alphard
Profil
// Tohle je trochu duplicita, ale navrhuji myslím lepší řešení, tak už to pošlu.

Poznávám kód ze seriálu o PHP na linuxsoftu, tento konkrétní díl se zvlášť nepovedl :-)
U té podmínky na 15. řádku chybí else větev, která vypíše výsledky, pokud jich je méně než limit (v komentářích u daného dílu je to napsané od roku 2006).

Já bych doporučoval ten script aspoň trochu přeorganizovat:
$query = "select * from clanky order by id desc";
if ($celkem>ROWS) {
  if (!isset($_GET["od"])) $od=1; else $od=$_GET["od"]; 
  $query .= " limit ".($od-1).", ".ROWS;
}

$vysledek=mysql_query($query);
while ($zaznam=MySQL_Fetch_Array($vysledek)) {
  echo "<table>";
  echo "<tr><b>".$zaznam["titulek"]."</b></tr>";
  echo "<td>".$zaznam["text"]."</td>";
  echo "</table>";
}

Důležité je, že takhle se nebude duplikovat celý select dotaz a výpis výsledků.
Trickle
Profil
Alphard:
Děkuji ale pořád mám černou obrazovku:-D. Komentáře jsem samo sebou četl zkoušel jsem tam to else dopsat ale píše mi to chybu syntax error neočekávané else.
Alphard
Profil
Vzhledem k tomu, že váš kód nevidíme, je to, jako byste [#4] vůbec nenapsal...
Trickle
Profil
Alphard:
<?php
  $query="";  
 $celkem="";
 $od="";   
   
  define ("ROWS",10 );    
  if (!isset($_GET["celkem"]))  
  
  {
    $vysledek=mysql_query("select count(*) as pocet from clanky");
    $zaznam=mysql_fetch_array($vysledek); 
    $celkem=$zaznam["pocet"];
  }  
  else
  {
  $query = "select * from clanky order by id desc";
if ($celkem>ROWS)
  else
  {    
  if(mysql_num_rows($vysledek) > 0) { 
   $vysledek = mysql_fetch_object($vysledek);  
   $rows = $vysledek->rows;                                 
}
}
   

  if (!isset($_GET["od"])) $od=1; else $od=$_GET["od"]; 
  $query .= " limit ".($od-1).", ".ROWS;

 
$vysledek=mysql_query($query);
while ($zaznam=MySQL_Fetch_Array($vysledek)) {
    
    echo "<table>";
    echo "<tr><b>".$zaznam["titulek"]."</b></tr>\n";
    echo "<td>".$zaznam["text"]."</td>";
    echo "</table>";
    
    
  }

       if ($od==1) echo ""; 
      else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=1\">Začátek</a>&nbsp;|&nbsp;";

       if ($od<ROWS) echo ""; 
      else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=".($od-ROWS)."\">Předchozí</a>&nbsp;|&nbsp;";
    
       if ($od+ROWS>$celkem) echo ""; 
      else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=".($od+ROWS)."\">Následující</a>&nbsp;|&nbsp;";
    
       if ($od>$celkem-ROWS) echo "<BR>"; 
      else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=".($celkem-$celkem%ROWS+1)."\">Konec</a><BR>";
  }
?>



Byl to boj ale dotáhl jsem to do zdárného konce.
Trickle
Profil
Mám ještě jeden dotaz ohledně kodu define ("ROWS" 10);. Chci ovládat počet článků přes administraci. Jak zakomponovat proměnou do define takto? define ("ROWS",$zaznam["pocet_clanku"]);
děkuji za odpovědi.
Fisir
Profil
Reaguji na Trickle:
Brání ti něco v tom, abys to vyzkoušel?
Dan Charousek
Profil
Trickle:
define ("ROWS" 10); vytváří konstantu ROWS s hodnotou 10. Už podle toho jména (konstanta) je jasné, že by její hodnota měla být neměnná, tudíž do ní nemůžeš uložit proměnný obsah z proměnné. Místo konstanty použij klasickou proměnnou:

$pocetRadku = $zaznam["pocet_clanku"];
Místo ROWS na řádcích 17, 28, 45, 48, 51 dej $pocetRadku
Trickle
Profil
Fisir:
Zkoušel jsem to ale nereaguje. Díky za postřeh.


Dan Charousek:
Super díky.
Alphard
Profil
Dan Charousek:
define ("ROWS" 10); vytváří konstantu ROWS (...) tudíž do ní nemůžeš uložit proměnný obsah z proměnné
Technicky může, není to vůbec žádný problém*. Zápis
define("ROWS", $zaznam["pocet_clanku"]);
by měl fungovat.
*Možná si to pleteš s „třídními“ konstantami const. Ty jsou vyhodnocované během parsování a lze do nich vyhodnotit pouze konstantní výrazy. define se vykonává v run-time fázi a proměnné tedy nejsou problém. Konstantní jsou až po svém vytvoření (i když ani to není úplně pravda).

Trickle:
Rozhodně souhlasím s tím, že řešení [#9] Dan Charousek je 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: