Avatar billede dklap3 Nybegynder
25. maj 2009 - 00:02 Der er 23 kommentarer og
1 løsning

Paging - Kan ikke få noget til at virke

Hej Eksperter,

På mit website har jeg en nyhedsside der trækker nyhederne ud af min MySQL database.

Siden kan ses her: http://www.herningshuse.dk/nyheder.php?nid=47

Som man kan se er der ved at være lige lovlig mange nyheder (49 pt), og siden er efterhånden ved at være ret lang. Jeg er derfor kommet til den konklusion at det er på tide at få lavet en paging (eller inddeling i sider).

Selve udtrækket af alle nyhederne i venstre side er ret simpelt:

<?
$hent = mysql_query("select * from herning_nyheder ORDER BY nid DESC");
while ($row1 = mysql_fetch_array($hent)) {
echo "<font color='#999999' size='1'>". $row1['ndato'] .":<br></font><a href='nyheder.php?nid=" . ($row1["nid"]) ."'>" . $row1['noverskrift'] . "</a><p>";
}
?>

Jeg kunne nu godt tænke mig at få dem opdelt i 10 stk på hver "side", men er i tvivl om det vil gøre noget ved den resterende del af siden, altså der hvor hver enkelt nyhed bliver vist. Jeg vil stadig helst beholde hele nyhedsdelen på samme side, men eftersom der er flere elementer på siden er jeg meget i tvivl om hvordan søren jeg gør.

Det skulle gerne ende med at ligne noget i denne stil: http://www.herningshuse.dk/download/nyhederpaging.jpg

Har forsøgt mig med en række forskellige muligheder (fra div google søgninger), men ingenting virker. Jeg er nu heller ikke den helt store php haj.

Nogle gode idéer?
Avatar billede ebusiness Nybegynder
25. maj 2009 - 01:34 #1
Som jeg ser det er den mest oplagte løsning at bruge Javascript til at skjule de nyheder som ikke skal vises. Del menuen op i div elementer med 10 nyheder i hver og sæt divernes .style.display egenskab til enten "" eller "none" alt efter om de skal vises eller ej.

Hvis du får rigtigt mange nyheder bør du skifte til et system som først henter menuerne når der er brug for dem, men der er vist et stykke tid til endnu.
Avatar billede repox Seniormester
25. maj 2009 - 13:30 #2
Jeg er ikke sikker på hvordan den 'oplagte løsning' kan være javascript... men fred være med det...

Et løsningforslag (utestet) som nok skal rettes lidt til for at passe til dit behov følger slutteligt i mit indlæg.

Vær opmærksom på at koden ikke nødvendigvis giver dig det du ønsker, men kan give dig en idé om hvad det er du skal have lavet for at opnå det resultat du efterlyser.

<?
    /* Lidt generelt*/
    $sql = "SELECT COUNT(nid) AS no FROM herning_nyheder");
    $res = mysql_query($sql);
   
    $no = mysql_result($res, 0, "no");
    $newsPrPage = 10;
    $pages = ceil($no/$newsPrPage);
    $currentPage = (isset($_GET["page"])? $_GET["page"] : 0;
    $start = $currentPage * $newsPrPage;
           
    $hent = mysql_query("select * from herning_nyheder ORDER BY nid DESC LIMIT ".$start.", ".$newsPrPage);
    while ($row1 = mysql_fetch_array($hent))
    {
        echo "<font color='#999999' size='1'>". $row1['ndato'] .":<br></font><a href='nyheder.php?nid=" . ($row1["nid"]) ."'>" . $row1['noverskrift'] . "</a><p>";
    }
   
    /* Forrige link */
    if($currentPage > 0)
    {
        $prevPage = $currentPage - 1;
        echo "<a href=\"".$_SERVER["PHP_SELF"]."\?page=".$i."\" title=\"Forrige\">Forrrige</a>";
    }
   
    /* Siderne */
    for($i = 1; $i <= $pages; $i++)
    {
        if($i == $currentPage)
            $class = "pageActive";
        else
            $class = "page";
           
        echo "<a href=\"".$_SERVER["PHP_SELF"]."\?page=".$i."\" title=\"Side ".$i."\">".$i."</a>";
    }
   
    /* Næste link */
    if($currentPage < $pages)
    {
        $nextPage = $currentPage + 1;
        echo "<a href=\"".$_SERVER["PHP_SELF"]."\?page=".$i."\" title=\"Næste\">Næste</a>";
    }
   
   
?>
Avatar billede ebusiness Nybegynder
25. maj 2009 - 14:30 #3
@repox hvad der føles oplagt kommer typisk an på hvad man er vant til. Med en javascript løsning kan brugeren skifte mellem menuerne uden at der hentes en ny side ind hver gang, derfor er en Javascript løsning mere oplagt da det gør navigationen hurtigere.
Avatar billede repox Seniormester
25. maj 2009 - 14:57 #4
@ebusiness:
Okay. Good luck whith that.
Avatar billede dklap3 Nybegynder
25. maj 2009 - 15:15 #5
Først tak for jeres kommentarer. :-)

