Avatar billede bqq Nybegynder
29. marts 2010 - 15:42 Der er 17 kommentarer

Find næste ikke tomme id

Jeg har en nyheds side der henter en nyhed fra mysql...

Da der er mulighed for at trykke næste og sidste vil jeg gerne at der tjekkes om det næste id er tomt, og hvis det er så finder det næste ikke tomme id.

Altså forestil jer at nyhed med id 3 og 4 slettes, så vil jeg gerne at man i stedet for at skulle forbi 2 tomme sider hopper til id 5..

Sådan ser det ud nu, men kan ikke helt få mit loop til at gøre det rigtigt uden at kalde op til databasen hver gang i loopet..

Og hvis der evt er bedre måder at finde max og minid så jeg ikke skal have alle mine opkald til db tager jeg meget gerne mod forslag der også

<?php
$tbl_name="news";

//Valgte id
$id=$_GET['id'];

//Sæt næste og sidste nyhed
$lastid = $_GET['id']-1;
$nextid = $_GET['id']+1;

//Find mindste id
$sqlmin="SELECT id FROM $tbl_name ORDER BY id LIMIT 1";
$resultmin=mysql_query($sqlmin);
$rowsmin=mysql_fetch_array($resultmin);
$minid=$rowsmin['id'];

//Find største id
$sqlmax="SELECT id FROM $tbl_name ORDER BY id DESC LIMIT 1";
$resultmax=mysql_query($sqlmax);
$rowsmax=mysql_fetch_array($resultmax);
$maxid=$rowsmax['id'];

//Hent indhold om valgte id
$sql="SELECT * FROM $tbl_name WHERE id='$id'";
$result=mysql_query($sql);
$rows=mysql_fetch_array($result);

?>
<div id="news_menu">
    <div id="news_last"><?php
    if ($_GET['id'] != $minid){
        echo('<a href="index.php?Side=News&id='.$lastid.'"><img src="inc/img/last.jpg" /></a>');}
    else{
        echo('<img src="inc/img/last_inactive.jpg" />');
        }
    ?></div>
    <div id="news_spacer"></div>
    <div id="news_next"><?php
    if ($_GET['id'] != $maxid){
        echo('<a href="index.php?Side=News&id='.$nextid.'"><img src="inc/img/next.jpg" /></a>');}
    else{
        echo('<img src="inc/img/next_inactive.jpg" />');
        }
    ?></div>
    <div id="news_title"><b><?php
    echo $rows['titel'];
    ?></b></div>
</div>
<div id="newscontainer">
<?php
if(empty($id)){
    echo('<center>Der er i øjeblikket ingen nyheder</center>');
    }
else{
echo $rows['tekst'];
}
?>
</div>

Håber i kan hjælpe
Avatar billede keysersoze Ekspert
29. marts 2010 - 15:49 #1
Det ligner en lidt skæv tilgang til et almindeligt problem - kig i stedet på brug af limit og/eller søg lidt efter nogle "paging" eksempler, se fx http://www.phpuniverset.dk/show_artikels.phtml?ArtikelID=19
Avatar billede bqq Nybegynder
29. marts 2010 - 16:00 #2
Jeg skal ikke rigtig bruge "paging" til noget.
Jeg viser kun en nyhed, hvor man så kan sige næste eller sidste..

Så jeg gerne vil bare finde det næste id der ikke er tomt.
Avatar billede keysersoze Ekspert
29. marts 2010 - 16:18 #3
det du beskriver er netop paging - en minimal version godt nok men stadigvæk det der definerer paging.

alternativt er du nødt til at lave to nye sql'er - fx

select id from tabel where id > '$id' limit 1,1

men det kan let blive tungt med en masse i bund og grund unødige sql'er.
Avatar billede bqq Nybegynder
29. marts 2010 - 19:38 #4
Nu fandt jeg en løsning..
Ved ikke helt hvor god den er, men det virker ihvertfald :)

$id=$_GET['id'];

$checkidresult = mysql_query("SELECT id FROM $tbl_name");
$idarray = "";
while($rowsid = mysql_fetch_array($checkidresult, MYSQL_NUM)){
$idarray .= $rowsid[0];
};

