Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  4 560
Hei,

Har laget et galleri i php som lagrer bildenavn i en database, og sliter litt med slettefunksjonen. Problemet er at når jeg får opp siden med bildene og en slett-link for hvert bilde, og jeg trykker slett på et av dem, slettes et annet!

Den relevante koden:

Kode

$sql = "SELECT * FROM testergallery";
$result = mysql_query($sql);
$antall = mysql_num_rows($result); 
for ($i = 0; $i<$antall; $i++) { 
	$rad = mysql_fetch_array($result);
	$picid = $rad['id'];
	$bilde = ""; 
	if($rad['bildenavn']) {
	     $bilde = "<img src=loginandadmin/gallery_images/" . $rad['bildenavn'] . " height='50' width='50'>"; echo "&nbsp;";
	}
	echo $bilde;
	echo "<br />";
	?><a href="loginandadmin/galdel.php?delete=1&id=<?php echo $picid ?>">Slett</a><?php
	echo "<hr/>";
}
if($_GET['delete'] == "1") {
	$q = "DELETE FROM testergallery WHERE id=$picid";
	$run = mysql_query($q);
	if(!$run) {
		die(mysql_error());
	} else {
		echo "Bildet ble slettet.";
		die();
	}
}
Det rare er at når jeg holder musen over slettelinken, får jeg opp link?delete=!&id=riktigIDforbildet, men når jeg trykker på den og oppdaterer siden (for å sjekke resultatet), er et helt annet bilde sletta!
m0b
m0b's Avatar
DonorAdministrator
Det er vel gjerne det siste bildet som blir sletta? Du har $picid, som ligger i et annet scope enn lengre ned i koden din. Fjernt nok at dette faktisk aksepteres av php, men problemet er vel gjerne at du itererer igjennom alle bildene dine, og setter verdi til $picid. Dette gjelder for hver eneste gang scriptet kjøres.

Dette betyr at når du har get-variabelen din deklarert og initialisert til "1", har fortsatt $picid verdien til siste iterasjon i loopen. Verdien du ønsker å slette er vel uansett get-variabelen id, og ikke $picid?

Du bør også tenke litt på potensialet for sql-injections i koden din her, spesielt når du gir informasjon om hva som går galt i spørringen med die.

Hvorfor kjører du funksjonen die etter at du har slettet bildet? Greit at det avslutter scriptet, men jeg lurer på om det er et bevisst valg? I såfall, hvorfor vil du kun avslutte scriptet hvis get-variabelen delete er satt? Ville kanskje tenkt litt på omstrukturering av logisk kode, og kanskje benyttet mulighetene for å lage skikkelige funksjoner.
Trådstarter
die(); hadde jeg for å avslutte scriptet, ja. Er ganske ny med PHP, så jeg har ikke så mye kunskap om å forhindre sql-injections. Det du altså mener, er at den sletter det siste bildet i databasen, heller enn det bildet jeg ønsker å slette? Isåfall, hva mener du jeg bør gjøre?

Nå som jeg vet at scriptet faktisk fungerer, minus at det sletter feil bilde, kan jeg jo sette die(mysql_error()); til bare die();, det var mest for debugging. Når det gjelder funksjoner, har jeg tenkt på det også, men jeg så for meg å ha en helt funksjonabel kode klar før jeg startet å lage funskjoner
m0b
m0b's Avatar
DonorAdministrator
En ting som bør fungere, såfremt jeg så igjennom koden din korrekt er:

Kode

if($_GET['delete'] == "1") { 
   $picid = $_GET['id'];
...
}
Det jeg mener med injections er at i URLen kan jeg legge inn tekst som vil føre til at jeg kan lage spørringene dine slik jeg selv vil. En måte å gå rundt problemet akkurat i denne problemstillingen, vil være å være sikker på at get-variabelen din ikke inneholder annen tekst enn du har forventet. Jeg foreslår dermed at du caster teksten til en tallverdi. Dette betyr at teksten som castes, blir en annen datatype som ikke kan inneholde annet enn tall.

Kode

if($_GET['delete'] == "1") { 
   $picid = (int)$_GET['id'];
...
}
Trådstarter
Takk, det funka flott! Jeg har bare ett siste spørsmål. Jeg bruker ?side=sidenjegvilvise og inkluderer sidene i en div (content), for layout sin skyld, og når jeg går på siden for å slette bilder, blir denne inkludert som den skal i diven. Når jeg da trykker på "slett", blir ikke resultatet inkludert i diven, da vises bare slettesiden. Dette kommer selvsagt av <a href="loginandadmin/galdel.php?delete=1&id=<?php echo $picid ?>">Slett</a> - den åpner loginandadmin/galdel.php. Dermed får jeg jo et problem neste gang jeg trykker på en sletteknapp, med mindre jeg trykker tilbake først! Kan dette unngås enkelt? F.eks. noe slikt som $_SERVER['PHP_CURRENT']?delete=1&id=...?

Edit: ahh, fikk det faktisk til selv for en gangs skyld^^ bytta ut ?delete med &delete, så jeg kunne bruke ?sidenjegvilvise i linken!
Sist endret av cromoglic; 22. mars 2009 kl. 04:40. Grunn: Automatisk sammenslåing med etterfølgende innlegg.