Jeg skal også indrømme at det nok nærmere var noget i stil med repox forslag jeg havde regnet med var løsningen, men hvad ved jeg.

Er på arbejde nu, men vil forsøge at lege med det når jeg kommer hjem. Kan jeg slet ikke få noget til at virke i php kan det være jeg kaster mig over Javascript forslaget, der er jeg dog om muligt endnu mere blank end i php.
Avatar billede ebusiness Nybegynder
25. maj 2009 - 16:38 #6
Okay, for nu ikke at gøre det mere kompliceret end det er, det kan klares med en ganske lille stump Javascript, her er et eksempel. Det skal selvfølgelig sættes sammen med PHP på serveren som deler linksne ind i div elementer, laver de tilhørende javascript links, og sætter numnews til det korrekte antal for at kunne bruges i praksis:

<div id="menudiv1">link 24 til 15</div>
<div id="menudiv2">link 14 til 5</div>
<div id="menudiv3">link 4 til 1</div>
<a href="java script:setmenudiv(currentmenudiv-1)">&lt;</a>
<a href="java script:setmenudiv(1)">1</a>
<a href="java script:setmenudiv(2)">2</a>
<a href="java script:setmenudiv(3)">3</a>
<a href="java script:setmenudiv(currentmenudiv+1)">&gt;</a>
<script type="text/javascript">
function setmenudiv(index){
    index=Math.min(Math.max(index,1),menudivs)
    for(var a=1;a<=menudivs;a++){
        document.getElementById("menudiv"+a).style.display=(index==a?"":"none")
    }
    currentmenudiv=index
}
numnews=24
menudivs=Math.ceil(numnews/10)
currentmenudiv=1
if((sposition=("&"+window.location.search.substring(1)).indexOf("&nid=")+5)>4){
    currentmenudiv=Math.ceil((1+numnews-window.location.search.substring(sposition).split("&")[0])/10)
}
setmenudiv(currentmenudiv)
</script>
Avatar billede dklap3 Nybegynder
25. maj 2009 - 17:28 #7
@ repox,

Kan ikke rigtig få liv i koden, den kommer med en felj (og flere når jeg forsøger at fjerne fejlen).

Har lige smidt koden på en "ren" testside hvor der ikke er andet. Koden er præcis som du skrev den, dog med en dbconnect tilføjet:

http://www.herningshuse.dk/test.php?nid=49

Kan du se nogle helt åbenlyse fejl? koden igen:

