14. februar 2007 - 15:01Der er
25 kommentarer og 1 løsning
Bladre system
I en debat kunne jeg godt tænke mig, at man kan bladre mellem alle de forskellige indlæg. Dvs hver side indeholder f.eks. 25 indlæg og nederst på siden er der noget a la: Side: « 1 2 3 »
Hvis man er på side 1, skal den ikke være et link og det skal « heller ikke, det skal de andre derimod være. Modsat står man på side 3, skal den ikke være et link og det skal » selvfølgelig heller ikke. Det giver næste sig selv, hvad der så skal ske, hvis man står på side 2 :)
Hvert indlæg har sit eget id, så hvis vi siger, der er 60 indlæg i alt, skal de først 25 vises på side 1, de næste 25 på side 2 og de sidste 10 på side 3.
Hvis det er mere simpelt at lave noget a la: 1 | 2 | 3 - altså uden pilene vil det også være ok med mig!
Hvad er det lige for nogle kode-stykker, jeg skal have gang i?
Min kode er meget, meget simpel, da det jo indtil nu er et kald:
$query = mysql_query("SELECT * FROM lovestories WHERE lovestory_id ='".$_GET['lovestory_id']."'"); $row = mysql_fetch_assoc($query);
echo "<h3>".$row['overskrift']."</h3>"; echo "Skrevet af ".$row['alias']." den ".$row['opretdato']."<br>"; echo "Historien er vist ".$row['counter']." gange.<br><br>"; echo nl2br($row['historie']);
Prøv det her, jeg har indsat kommentarer så du også kan læse lidt af det. Har dog ikke testet det.
$limit = 25; // antallet af overskrifter pr. side if (!isset($_GET['start'])) {$start = 0;} else {$start = $_GET['start'];} // hent hvilken overskrift vi skal starte ved
$query = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM lovestories WHERE lovestory_id ='".$_GET['lovestory_id']."' limit $start, $limit"); // SQL_CALC_FOUND_ROWS henter det total antal poster i tabellen, så vi ikke kun får det antal der er sat som $limit
$res_sidetal = mysql_query("select FOUND_ROWS()"); $num = mysql_fetch_row($res_sidetal); $num = $num[0]; // henter det totale antal poster i tabellen
if ($num > $limit) { // hvis der er flere end sat i $limit skal vi lave sidetal $sidetal = "";
if ($num > ($start+$limit)) { $sidetal .= "<a href='?start=".($start+$limit)."'>>></a>"; // indsætter >> hvis vi skal kunne gå frem }
$antal_sider = $num / $limit; // find antal sider $antal_sider = floor($antal_sider); // fjern evt. komma while ($antal_sider > 0) { $sidetal .= "<a href='?start=".($start+($limit*($antal_sider-1)))."'>".$antal_sider."</a>"; // indsætter numre på de sider vi skal bruge $antal_sider--; }
if ($start != 0) { $sidetal .= "<a href='?start=".($start-$limit)."'><<</a>"; // indsætter << hvis vi skal kunne gå tilbage }
}
print "$sidetal"; // indsætter sidetal while ($row = mysql_fetch_assoc($query)) { // lavet en while, da jeg går ud fra de skal listes under hinanden
echo "<h3>".$row['overskrift']."</h3>"; echo "Skrevet af ".$row['alias']." den ".$row['opretdato']."<br>"; echo "Historien er vist ".$row['counter']." gange.<br><br>"; echo nl2br($row['historie']);
Ændrer bare lige din kode, så det er sat ind. Jeg vi snakker ud fra det samme :)
$limit = 25; // antallet af overskrifter pr. side if (!isset($_GET['start'])) {$start = 0;} else {$start = $_GET['start'];} // hent hvilken overskrift vi skal starte ved
echo "<table width='100%' class='tabeltekst' border=0>"; $query = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM lovestories order by lovestory_id limit $start, $limit");
// SQL_CALC_FOUND_ROWS henter det total antal poster i tabellen, så vi ikke kun får det antal der er sat som $limit
$res_sidetal = mysql_query("select FOUND_ROWS()"); $num = mysql_fetch_row($res_sidetal); $num = $num[0]; // henter det totale antal poster i tabellen
if ($num > $limit) { // hvis der er flere end sat i $limit skal vi lave sidetal $sidetal = "";
if ($num > ($start+$limit)) { $sidetal .= "<a href='?start=".($start+$limit)."'>>></a>"; // indsætter >> hvis vi skal kunne gå frem }
$antal_sider = $num / $limit; // find antal sider $antal_sider = floor($antal_sider); // fjern evt. komma while ($antal_sider > 0) { $sidetal .= "<a href='?start=".($start+($limit*($antal_sider-1)))."'>".$antal_sider."</a>"; // indsætter numre på de sider vi skal bruge $antal_sider--; }
if ($start != 0) { $sidetal .= "<a href='?start=".($start-$limit)."'><<</a>"; // indsætter << hvis vi skal kunne gå tilbage }
Her kommer så nogle spørgsmål til dig. 1) Der kommer ingen fejl?
2) Du er sikker på du har over 25 poster i databasen den har hentet ud? Ellers bliver sidetal ikke vist, ellers kan du ændre det til en mindre tal øverst hvor der står: $limit = 25;
3) Du kan se midt i koden står: $sidetal = ""; Prøv at ændre det til: $sidetal = "test";
Så kan du se om den skriver test over dine overskrifter, så ved vi den i hvert fald er kommet ind og har prøvet at lave sidetal. Hvis den ikke skriver noget, ja så er der noget galt. (eller du har mindre end 25 ting i databasen)
Jeg havde næsten fået det til at virke, men der var stadig noget, der fucked op - det er nok rettet med den kode du har ændret :) - jeg tror, det var noget mellem min foresprøgsel og din $res_sidetal = mysql_query("select FOUND_ROWS()");
Jeg havde rettet tallet til 5 og jeg havde fået det til at blive vist, men når jeg bladrede rundt i det, fandt den sider, der slet ikke var der og dermed vist den selvfølgelig ikke noget.
Selvfølgelig er serveren nede lige nu, sådan er det jo altid, at det sker på de forkerte tidspunkter!
Jeg kan iøvrigt se, jeg har prøvet din version af: $query = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM lovestories order by lovestory_id limit $start, $limit");
Men det gør, at resten ikke bliver trukket ud fra databasen, alias og overskrift og den viser kun overskriften for siden som en linje... hvis du forstår hvad jeg mener, lyder det sikkert skørt - sådan synes jeg også, det var, men jeg fik ikke andet frem med det (medmindre jeg fik lavet en anden fejl :)
Nu har jeg prøvet det med din kode, men den driller stadig (dog har jeg sat en DESC på, så de nyeste ligger øverst)
Bladre jeg på pilene, virker det, men bruger jeg tallene, går det galt og så finder den nogle id'er, der ikke er lavet endnu - og dermed viser den selvfølgelig ikke noget.
Samtidig vender rundt på 3 2 1 som der jo burde være 1 2 3
Ahh, ja. Prøv at ændre: $antal_sider = $num / $limit; // find antal sider $antal_sider = floor($antal_sider); // fjern evt. komma while ($antal_sider > 0) { $sidetal .= "<a href='?start=".($start+($limit*($antal_sider-1)))."'>".$antal_sider."</a>"; // indsætter numre på de sider vi skal bruge $antal_sider--; }
til: $antal_sider = $num / $limit; // find antal sider $antal_sider = floor($antal_sider); // fjern evt. komma $start_ny = ($antal_sider-1)*$limit; while ($antal_sider > 0) {
$sidetal = "<a href='?start=".($start_ny+($limit*($antal_sider-1)))."'>".$antal_sider."</a>".$sidetal; // indsætter numre på de sider vi skal bruge $antal_sider--; $start_ny = $start_ny-$limit; }
Eller til denne her i stedet hvis du også vil have den skal være fed: $antal_sider = $num / $limit; // find antal sider $antal_sider = floor($antal_sider); // fjern evt. komma $start_ny = ($antal_sider-1)*$limit; while ($antal_sider > 0) {
$sidetal = "<a href='?start=".($start_ny+($limit*($antal_sider-1)))."'>".$bold_start.$antal_sider.$bold_slut."</a>".$sidetal; // indsætter numre på de sider vi skal bruge $antal_sider--; $start_ny = $start_ny-$limit; }
Og pilene :) Måske jeg bare skulle læse alle dine indlæg :D Byt rundt på de to koderstykker her: if ($num > ($start+$limit)) { $sidetal .= "<a href='?start=".($start+$limit)."'>>></a>"; // indsætter >> hvis vi skal kunne gå frem }
og: if ($start != 0) { $sidetal .= "<a href='?start=".($start-$limit)."'><<</a>"; // indsætter << hvis vi skal kunne gå tilbage }
Hov, jeg kan se der lidt dobbelt udregning. Hvis du lige ændrer: $sidetal = "<a href='?start=".($start_ny+($limit*($antal_sider-1)))."'>".$bold_start.$antal_sider.$bold_slut."</a>".$sidetal; // indsætter numre på de sider vi skal bruge
til: $sidetal = "<a href='?start=".$start_ny."'>".$bold_start.$antal_sider.$bold_slut."</a> ".$sidetal; // indsætter numre på de sider vi skal bruge
Der er kommet en masse str_replace på, men dem har du bare ikke set før :)
$limit = 5; // antallet af overskrifter pr. side if (!isset($_GET['start'])) {$start = 0;} else {$start = $_GET['start'];} // hent hvilken overskrift vi skal starte ved
echo "<table width='100%' class='tabeltekst' border=0>"; $query = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM lovestories order by lovestory_id DESC limit $start, $limit");
// SQL_CALC_FOUND_ROWS henter det total antal poster i tabellen, så vi ikke kun får det antal der er sat som $limit
$res_sidetal = mysql_query("select FOUND_ROWS()"); $num = mysql_fetch_row($res_sidetal); $num = $num[0]; // henter det totale antal poster i tabellen
if ($num > $limit) { // hvis der er flere end sat i $limit skal vi lave sidetal $sidetal = "";
if ($start != 0) { $sidetal .= "<a href='?cat_id=4&start=".($start-$limit)."'>«</a> "; // indsætter << hvis vi skal kunne gå tilbage }
$antal_sider = $num / $limit; // find antal sider $antal_sider = ceil($antal_sider); // fjern evt. komma $start_ny = ($antal_sider-1)*$limit; while ($antal_sider > 0) {
$sidetal = "<a href='?cat_id=4&start=".$start_ny."'>".$bold_start.$antal_sider.$bold_slut."</a> ".$sidetal; // indsætter numre på de sider vi skal bruge $antal_sider--; $start_ny = $start_ny-$limit; } if ($num > ($start+$limit)) { $sidetal .= "<a href='?cat_id=4&start=".($start+$limit)."'>»</a>"; // indsætter >> hvis vi skal kunne gå frem }
Ahh, ændre: if ($start != 0) { $sidetal .= "<a href='?cat_id=4&start=".($start-$limit)."'>«</a> "; // indsætter << hvis vi skal kunne gå tilbage }
til if ($start != 0) { $sidetal = "<a href='?cat_id=4&start=".($start-$limit)."'>«</a> ".$sidetal; // indsætter << hvis vi skal kunne gå tilbage }
Og flyt det ned lige over: if ($num > ($start+$limit)) { $sidetal .= "<a href='?cat_id=4&start=".($start+$limit)."'>»</a>"; // indsætter >> hvis vi skal kunne gå frem }
Helt i orden, du kan jo kigge lidt på kommentarerne hvis du har lyst, ellers kan du jo altid gemme dem til engang i fremtiden, så ser det nok mere simpelt ud :)
Lige et lille hint her på falderebet. Hvis du vil have at Side: kun skal stå der når der rent faktisk er nogle sider at blade på, kan du ændre: print "<tr><td>Side: $sidetal</td></tr>";
til: if ($sidetal != "") { print "<tr><td>Side: $sidetal</td></tr>"; }
Jojo, jeg har været ved at se på det og det er mere forståeligt end i starten, da det var helt sort snak :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.