Avatar billede alex15 Nybegynder
27. februar 2008 - 19:36 Der er 37 kommentarer og
1 løsning

Hvordan laver man sidetal via php til en forumsoversigt

Hej eksperter

Sådan nu er jeg komme så langt med min hjemmeside at jeg har fået opbygget og nyheds system, samt et forum. - Her under har jeg lavet en oversigt som viser de sidste oprettede tråde samt sidste oprettede nyheder. Og har sat den til at den skal være mig de sidste 20 nyheder (hvilket virker korrekt).

Men nu vil jeg gerne have gjort så man kan gå videre til sidde 2 f.eks. og eller se hvilken side man er på.

- Hvordan gør man det?

Målet var af min hjemmeside automatisk skulle kunne gøre følgende:

http://www.alexanderchristensen.dk/billeder/sidetal.jpg

på forhånd tak for hjælpen.
Avatar billede haren Nybegynder
27. februar 2008 - 23:04 #1
Det er godt nok tre år siden jeg sidst har kigget på en phpkode, men princippet er at du laver et sqludtræk med en count, dividerer med antallet af poster per side (her 20), og evt. bruger ceil() til at rund sidetallet op. Derefter laver du et SQl udtræk med LIMIT, og henter start og slut fra en GET variabel i adresselinjen. I bunden laver du en side vælger, der bruger samme info. Super smart. Du bruger LIMIT i dit mysql kald: (SELECT tråd FROM tabel WHERE id=id LIMIT 0,20) og derefter 20,40 :)

Spørg bare løs hvis der er mere. Kommer gerne med konkrete eksempler.
-- men udfra dette kan det gøres.
Avatar billede alex15 Nybegynder
28. februar 2008 - 19:28 #2
Ja okay. Så lige dit svar igår. Og så har jeg brugt dagen i dag på at tænke selve metoden igennem. Rent teoretisk. Og det virker som om det er måden man skal gøre det på. Men har stadigvæk problemer med at se hvordan man skal få ens side til selv at finde ud af om man er på side 1, 2 eller 5? - Samt hvordan kan den selv vide hvad den skal vise, hvis man f.eks er på side. 5? Der skulle den jo gerne vise følgende:

"sider: 3 4 [5] 6 7 ... 14" (- hvis der vel og mærket er 14 sider i alt)

Men kan godt se at selve hovedmetoden er den rigtig måde at gøre det på.
Avatar billede haren Nybegynder
28. februar 2008 - 20:18 #3
Finno :)
Det det kan gøres på mange måder, men den ene er at gøre følgende:

- Sidetal sættes som GET variabel

Bearbejdning:
$antal = 20;
$sidetal = $_GET[sidetal];
$start = ($sidetal-1)*$antal;
$slut = ($sidetal)*$antal;

mysql_query("SELECT indlæg FROM tabel WHERE id=id LIMIT $start,$slut");
Avatar billede haren Nybegynder
28. februar 2008 - 20:29 #4
$poster = mysql_query("count(finder totalt antal poster)");
$sideantal = ceil($poster/$antal); // Runder opad

$i = 1;

while($i => $sideantal) {

if($i = $sidetal) {
echo $sidetal;
} else {
echo "<a href=dinside.php?sidetal=$i>$i</a>";
}

$i++;

}


Er der fejl lidt småfejl i koden, så er det fordi, det somsagt er flere år siden jeg sidst har været igang.
-- men noget sidder da på rygraden.
Avatar billede haren Nybegynder
28. februar 2008 - 20:31 #5
if($i == $sidetal)

og

while($i >= $sideantal)

sorry
Avatar billede alex15 Nybegynder
29. februar 2008 - 00:13 #6
Arh. Har siddet og kigget en del på den her til aften. (Kan godt lide og kigge tingene lidt igennem før jeg melder tilbage.) Og tror faktisk at jeg forstår hvordan det virker. eller burde virke.

