28. december 2003 - 22:35Der er
36 kommentarer og 1 løsning
Menusorteting op ned
Hej, jeg har en menu jeg godt vil kunne styre op og ned altså hvor de skal stå.
Jeg har et felt i min database der hedder sort. fx.: page | sort --------------- forside | 1 info | 2 om | 3 og har tænkt på at den skal kunne gøre sådan at når man klikker på op så rykker den en op.
Altså har man fat i info og klikker på op, så kommer den til at have 1 i sort og forside for 2.
1) Find ud af hvilken der står før den, der skal rykkes op 2) UPDATE tabel SET sort = sort-1 WHERE page='info'; 3) Læg én til på den, der skal rykkes ned
Systemet du ønsker at lave er ikke decideret svært.
Du skal egentlig blot gøre som myplacedk siger. Han har dog ikke uddybet punkt 3 nok efter min mening. Jeg har forståelsen af, at det er der dit største problem ligger.
Når du ved, hvilken menu der skal rykkes, og om den skal rykkes op eller ned er resten ganske enkelt. For at kunne forklare enklere er: Menu1 = Den menu du ønsker at rykke Menu2 = Den menu, der skal rykkes, for at Menu1 bliver rykket. (Dvs. skal Menu1 en plads op, skal Menu2 en plads ned)
Du finder Menu1 i din MySQL. Her henter du "sort" fra dens informationer.
Hvis du så har valgt at rykke Menu1 en plads op (i dette tilfælde, vil IDet blive en mindre), finder du Menu2, som rykkes ned, ved at sige: Menu1s sort + 1 (Det må jo være Menu2s sort, ikk?) Hvis det var omvendt, altså Menu1 skulle en plads ned, fandt du Menu2s sort
Ved hjælp af Menu2s sort kan du finde Menu2s ID igennem et opkald til tabellen. Herefter kan du rette Menu2s sort til en lavere eller en højere.
Du laver en update til Menu1s sort, sådan, at Menu1s "sort" bliver en større eller en mindre, alt efter om den skulle rykkes op eller ned.
Du laver en update til Menu2s sort, sådan, at Menu2s "sort" bliver en større eller en mindre, alt efter om den bliver rykket op eller ned.
Det er vigtigt, at der først updates til sidst, da der ellers vil være forvirring når du skal finde Menu2s ID.
Håber det hjalp en smule, trods min svære forklaring sikkert. :)
Er det her rigtigt eller er jeg helt galt på den? if (isset($_GET['PageNed'])) { $data = mysql_query("SELECT sort FROM cms WHERE sort < $PageNed ORDER BY sort DESC LIMIT 1"); $row = mysql_fetch_array($data); $sort = $row[sort] + 1; mysql_query("update cms set sort = '$sort' where menu = '$PageNed'"); }
$_GET['PageNed'] og $PageNed er ikke nødvendigvis det samme. Desuden laver du et alvorligt sikkerhedsproblem ved at forudsætte, at det er et tal. Forslag:
$PageNed = (int)$_GET['PageNed'];
Skal indsættes som første linje efter "if"-linjen. Det løser begge problemer. Ellers tror jeg vist at det skulle virke. Du mangler så lige at flytte en anden side den modsatte vej. Ellers risikerer du at flere sider får samme nummer i "sort".
Jeg kom lige til at tænke på noget. Der bliver problemer, hvis der er "huller" i rækkefølgen. Eksempel: Et punkt med sort-nummer 15 skal rykkes op. Den lige oven over har nummer 13. Så vil de begge få nummer 14.
Løsning: 1) Find navnet på den, der skal byttes plads med. (Dvs. den lige før, eller den lige efter.) Du har nu to navne, der skal bytte plads. (Fx. $anavn og $bnavn) 2) Find sort-nummeret på den begge. (Fx. $asort og $bsort) 3) Indsæt sort-numrene ombyttet. Fx: UPDATE tabel SET sort='$asort' WHERE page='$bnavn' og UPDATE tabel SET sort='$bsort' WHERE page='$anavn'
Du skal nok være lidt mere præcis i din forklaring, for at jeg kan hjælpe dig. :) Sidst jeg skrev, skrev jeg 3 punkter. Har du fået den første til at fungere? Hvis ikke, hvad er problemet?
Hmm... Måske vil det nemmeste være, at jeg bare skriver koden. Men vil du lære noget af det? (Jeg vil gerne lære fra mig, men jeg vil ikke bare gøre arbejdet for dig.)
Sådan. Jeg har ikke testet det. Desuden er det lang tid siden jeg har brugt mysql_* funktionerne (de er så besværlige, jeg bruger PEAR::DB i stedet), så jeg er ikke sikker på om jeg bruger dem helt rigtigt. Der mangler i hvert fald fejlhåndtering, det er der ikke noget af.
Sig endelig til, hvis der er noget, du ikke forstår.
// Hent id på det menupunkt der skal flyttes. // Hvis der ikke er noget der skal flyttes, vil de begge indeholde 0. $PageOp = (int)@$_GET['PageOp']; $PageNed = (int)@$_GET['PageNed'];
if ($PageOp>0) {
// $PageOp skal flyttes op. $id1 = $PageOp;
// Find nuværende "sort"; $sql = "SELECT sort FROM tabel WHERE id=$id1"; $result = mysql_query($sql); $row = fetch_row($result); $sort1 = $row[0];
// Find punkt der skal byttes med $sql = "SELECT id, sort FROM tabel WHERE sort>$sort1 ORDER BY sort ASC LIMIT 1"; $result = mysql_query($sql); $row = fetch_row($result); $id2 = $row[0]; $sort2 = $row[1];
} elseif ($PageNed>0) {
// $PageNed skal flyttes ned. $id1 = $PageNed;
// Find nuværende "sort"; $sql = "SELECT sort FROM tabel WHERE id=$id1"; $result = mysql_query($sql); $row = fetch_row($result); $sort1 = $row[0];
// Find punkt der skal byttes med $sql = "SELECT id, sort FROM tabel WHERE sort<$sort1 ORDER BY sort DESC LIMIT 1"; $result = mysql_query($sql); $row = fetch_row($result); $id2 = $row[0]; $sort2 = $row[1];
}
if ($PageOp>0 || $pageNed>0) {
// Der skal byttes $sql = "UPDATE tabel SET sort='$sort2' WHERE id='$id1'"; mysql_query($sql); $sql = "UPDATE tabel SET sort='$sort1' WHERE id='$id2'"; mysql_query($sql); }
ok, når man kommer ind på siden: array(0) { } Når jeg klikker op: array(1) { ["PageOp"]=> string(1) "1" } og ned: array(1) { ["PageNed"]=> string(1) "1" }
Måske er der en SQL-fejl et sted. Prøv at indsætte noget MySQL fejl-håndtering. Det er MEGET lang tid siden jeg har rodet med sådan noget, men det er vist noget i stil med: $result = mysql_query($sql) or die(mysql_error()); Hvis der er SQL-fejl, vil den så blive vist.
Efter hver linje, der starter med "$sql =", kan du bagefter indsætte dette: echo "<p>SLQ: $sql</p>"; Så kan du se hvad det er, der bliver sendt til databasen.
Jeg ved heller ikke lige hvad der er galt, jeg synes den virker som den skal. Når jeg trykker "op" ved et menupunkt, så rykker det op. Når jeg trykker "ned", så rykker menupunktet ned...
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.