<?
    include("dbconnect.php");
    /* Lidt generelt*/
    $sql = "SELECT COUNT(nid) AS no FROM herning_nyheder");
    $res = mysql_query($sql);
 
    $no = mysql_result($res, 0, "no");
    $newsPrPage = 10;
    $pages = ceil($no/$newsPrPage);
    $currentPage = (isset($_GET["page"])? $_GET["page"] : 0;
    $start = $currentPage * $newsPrPage;
         
    $hent = mysql_query("select * from herning_nyheder ORDER BY nid DESC LIMIT ".$start.", ".$newsPrPage);
    while ($row1 = mysql_fetch_array($hent))
    {
        echo "<font color='#999999' size='1'>". $row1['ndato'] .":<br></font><a href='nyheder.php?nid=" . ($row1["nid"]) ."'>" . $row1['noverskrift'] . "</a><p>";
    }
 
    /* Forrige link */
    if($currentPage > 0)
    {
        $prevPage = $currentPage - 1;
        echo "<a href=\"".$_SERVER["PHP_SELF"]."\?page=".$i."\" title=\"Forrige\">Forrrige</a>";
    }
 
    /* Siderne */
    for($i = 1; $i <= $pages; $i++)
    {
        if($i == $currentPage)
            $class = "pageActive";
        else
            $class = "page";
         
        echo "<a href=\"".$_SERVER["PHP_SELF"]."\?page=".$i."\" title=\"Side ".$i."\">".$i."</a>";
    }
 
    /* Næste link */
    if($currentPage < $pages)
    {
        $nextPage = $currentPage + 1;
        echo "<a href=\"".$_SERVER["PHP_SELF"]."\?page=".$i."\" title=\"Næste\">Næste</a>";
    }
 
 
?>
Avatar billede repox Seniormester
25. maj 2009 - 17:33 #8
Jaeh, det er fordi der er en parantes i slutningen af linien:
$sql = "SELECT COUNT(nid) AS no FROM herning_nyheder");

Den skal du fjerne så der står:
$sql = "SELECT COUNT(nid) AS no FROM herning_nyheder";
Avatar billede dklap3 Nybegynder
25. maj 2009 - 17:44 #9
Når den er væk kommer der så en fejl i linje 10:

Parse error: syntax error, unexpected ';' in /customers/herningshuse.dk/herningshuse.dk/httpd.www/test.php on line 10

Når det ";" så er fjernet kommer der en felj i linje 11:

Parse error: syntax error, unexpected T_VARIABLE in /customers/herningshuse.dk/herningshuse.dk/httpd.www/test.php on line 11

Linje 11:    $start = $currentPage * $newsPrPage;

Nu begynder jeg at tvivle på jeg bare kan blive ved med at slette i koden?
Avatar billede repox Seniormester
25. maj 2009 - 17:46 #10
Du skulle ikke fjerne semikolonnet; fejlen ligger i denne linie:
$currentPage = (isset($_GET["page"])? $_GET["page"] : 0;
Der skal stå:
$currentPage = (isset($_GET["page"])) ? $_GET["page"] : 0;
Avatar billede dklap3 Nybegynder
25. maj 2009 - 18:01 #11
Bingo, så virker det. :-)

http://www.herningshuse.dk/testnyheder.php?nid=49

Så kommer næste problem dog på banen, nemlig hvordan søren man får lavet de links til siderne så de virker. På en eller anden måde skal man jo have nid med i URL'en så der stadig bliver vist en nyhed på højre del af siden.
Avatar billede repox Seniormester
25. maj 2009 - 18:19 #12
Hvis det er fordi du gerne vil vise en nyhed når man rammer siden, kan du jo blot angive at hvis $_GET["nid"] ikke er sat, så vis altid den sidste nyhed (eller senest viste, for at forbedre konsistensen).

Igen, noget ala:

if(!isset($_GET["nid"]))
{
    $sql = "SELECT nid FROM herning_nyheder ORDER BY nid DESC LIMIT 1";
    $res = mysql_query($sql);
    $nid = mysql_result($res, 0, "nid");
}
else
{
    $nid = $_GET["nid"];
}

Hvis du nu kan få det til at passe ind i den kode der viser din nyhed ;)
Avatar billede dklap3 Nybegynder
25. maj 2009 - 18:33 #13
Beklager hvis jeg er lidt tung at danse med, men er ganske forvirret lige nu :-D

Der vil altid skulle vises en nyhed i højre side, derfor er der altid et "nid" med i URL'en. Uden et nid bliver man smidt videre til en 404 fejl side. F.eks. har jeg i "nyheder" linket i min top menu sat den til altid at vælge det højeste "nid" (eller seneste nyhed om du vil).