$nextid = 0;
$lastid = 0;
for($i=0; $i<mysql_num_rows($checkidresult); $i++){
if($id == $idarray[$i])
    {
    $nextid = $idarray[$i+1];
    $lastid = $idarray[$i-1];
    };
}
Avatar billede bqq Nybegynder
29. marts 2010 - 19:56 #5
nej det gjorde det så ikke helt alligevel.. når id bliver mere end 1 ciffer bliver den ikke så glad..
Avatar billede keysersoze Ekspert
29. marts 2010 - 19:59 #6
det er en rigtig dårlig idé du er ude i, det kan blive virkelig tungt - hvad er der i vejen med mit forslag?
Avatar billede bqq Nybegynder
29. marts 2010 - 20:08 #7
Jeg kan bare ikke forstå hvordan jeg slipper af med det det tomme id ved at bruge limit...
Avatar billede bqq Nybegynder
29. marts 2010 - 20:35 #8
Bare for at være sikker på du forstår hvad jeg vil lave forklarer jeg den lige igen..

På min nyhedsside vises min seneste nyhed, og ikke andre nyheder.
Man kan trykke næste og sidste, hvilket loader den tidligere nyhed eller den næste nyhed.
Mit problem er hvis der bliver slettet en nyhed, så vil der blive vist en tom nyhed når dets id er som valgt.

derfor vil jeg gerne finde det næste id som ikke er tomt..

Hvis det også er det du mener jeg kan bruge limit og paging til, så er jeg bare ikke helt med på hvordan.. :)
Avatar billede keysersoze Ekspert
29. marts 2010 - 21:25 #9
http://php.about.com/od/mysqlcommands/g/Limit_sql.htm

prøv at fyre disse SQL'er af ved siden af et af dine nuværende nyheds-id'er så burde du kunne se hvilket resultat de giver;

select id from tabel where id > '$id' order by id limit 0,1
select id from tabel where id < '$id' order by id limit 0,1
Avatar billede bqq Nybegynder
30. marts 2010 - 00:10 #10
Nu har jeg fået det til at virke men har stadig ikke helt forstået det med limit...

Men tusind tak for forsøget keysersoze!!
Avatar billede keysersoze Ekspert
30. marts 2010 - 08:00 #11
LIMIT x, y

limit henter y antal resultater ud startende fra x - i mit eksempel hentes altså én post ud og der springes 0 resultater over. på den måde får du med de to SQL'er det id der ligger henholdsvis lige før og lige efter dit where-id.
Avatar billede keysersoze Ekspert
30. marts 2010 - 08:01 #12
test...
Avatar billede keysersoze Ekspert
30. marts 2010 - 08:02 #13
troede mit svar forsvandt - men det var bare lang tid om at dukke op.
Avatar billede showsource Seniormester
30. marts 2010 - 09:55 #14
Man kan jo godt gemme alle id'er et array, som der er lidt inde på i kommentaren #4

Det har fordelen at man kan tjekke om request findes tilsvarende i db.

$checkidresult = mysql_query("SELECT id FROM $tbl_name");
$pages = array();

$i = 1;
while($p = mysql_fetch_object($checkidresult)) {
$pages[$i] = $p->id;
$i++;
}

$idref = (isset($_GET["page"],$pages[$_GET["page"]]) ? $_GET["page"] : 1);

echo"<p>";

$forrige = (isset($pages[($idref-1)]) ? "<a href=\"?page=".($idref-1)."\">Forrige</a>" : "");
$next = (isset($pages[($idref+1)]) ? "<a href=\"?page=".($idref+1)."\">N&aelig;ste</a>" : "");;

echo $forrige ." ".$next;

echo"<p>";

// Her findes hvilket id i tabel der skal hentes
$sqlid = $pages[$idref];

$text = "SELECT * FROM ".$tbl_name." WHERE id = ".$sqlid;

// Her kan du være sikker på at der hentes indhold fra db
$row = mysql_query($text) or die (mysql_error());
Avatar billede keysersoze Ekspert
30. marts 2010 - 10:04 #15
man kan gøre mange ting, men det skal også være en opvejelse af performance - at hive samtlige poster fra en tabel ud kan være en fin løsning hvis der kun ligger 10 poster, men hvad hvis der ligger 1 mio poster.
Avatar billede showsource Seniormester
31. marts 2010 - 07:24 #16
Jowjow, alting med måde :O)
Men f.eks. 100+ poster tvivler jeg på ville være et problem.
Avatar billede keysersoze Ekspert
27. juni 2010 - 10:51 #17
Lukketid?
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