Avatar billede Slettet bruger
05. juni 2009 - 15:11 Der er 10 kommentarer og
1 løsning

Sletning af kommentarer, der læner sig op ad den første i databasen?

Goddag kære eksperter..

Jeg sidder og roder med et kommentarsystem, hvor jeg er i gang med at lave administrator delen. Hertil har jeg tilføjet en slet knap ved hver enkelt kommentar, hvorved jeg sletter kommentarerne på følgende måde:

<?php
if (isset($_GET['id'])) {

mysql_query("DELETE FROM blogs_comments WHERE id=".$_GET['id']."") or die(mysql_error());
mysql_query("DELETE FROM blogs_comments WHERE parent_id=".$_GET['id']."") or die(mysql_error());
header("location:".$_SERVER['HTTP_REFERER']);
exit();
}
?>

Den sletter da også den pågældende kommentar og de kommentarer, der er tilknyttet med samme parent_id.

Problemet opstår dog i at den ikke sletter de kommentarer, der ligger sig op af den første kommentar når vi kommer endnu længere ud. Jeg kan illustrere det på denne måde:

http://www.valuable.dk/eksempel1.jpg

Hvis man sletter kommentar #8 sletter den også kommentar #9, da den ligger med samme parent_id som kommentar #8's id. Men hverken kommentar #10, #11, #12 eller #13 bliver slettet da de har et parent_id, der læner sig op ad kommentar hhv. #9, #10 og #11.

Min database ser ud som her:

http://www.valuable.dk/eksempel2.jpg


Spørgsmålet lyder derfor på hvordan jeg får slettet alle kommentarer, der tager udgangspunkt i den første kommentar (kommentar #8 i dette tilfælde), uanset hvor langt ude de er i rækken?
Avatar billede j4k0b Nybegynder
05. juni 2009 - 15:28 #1
Du skal lave en rekursiv funktion, altså en funktion der kan kalde sig selv til uendelighed og slette alle kommentarer ud fra et kommentar-ID.

Din nuværende SQL er i øvrigt meget sårbar overfor SQL injections
Avatar billede Slettet bruger
05. juni 2009 - 15:54 #2
Og hvordan laver man så en rekursiv funktion :D ?

Har ikke rigtig finpudset det endnu og sådan.. Der skal lidt forespørgsler på mht. om man er admin eller ej osv.. Og mht SQL injections så tænkte jeg at følgende måske kunne klare det:

function clean($str) {
$str = @trim($str);
if(get_magic_quotes_gpc()) {
  $str = stripslashes($str);
}
return mysql_real_escape_string($str);
}

$newid = clean($_GET['id']);

og så slette ud fra $newid i stedet for $_GET['id']...

Men det er måske stadig ikke sikkert :) ? Det bruger jeg i hvert fald til at smide ind i databasen når det er..
Avatar billede showsource Seniormester
05. juni 2009 - 20:51 #3
Du kan lige så godt ændre din db opbygning med det samme.

En tabel til oprettede tråde
id, overskrift, hvem .....

En tabel til kommentarer
id, traadid, hvem .....

og en tabel til som er kommentar til kommentar

id, traadid, komid, subkomid, hvem .....
Avatar billede Slettet bruger
05. juni 2009 - 21:27 #4
Har allerede de to øverste tabeller du beskriver der.. Den tabel jeg viser er tabellen med kommentarer.. Den overordnede med blogs hedder noget andet ;)

Men jeg håbede jeg kunne løse problemet uden at skulle til at oprette endnu en tabel.. :/
Avatar billede showsource Seniormester
05. juni 2009 - 21:36 #5
hmm, ja, du kan jo lave et felt som er ref til "subkomid"
Men et felt til traadid, og et andet til kommentarid er ikke nok hvis du vil lave ref til "subkommentarer"
Avatar billede showsource Seniormester
05. juni 2009 - 21:58 #6
ehh, i en "subkommentar_tabel" er der vel heller ingen grund til at ha' ref til traadid.
Avatar billede ebusiness Nybegynder
06. juni 2009 - 00:34 #7
Jeg er sådan set ikke så skarp i SQL, men hvis jeg ellers har lavet querysne rigtigt så kan den her funktion slette kommentarerne:

<?php
function deletecomment($id){
    ($result=mysql_query("SELECT id FROM blogs_comments WHERE parent_id=".$id)) or die(mysql_error());
    while($row = mysql_fetch_assoc($result)){
        deletecomment($row['id']);
    }
    mysql_query("DELETE FROM blogs_comments WHERE id=".$id) or die(mysql_error());
}
?>
Avatar billede Slettet bruger
06. juni 2009 - 00:58 #8
Synes desværre ikke rigtig der sker noget uanset hvordan jeg lige vender og drejer det script der :(
Avatar billede ebusiness Nybegynder
06. juni 2009 - 11:12 #9
Det er en funktion, du skal kalde funktionen før der sker noget, fx deletecomment($_GET['id']);
Avatar billede Slettet bruger
06. juni 2009 - 11:32 #10
Yearh, det prøvede jeg også i går men af en eller anden underlig grund virkede det ikke.. Såvidt jeg kan se var det det samme jeg indtastede, men kan godt ske jeg har overset en tastefejl eller lignende =)

Det virker nemlig nu, så jeg takker mange gange ;)!
Avatar billede ebusiness Nybegynder
06. juni 2009 - 11:57 #11
Det var så lidt. (Og nu har jeg d. 6/6 opnået 6660 point. Muhahahahahahaaaa!)
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