Et eller andet sted ville jeg jo gerne have at hvis jeg f.eks skrev http://www.herningshuse.dk/testnyheder.php?nid=35&?page=2 i min URL så viste den "nyhed nid 35" til højre og "page 2" til venstre. Lige nu bliver den bare på side 1 lige meget hvad jeg gør.

Selve nyheden til højre bliver trukket ud allerede i toppen af siden. Til det bruges:

<?php

    $sql = sprintf( "SELECT `nid` , `noverskrift`  , `ntekst` , `ndato`
        FROM `herning_nyheder` WHERE `nid` = '%s'", mysql_escape_string( $_GET['nid'] ) );
        $test = mysql_query($sql) or die (mysql_error());

        if ($row = mysql_fetch_assoc($test))
          {
          $nid = $row["nid"];


if (isset($nid)) {

?>
Avatar billede ebusiness Nybegynder
25. maj 2009 - 18:53 #14
Der skal kun være spørgsmålstegn før første parameter: http://www.herningshuse.dk/testnyheder.php?nid=35&page=2
Avatar billede dklap3 Nybegynder
25. maj 2009 - 19:49 #15
Super, så begynder det pludselig at ligne noget. :-)

http://www.herningshuse.dk/testnyheder.php?nid=24&page=1

Nogle småproblmer jeg ikke lige kan få til at virke:

1. Jeg har fjernet "Forrige" og "Næste" links de jeg synes de forvirrer mere end de gavner (ved godt de var med i mit oprindelige eksempel, sry). Nu er problemet dog bare lige at linket til side 1 rent faktisk er til post 11-20, og de første 10 poster ligger på side 0. Jeg kan godt ændre det så jeg har links til de rigtige sider, men så starter den bare med side 0 [Hvis jeg ændrer 1 til 0 her: for($i = 1; $i <= $pages; $i++)  ] Hvordan får jeg den til at starte ved side 1 (så det rent faktisk er post 1-10)?

2. Jeg vil gerne have "page=x" med når jeg klikker på et nyhedslink så den ikke hopper tilbage til de første nyheder hver gang jeg vælger at læse en nyhed. Det er fint at den bare starter med de seneste 10 nyheder første gang man kommer ind på siden, men "page" må gerne følge med når man bladrer rundt på nyhedssiden. Det er vel noget med en "isset" et eller andet sted, og så smide den efter hver enkelt nyhedslink? Håber det giver mening. :-)
Avatar billede dklap3 Nybegynder
25. maj 2009 - 19:50 #16
...og koden ser altså sådan her ud nu:

<? 
    /* Lidt generelt*/
    $sql = "SELECT COUNT(nid) AS no FROM herning_nyheder";
    $res = mysql_query($sql);
 
    $no = mysql_result($res, 0, "no");
    $newsPrPage = 10;
    $pages = ceil($no/$newsPrPage);
    $currentPage = (isset($_GET["page"])) ? $_GET["page"] : 0;
    $start = $currentPage * $newsPrPage;
         
    $hent = mysql_query("select * from herning_nyheder ORDER BY nid DESC LIMIT ".$start.", ".$newsPrPage);
    while ($row1 = mysql_fetch_array($hent))
    {
        echo "<font color='#999999' size='1'>". $row1['ndato'] .":<br></font><a href='testnyheder.php?nid=" . ($row1["nid"]) ."'>" . $row1['noverskrift'] . "</a><p>";
    }
  echo "<br>";
  echo "Gå til side:&nbsp;";
 
    /* Siderne */
    for($i = 1; $i <= $pages; $i++)
    {
        if($i == $currentPage)
            $class = "pageActive";
        else
            $class = "page";
         
        echo "<a href=\"".$_SERVER["PHP_SELF"]. "?nid=" . $row["nid"] ."&page=".$i."\" title=\"Side ".$i."\">".$i."</a> ";
    }
 
?>
Avatar billede dklap3 Nybegynder
25. maj 2009 - 20:01 #17
Har fundet ud af "problem 2" altså den med at blive på siden man er på. $page fangede den åbenbart allerede. :-)
Avatar billede repox Seniormester
25. maj 2009 - 20:41 #18
Med hensyn til 'problem 1' kan du erstatte linienerne:

$currentPage = (isset($_GET["page"])) ? $_GET["page"] : 0;
med
$currentPage = (isset($_GET["page"])) ? $_GET["page"] : 1;

og

$start = $currentPage * $newsPrPage;
med
$start = ($currentPage - 1) * $newsPrPage;
Avatar billede dklap3 Nybegynder
25. maj 2009 - 21:41 #19
Meget tæt på mål: http://www.herningshuse.dk/testnyheder.php?nid=49

Nu er der dog lige den lille fejl at når man kommer ind på nyhedssiden første gang er "page" ikke defineret og det får de 10 første nyhedslinks til a gå i kludder (fordi de mangler page).

Man skulle helst kunne komme ind på siden uden at definere "page", da der er en masse links i f.eks. google hvor page ikke er med. Kan man ikke sætte $page til at være side 1 hvis ikke andet er valgt?


<? 
    /* Lidt generelt*/
    $sql = "SELECT COUNT(nid) AS no FROM herning_nyheder";
    $res = mysql_query($sql);
 
    $no = mysql_result($res, 0, "no");
    $newsPrPage = 10;
    $pages = ceil($no/$newsPrPage);
    $currentPage = (isset($_GET["page"])) ? $_GET["page"] : 1; 
    $start = ($currentPage - 1) * $newsPrPage;
         
    $hent = mysql_query("select * from herning_nyheder ORDER BY nid DESC LIMIT ".$start.", ".$newsPrPage);
    while ($row1 = mysql_fetch_array($hent))
    {
        echo "<font color='#999999' size='1'>". $row1['ndato'] .":<br></font><a href='testnyheder.php?nid=" . ($row1["nid"]) ."&page=$page'>" . $row1['noverskrift'] . "</a><p>";
    }
  echo "<br>";
  echo "Gå til side:&nbsp;";
 
    /* Siderne */
    for($i = 1; $i <= $pages; $i++)
    {
        if($i == $currentPage)
            $class = "pageActive";
        else
            $class = "page";
         
        echo "<a href=\"".$_SERVER["PHP_SELF"]. "?nid=" . $row["nid"] ."&page=".$i."\" title=\"Side ".$i."\">".$i."</a> ";
    }
 
?>
Avatar billede repox Seniormester
25. maj 2009 - 21:58 #20
Jeg kan ikke se det ikke virker? Det ser da meget rigtigt ud?
Avatar billede dklap3 Nybegynder
25. maj 2009 - 22:11 #21
Jo hvis du nu kommer ind via dette link (altså uden $page):

http://www.herningshuse.dk/testnyheder.php?nid=49

Og så klikker på en nyhed i venste side (f.eks. "Queens Corner indflytningsklar") så kommer der en fejl.

Du kan også se det i URL'en på de 10 første nyheder, de ender uden en $page som f.eks: http://www.herningshuse.dk/testnyheder.php?nid=47&page=
Avatar billede repox Seniormester
25. maj 2009 - 22:17 #22
Ah, på den måde.

Det er fordi at du har drevet gætværk.

echo "<font color='#999999' size='1'>". $row1['ndato'] .":<br></font><a href='testnyheder.php?nid=" . ($row1["nid"]) ."&page=$page'>" . $row1['noverskrift'] . "</a><p>";

Skal ændres til

echo "<font color='#999999' size='1'>". $row1['ndato'] .":<br></font><a href='testnyheder.php?nid=" . ($row1["nid"]) ."&page=$currentPage'>" . $row1['noverskrift'] . "</a><p>";
Avatar billede dklap3 Nybegynder
25. maj 2009 - 22:28 #23
Ahhh...nå det da var ikke såå langt fra. ;-)

Alt er nu som det skal være og jeg har byttet testsiden ud med den rigtige: www.herningshuse.dk

Det er jo lige præcis det jeg så ofte har tænkt på jeg gerne ville have lavet, så helt perfekt.

Tusind tak for hjælpen. :-)

Smid endelig et svar.
Avatar billede repox Seniormester
25. maj 2009 - 23:01 #24
Jamen, jeg er glad for det kom til at virke.
Her er svar
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