Men kigger det lige igennem i morgen engang. Før jeg melder ydeligere tilbage. Så er der nemlig større chance for at jeg selv forstår det. Samt en større chance for at jeg ikke behøver stille lige så mange dumme spørgsmål.
Avatar billede haren Nybegynder
29. februar 2008 - 10:36 #7
Det er bare helt i orden. Efterhånden har jeg jo skrevet en stor del af koden, så mon ikke det er rimelig nemt at stykke sammen?
Du spørger bare, hvis der er andet, så kan jeg genopfriske mine "skills" lidt.. :)
Avatar billede dkfire Nybegynder
29. februar 2008 - 11:33 #8
haren: Der er en lille fejl i din sql query:
mysql_query("SELECT indlæg FROM tabel WHERE id=id LIMIT $start,$antal");

LIMIT er som følgende: LIMIT startrække, antal eller LIMIT antal
Avatar billede haren Nybegynder
29. februar 2008 - 12:16 #9
$dkfire => Tak for det, men jeg forstår det faktisk ikke - er som sagt lidt ude af træning.

Fx på side 5:

Hvis vi skriver LIMIT $start,$antal istedet for LIMIT $start,$slut
Vil det på side fem resultere i; LIMIT 80,20 - hvilket vel er forkert?

Derfor vil jeg skrive; LIMIT 80,100 ?
Er jeg helt væk?
Avatar billede dkfire Nybegynder
29. februar 2008 - 18:40 #10
Ja desværre
Limit virker på den måde at du angiver hvilken række som mysql skal tage fra og hvor mange rækker den skal hive ud.
dvs LIMIT 80,20 starter med række 80 og giver dig 20 rækker ud, altså til og med række 99.

LIMIT 80,100 starter på række 80, men giver dig 100 rækker ud, dvs langt mere end ud vil vise på siden. Det kan selvfølgelig godt virke, men der er ingen ide i at hive de sidste 80 rækker ud af databasen når du ikke har brug for dem ;-)
Avatar billede alex15 Nybegynder
29. februar 2008 - 19:56 #11
Sidder lige og prøver mig lidt frem, ved at sætte lidt af koden ind i min egen kode. - Dette resulterer i at hvis der sker en fejl. så ved jeg hvor fejlen er.

Men ved virkelig ikke hvad der er galt her. Når jeg skriver følgende:

<?php

    $antal = 20;
    $sidetal = $_GET[sidetal];
    $start = ($sidetal-1)*$antal;
    $slut = ($sidetal)*$antal;

$query = mysql_query('SELECT `indlæg`, FROM `table` WHERE `xxx` = "'.$_SESSION["xxx"].'" ORDER BY `dato` DESC LIMIT 0, 20');

?>

Virker det perfekt. - Altså den går ind og henter de sidste 20 indlæg.

Men ændre jeg bare 20 om til $antal - viser den ikke noget? - hvordan kan det være:

$query = mysql_query('SELECT `indlæg`, FROM `table` WHERE `xxx` = "'.$_SESSION["xxx"].'" ORDER BY `dato` DESC LIMIT 0, $antal');

- Jeg gør da intet forkert? ps. har slettet en del i selve query for at den ikke skulle fylde for meget. Men som sagt så virker det korrekt hvis jeg direkte skriver 20, frem for $antal. - det burde da ikke betyde noget.
Avatar billede alex15 Nybegynder
29. februar 2008 - 20:00 #12
Det er som om at den ikke registerer værdien 20 inde i variablen.
Avatar billede dkfire Nybegynder
29. februar 2008 - 21:15 #13
Det er fordi du ikke har forstået forskellen på ' og "

Når du kaver en streng med ', som er det du går med din sql, så bliver variabler ikke fortolket af php, dvs:

$antal = 5
echo 'Antal: $antal';

vil kun udskrive 'Antal: $antal' og ikke selv værdien af $antal.

Hvis du derimod bruger " til en streng, vil php fortolke variablen og bruge dens værdi i strengen. Dvs:

$antal = 5
echo "Antal: $antal";

vil give 'Antal: 5'

