Avatar billede prop46 Nybegynder
19. februar 2007 - 13:55 Der er 11 kommentarer og
1 løsning

Tildel ny rækkefølge i mysql

Jeg hiver rækker ud af DB ORDER BY raekkefolge. De bliver liste under hinanden, og bruger kan nu "bytte om" på rækkefølgen ved hjælp af bl.a. nedestående kode:

if($action=='afsnit_op'){
    $gl_raekkefolge = $_GET['raekkefolge'];
    $flyt_raekkefolge = $gl_raekkefolge;
    $flyt_raekkefolge--;

    $op1 = "UPDATE peter SET raekkefolge='-1' WHERE emne = '$emne' AND raekkefolge='$gl_raekkefolge'";
    $op2 = "UPDATE peter SET raekkefolge='$gl_raekkefolge' WHERE emne = '$emne' AND raekkefolge='$flyt_raekkefolge'";
    $op3 = "UPDATE peter SET raekkefolge='$flyt_raekkefolge' WHERE emne = '$emne' AND raekkefolge='-1'";

    aabn_forbindelse_og_vaelgdb();
    mysql_query($op1);
    mysql_query($op2);
    mysql_query($op3);
    luk_forbindelse();
}

Det virker altsammen vældigt fint. Men bruger kan også slette og oprette rækker i DB. Ved opret tildeles den nye række et raekkefolgetal der er én højere en det højeste raekkefolgetal. MEN... når der slettes en række i DB kommer der jo et hul i listen af raekkefolgetal.
Eks. 1 2 3 4 5 kan blive til 1 2 .. 4 5 og nu vil koden der "bytter om" på rækkefølgen naurligvis ikke længere virke ordentligt....!

Jeg tænker, at jeg hver gang der slettes en række i DB skal tjekke alle raekkefolgetallene (der vil højest være 8 tal, så det er vel ikke så slemt, og det vil formodentligt ikke ske så tit), og tildele alle rækkerne i DB et nyt raekkefolgetal, så listen bliver ubrudt...?

Ved bare ikke helt hvordan jeg gør det nemmest, og om der er andre og bedre måder...?
Avatar billede Slettet bruger
19. februar 2007 - 14:17 #1
Det nemmeste vil være hvis du kender det nr. du sletter fra db'en.

$slet_raekkefolge = intval($_GET["raekkefolge"]);
mysql_query("DELETE FROM peter WHERE raekkefolge = '$slet_raekkefolge'");
mysql_query("UPDATE peter SET raekkefolge = raekkefolge - 1 WHERE raekkefolge > '$slet_raekkefolge'");

Det burde virke...

En kommentar til din kode. Du behandler ikke dit input $_GET["raekkefolge"] på nogen måde, inden du smider det ind i din SQL-streng. Kan kan godt give problemer hvis nogen 'finder ud af det' og forsøger at misbruge det :-)
Avatar billede prop46 Nybegynder
19. februar 2007 - 14:27 #2
Okay.. prøver jeg lige. Hvad mener du med --> "behandler ikke dit input $_GET["raekkefolge"]" ?
Avatar billede Slettet bruger
19. februar 2007 - 14:33 #3
Hvis nu jeg skriver http://side.dk/fil.php?raekkefolge=%27+or+%271%27+%3D+%271 så vil variablen $_GET["raekkefolge"] være

' or '1' = '1

Derved vil din SQL-streng $op1 blive til:

UPDATE peter SET raekkefolge='-1' WHERE emne = '' AND raekkefolge='' or '1' = '1'

Det vil bevirke at alle rækker i din tabel vil blive sat til -1 (hvor emne = '' selvfølgelig)
Avatar billede prop46 Nybegynder
19. februar 2007 - 14:42 #4
Ja det kan jeg godt se ville være en humoristisk lille bombe for en joker..... Koden virker forøvrigt fint. Men må jeg bede om et foreslag til at behandle $_GET["raekkefolge"]" ??
Avatar billede Slettet bruger
19. februar 2007 - 14:51 #5
Hvad med:

$raekkefolge = intval($_GET["raekkefolge"]);

:-)
Avatar billede prop46 Nybegynder
19. februar 2007 - 14:54 #6
nåhh... nu er jeg med :0) Sorry....
Avatar billede prop46 Nybegynder
19. februar 2007 - 14:58 #7
Hmm.. det kunne koden ikke lide.... Nu virker det ikke... raekkefolge bliver sat ned på alle dem over.. men selve rækken bliver ikke slettet.
Avatar billede prop46 Nybegynder
19. februar 2007 - 15:04 #8
Sludder.. det var bare mig der havde fem tommelfingre ...
Avatar billede Slettet bruger
19. februar 2007 - 15:17 #9
LOL :-D
Avatar billede prop46 Nybegynder
21. februar 2007 - 10:23 #10
Hmm.. lytter du mon stadig med? Jeg har på en eller anden måde fået lavet rod i den igen.. og nu virker det ikke ordentligt. Alle raekkefolger bliver nu sat ned.... altså ikke kun dem der er raekkefolge > '$slet_raekkefolge'.

<?php
if($action=='slet_afsnit'){
    $id = intval($_GET["id"]);
    $slet_raekkefolge = intval($_GET["raekkefolge"]);
    $slet_afsnit = "DELETE FROM peter WHERE id = '$id'";
    $aendr_raekkefolge = "UPDATE peter SET raekkefolge = raekkefolge - 1 WHERE emne = '$emne' AND raekkefolge > '$slet_raekkefolge'";

    aabn_forbindelse_og_vaelgdb();
    mysql_query($slet_afsnit);
    mysql_query($aendr_raekkefolge);
    luk_forbindelse();
}
?>

<a href="?side=peter&peter=pris&emne=pris&action=slet_afsnit&id=<?php echo $id; ?>&raekkefolge=<?php echo $raekkefolge; ?>" class="a3">
Avatar billede Slettet bruger
21. februar 2007 - 11:01 #11
Jep :-)

Måske burde du gøre sådan her i stedet:

<?php
if($action=='slet_afsnit'){
    $id = intval($_GET["id"]);

    aabn_forbindelse_og_vaelgdb();

// Finder emne + raekkefolge ud fra id
$res = mysql_fetch_array(mysql_query("SELECT emne, raekkefolge FROM peter WHERE id = '$id'"));

if ($res)
{

// Sletter ud fra id
mysql_query("DELETE FROM peter WHERE id = '$id'");

// Opdaterer raekkefolge
mysql_query("UPDATE peter SET raekkefolge = raekkefolge - 1 WHERE emne = '" . $res["emne"] . "' AND raekkefolge > '" . $res["raekkefolge"] . "'");

}

    luk_forbindelse();
}
?>
Avatar billede prop46 Nybegynder
21. februar 2007 - 11:15 #12
Så virker det igen :0)
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