Avatar billede pitzen Nybegynder
04. september 2008 - 10:17 Der er 5 kommentarer og
1 løsning

Sortere undersider

Hej..

Jeg har en menu der bliver genereret ud fra min db. Menuen består af en parent og x antal undersider.

Ala:

Biler
- Mazda
- Opel
- Audi
- BMW

Jeg har oprettet et felt i db-tabellen der hedder rank (integer), som jeg forstillede mig man kunne sortere efter.

Jeg kunne godt bruge lidt inspiration til hvordan man kunne lave et system der kan forøge eller formindske rank'en uden at man skal i db'en.

Og som også kunne tage højde for at en underside blev slettet. Atlså en sammenhængende liste.

Nogen foreslag?

Mvh
P
Avatar billede pitzen Nybegynder
04. september 2008 - 10:18 #1
Kort sagt;

Jeg ønsker at med ved at klikke på en "opad-pil" kunne ændre rækkefølgen på undersiderne til:

Biler
- Mazda
- Opel
- BMW
- Audi
Avatar billede pidgeot Nybegynder
04. september 2008 - 10:31 #2
Nu er det nødt til at være lidt pseudokode, men du fanger forhåbentligt pointen. Jeg har skrevet ud fra det grundlag at du har en primærnøgle der hedder "id". Bruger du en sammensat primærnøgle (eks. parent og rank), så skal du selvfølgelig rette tilsvarende.

Start med at finde rank og parent for det punkt der skal flyttes:
SELECT rank, parent FROM tabel WHERE id=X

Vi kalder dem for $Xrank og $XParent forneden.

Når du flytter et punkt et trin ned:
UPDATE tabel SET rank=rank+1 WHERE id=X
UPDATE tabel SET rank=rank-1 WHERE rank=$Xrank AND parent=$XParent

Op er det samme, men omvendt med + og -. Det ville nok ikke være nogen helt dum ide at "vende" den på forhånd, så du i virkeligheden finder det punkt der bliver flyttet ned og kører de førnævnte SQL-sætninger på den, da du på den måde slipper for at skrive næsten identiske SQL-sætninger.

Sletning af et punkt:
DELETE FROM tabel WHERE id=X
UPDATE tabel SET rank=rank-1 WHERE rank>$Xrank AND parent=$XParent

Hvis du har nogen mulighed for det bør du bruge en transaktion, for at sikre at du ikke ender med en halvfærdig opdatering fordi databasen pludselig går ned. Hvis det, som jeg vil tro, er MySQL du benytter, kræver det at tabeltypen er InnoDB.
Avatar billede pitzen Nybegynder
04. september 2008 - 11:38 #3
Tak for svar..

Jeg kan dog ikke få det til at virke helt. Det punkt der flyttes virker fint - det stiger én i rank.

Det andet punkt forbliver dog uændret i rank.

Jeg har:

$res = mysql_query("SELECT rank, parent FROM sider WHERE id=$id");
$row = mysql_fetch_array($res);
mysql_query("UPDATE sider SET rank=rank+1 WHERE id=$id");
mysql_query("UPDATE sider SET rank=rank-1 WHERE rank='$row[rank]' AND parent='$row[parent]' and id!='$id'");
Avatar billede pidgeot Nybegynder
04. september 2008 - 11:43 #4
Sådan går det når man lige skriver for hurtigt...

UPDATE tabel SET rank=rank-1 WHERE rank=$Xrank AND parent=$XParent

skulle have været

UPDATE tabel SET rank=rank-1 WHERE rank=$Xrank+1 AND parent=$XParent AND id!=X
Avatar billede pitzen Nybegynder
04. september 2008 - 12:16 #5
Så kører bussen :)

Tak for hjælpen - smider ud svar?!
Avatar billede pidgeot Nybegynder
04. september 2008 - 15:56 #6
Værsgo :)
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