Du skal derfor sikre dig at du bruger " når du vil have værdien af en variabel med i en streng. I dit tilfælde:
$query = mysql_query("SELECT `indlæg`, FROM `table` WHERE `xxx` = '".$_SESSION['xxx']."' ORDER BY `dato` DESC LIMIT 0, $antal");
Du kan også vælge at gå uden om variablen og bare lægge den til strengen:
$query = mysql_query("SELECT `indlæg`, FROM `table` WHERE `xxx` = '".$_SESSION["xxx"]."' ORDER BY `dato` DESC LIMIT 0, ".$antal);
Avatar billede haren Nybegynder
01. marts 2008 - 02:14 #14
dkfire => Nu er jeg med, det kan jeg godt huske. Takker for opfriskningen.
Avatar billede haren Nybegynder
01. marts 2008 - 02:15 #15
Synes også der var et eller andet galt i første omgang.
Avatar billede alex15 Nybegynder
01. marts 2008 - 08:28 #16
Øv. Nu troede jeg endelig lige at jeg havde forstået forskellen på ' og ". Men ja. Der kan man bare se. Men okay, man lærer jo lidt hver dag. Synes ellers at jeg er blevet ret god til at bruge det. Men hvordan kan det være at det virkede med $_SESSION['xxx'] - Når det ikke virkede med $xxx.?

Kigger lige videre på selve koden her senere i aften, eller i morgen når der er lidt mere fritid. Skal lige et smut på arbejde.
Avatar billede dkfire Nybegynder
01. marts 2008 - 10:27 #17
Fordi $_SESSION['xxx'] har du lagt til strengen og ikke i selv strengen.
Altså man lægger en variabel til en streng:

'Se en variabel er lagt til ' . $variabel . ' og efter variablen er der endnu en streng lagt til'

Og en variabel i selve strengen:
"Se nu ligger variablens værdi $variabel i strengen"

Håber det giver bare lidt mening :-)
Avatar billede alex15 Nybegynder
01. marts 2008 - 17:42 #18
Ja, det begynder at hænge lidt mere sammen. Men stadigvæk ikke helt. Men synes det er tæt på. Forstår i hvert fald så meget af det at hele min side virker. ;) Selv om jeg lige havde misforstået det sidste der. hehe.

Men begynder lige og kigge på resten af koden. Så melder jeg tilbage om hvilke fejl er støder på undervejs :)
Avatar billede haren Nybegynder
02. marts 2008 - 02:05 #19
Det gør du bare.
Avatar billede alex15 Nybegynder
03. marts 2008 - 11:02 #20
Sådan. Så har jeg fået følgende til at virke korrekt:

$poster = mysql_query("count(finder totalt antal poster)");
$sideantal = ceil($poster/$antal); // Runder opad

Måtte dog lige tilpasse poster, så den passede til min side. Og ikke bare talte alle de forumtråde som var ialt.

Nu er mit spørgsmål / problem følgende:

Jeg forstår ikke denne her while(). - Mener at du siger while($i >= $sideantal){..};

Hvilket som jeg har forstået betyder. Mens/while 1 er større eller ligmed 2 (i mit tilfælde da jeg i alt lige nu har 23 forumtråde). skal den gøre følgende {...}.

Men eftersom at 2 hverken er mindre eller ligmed 1. Så kommer den jo ikke til at udfører denne handling {...}; eller er det bare mig som har misforstået det?
Avatar billede haren Nybegynder
03. marts 2008 - 13:36 #21
Du skal bare ændre > til <, for det er jo klart, at det er omvendt.
Min fejl.
Avatar billede alex15 Nybegynder
03. marts 2008 - 17:27 #22
Sådan. Så har jeg fået næste del til at virke korrekt.

Skal lige siges at jeg synes det er inponerende at du kan huske hvordan man laver sådan en kode efter en par år uden php ;)

Men med hensyn til $start = ($sidetal-1)*$antal; - så må der da været noget forkert?

- For det første så bruger jeg ikke $start noget steder i koden? Og hvis jeg skulle bruge den. skulle det så ikke være nede i:

