Onko kellään antaa ratkaisua seuraavanlaiseen ongelmaan: Sivutus toimii muuten hyvin, mutta sivujen tulostusjärjestys on pielessä, eli uusin lisäys menee aina viimeiselle sivulle ensimmäiseksi, kun sen pitäisi mennä 1. sivulle ensimmäiseksi. Olen kokeillut Id DESC -komentoa, mutta tässä tapauksessa uudet lisäykset tulostuvat 1. sivun alimmaiseksi? Missä vika?!
Koodi:
<?php include("MySQL.php"); mysql_connect($mysql_server,$mysql_user,$mysql_pass); mysql_selectdb($mysql_db); class Pager { function getPagerData($numHits, $limit, $page) { $numHits = (int) $numHits; $limit = max((int) $limit, 1); $page = (int) $page; $numPages = ceil($numHits / $limit); $page = max($page, 1); $page = min($page, $numPages); $offset = ($page - 1) * $limit; $ret = new stdClass; $ret->offset = $offset; $ret->limit = $limit; $ret->numPages = $numPages; $ret->page = $page; return $ret; } } // get the pager input values $page = $_GET['page']; $limit = 20; $result = mysql_query("select count(*) from Table"); $total = mysql_result($result, 0, 0); // work out the pager values $pager = Pager::getPagerData($total, $limit, $page); $offset = $pager->offset; $limit = $pager->limit; $page = $pager->page; // use pager values to fetch data $query = "select * from Table order by Id limit $offset, $limit"; $result = mysql_query($query); // use $result here to output page content // output paging system (could also do it before we output the page content) if ($page == 1) // this is the first page - there is no previous page echo "Previous"; else // not the first page, link to the previous page echo "<a href=\"thepage.php?page=" . ($page - 1) . "\">Previous</a>"; for ($i = 1; $i <= $pager->numPages; $i++) { echo " | "; if ($i == $pager->page) echo "Page $i"; else echo "<a href=\"thepage.php?page=$i\">Page $i</a>"; } if ($page == $pager->numPages) // this is the last page - there is no next page echo "Next"; else // not the last page, link to the next page echo "<a href=\"thepage.php?page=" . ($page + 1) . "\">Next</a>"; for($i = mysql_numrows($result); $i > 0; $i--) { $ii = $i; $ii--; echo "<h1>"; echo mysql_result($result,$ii,"Topic"); echo "</h1>"; echo "<p>"; echo mysql_result($result,$ii,"Txt"); echo "</p>"; echo "<p>"; echo mysql_result($result,$ii,"Sender"); echo " - "; echo mysql_result($result,$ii,"Time"); echo "</p>"; } mysql_close(); ?>
Kokeile laittaa tuon viimeisen for-silmukan ehdoksi suurempi- tai yhtäsuurikuin.
En kyllä pysty ymmärtämään miten olet onnistunut toteuttamaan niinkin yksinkertaisen asian kuin sivutuksen noin uskomattoman monimutkaisella tavalla.
Ei taida tieto-taito yltää ihan riittävän korkealle tasolle. Onko parempia sovelluksia mielessä, niitä oon nimittäin tässä metsästänyt jos jonkin aikaa? Ja miten se ehto toteutetaan?
Ehto ei vaadi muuta kuin yhden yhtäsuuruusmerkin lisäämisen, ts:
for($i = mysql_numrows($result); $i >= 0; $i--) {
Antaa virheen:
Warning: mysql_result() [function.mysql-result]: Unable to jump to row -1 on MySQL result index 6
No entäs jos otat pois kohdan $ii--;
Jotenkin tuntuu järjettömältä tuo for-silmukka, varsinkin kun "ylimääräiset" rivit on jätetty pois jo tietokantahaun yhteydessä. Itse tekisin tuon tulostuskohdan jokseenkin tähän tyylin (vaatii sen DESC-määritteen tuonne tietokantakyselyyn)
while( $r = mysql_fetch_assoc($result) ) { printf("<h1>%s</h1>", $r['Topic']); printf("<p>%s</p>", $r['Txt']); jne... }
Aihe on jo aika vanha, joten et voi enää vastata siihen.