dinside.php?sidetal=$start - eller hvad? For som det ser ud lige nu, så bliver sidetal=1 når man trykker på "side. 1) og så viser der fra tråd 2-20 og ikke fra 1-20.
Avatar billede haren Nybegynder
03. marts 2008 - 17:55 #23
Har ikke meget tid nu, fik bare lige en mail;

Her bruger du variablen start:
mysql_query("SELECT indlæg-whatever FROM tabel WHERE id=id LIMIT $start,$antal");

Jeg skal nok svare mere udførligt senere i aften.

ps, tak! :)
Avatar billede alex15 Nybegynder
03. marts 2008 - 21:44 #24
Sådan. Så fik jeg det sku til at virke. Troede ellers lige at jeg havde fundet en anden løsning. Men det udgjorde i flere og flere under regnestykker til at få det hele til at gå op. :D så var din løsning sku bedre. Ved ikke hvorfor jeg ikke kunne få den til at virke første gang??

Nårh. Men nu kan min hjemmeside automatisk vise hvor mange sider der er. linke til de forskellige sider, samt vise hvilken side man er på.

- Så mangler der kun ÉN ting til. Nemlig det der 3... 8 9 [10] 11 12 ... 50

Hvordan løser jeg det problem? Kan jeg sinpelhen ikke finde ud af hvordan man skal kunne løse?
Avatar billede haren Nybegynder
03. marts 2008 - 21:57 #25
Har jeg ikke forklaret det? Jeg gør det gerne igen! :)
Du bruger bare en if-sætning inde i while-sætningen:

$i = 1;

while($i =< $sideantal) {

if($i == $sidetal) {
echo "[$sidetal]";
} else {
echo "<a href=dinside.php?sidetal=$i>$i</a>";
}

$i++;

}
Avatar billede haren Nybegynder
03. marts 2008 - 21:59 #26
Jeg mener også min form for udregning er den mest simple, der kan forekomme til dette ^^
-- nogle gange kan det jo drille, og en lille bitte fejl kan få det hele til at se umuligt ud.
Avatar billede alex15 Nybegynder
03. marts 2008 - 22:05 #27
ja. Det må du nok sige. Men eftersom jeg ikke fik din kode til at virke første gang, begyndte jeg selv og lave om på den. Og for at løse det ene problem, opstod der sammen med løsningen et nyt problem. osv. Så efterhånden blev koden ret lang ;) Men så var det jo dejligt at du lige fik mig på sporet igen.

Nogen ide til hvordan man løser det der med ...?
Avatar billede alex15 Nybegynder
03. marts 2008 - 22:08 #28
Jojo, har fået det med at den laver [X] uden om den side man er på til at virke.

Problemet er bare at hvis der f.eks. bliver i alt 100 sider. Så er det ikke fedt at der står:

side: 1 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21 22 23 24

Det kunne her være fedt hvis den gjorde følgende i stedet:

side: 1 ... 11 [12] 13 ... 24

Kan du se hvad jeg mener?
Avatar billede haren Nybegynder
03. marts 2008 - 22:28 #29
Arhh.. tænker lige et øjeblik.
Det er straks lidt mere indviklet. Du får ikke koden lige nu, den kan du få i morgen, hvis ikke selv du kan strikke den sammen.

Dette kræver umiddelbart flere if sætninger:
-- det kan være jeg finder på noget bedre i morgen..

if($sideantal =< 5) {
  if($i == $sidetal) {
  echo "[$sidetal]";
  } else {
  echo "<a href=dinside.php?sidetal=$i>$i</a>";
  }
} else {
  if($i == $sidetal) {
  echo "[$sidetal]";
  } elseif ($i == 1 OR $i == $sideantal) {
  echo "<a href=dinside.php?sidetal=$i>$i</a>";
  } else {
    if($g != 1) {
    echo "...";
    $g = 1;
    }
  }
}

-- også endte jeg alligevel med at kode noget for dig, men er træt, så bær over med resultatet.
Avatar billede haren Nybegynder
03. marts 2008 - 22:41 #30
Ovenstående sættes inde i while-sætningen. Dog kan det måske gøres smartere.
Avatar billede alex15 Nybegynder
03. marts 2008 - 22:56 #31
Arh okay. Kigger det lige igennem her før jeg går i seng. Samt i morgen. Så kan jeg lige se om jeg kan finde ud af hvad det gør. Samt finde ud af om jeg kan få det til at virke :) Så melder lige tilbage, som altid ;) men sov godt :)
Avatar billede haren Nybegynder
03. marts 2008 - 23:23 #32
Du er velkommen.
Avatar billede alex15 Nybegynder
04. marts 2008 - 11:30 #33
Okay, der kom vi lidt længere. Men stadigvæk ikke helt rigtig.

Problemet er nu at den laver ... allerede ved side 2-8 (har 9 sider i alt). Så hvis man er på side:

side1:
Side: [1]...9 //Her burde der stå "side: [1] 2 3 ... 9"

side4:
side: 1...[4]9 //Her burde der stå "side: 1 2 3 [4] 5 6 ... 9

side5:
side: 1...[5]9 //Her burde der stå "side: 1 ... 3 4 [5] 6 7 ... 9

osv.

Forstår du hvor jeg vil hen?

Har selv sidder og kigger / tænkt over hvordan man kunne gøre det. Så melder lige tilbage hvis jeg får nogle gode ideer osv.
Avatar billede alex15 Nybegynder
04. marts 2008 - 12:56 #34
Vent lige med at bruge tid på en evt. løsning. tror måske at jeg er ved at have den :) - men melder self lige tilbage.
Avatar billede haren Nybegynder
04. marts 2008 - 13:42 #35
Kan sagtens se det og det er ret nemt at rette.. det kræver bare et par regnestykker, som jeg ikke kunne overskue i går aftes.
Du siger lige til..
Avatar billede alex15 Nybegynder
04. marts 2008 - 13:56 #36
:D Sådan. Så kom løsningen lige pludselig til mig, efter mange timers tænken ;)

Her er resultatet:

---

while($i <= $sideantal){

    if($i == 1 || $i >= $minusto && $i <= $plusto || $i == $sideantal){
           
    if($i == $sidetal) {
                   
        echo " [<b>$sidetal</b>] ";
        } else {
        echo " <a href=forum.php?sidetal=$i class='forum-sidetal'>$i</a> ";
        }
           
      } else {
           
      if($i < $sidetal && $g != 1){echo "... "; $g = 1;}
      elseif($i > $sidetal && $h != 1){echo "... "; $h = 1;}
           
    }
  $i++;
}

----

Ej det var dejligt. Den løsning var jeg aldrig kommet frem til hvis det ikke var for fine meget fine eksempler. Det eneste jeg manglede, var bare lige og rette lidt til i dine eksempler. Så fungere det hele perfekt. Der ud over oprettede jeg også to ekstra ting:

$minusto = $sidetal - 2;
$plusto = $sidetal + 2;

som du nok kan se.

Men du skal have mange tak for den store hjælp / indsats du har ydet til mit spørgsmål/problem.

Husk også lige og lave et svar, så du kan få dine point.

og endnu engang tak :)
Avatar billede haren Nybegynder
04. marts 2008 - 14:04 #37
Det var nemlig de regnestykker jeg tænkte på :) -- jeg kigger lige lidt på din kode, og det var en løsning i samme stil jeg havde i tankerne i går, kunne bare ikke overskue at lave den.
God fornøjelse med det! :)
Avatar billede alex15 Nybegynder
04. marts 2008 - 16:55 #38
Kan jeg godt forstå. Men fedt at du lige "strikkede" noget sammen til mig alligevel. Gjorde jo at jeg selv kunne ordne det allersidste. så det bliver jo ikke bedre.

Men forstår godt at du ikke orkede det, jeg brugte 3-4 timer på at komme frem til den løsning.

Men jo tak. og endnu engang, tak for hjælpen!
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester