Ik wil items uit de databse verwijderen. Ik gebruik daarvoor 2 bestanden.

1. overzicht.php

<?
session_start();
if(!$_SESSION['Login'])
die("Je moet eerst ingelogd zijn...");
?>
<html>

<head>

<link rel='stylesheet' href='../zon.css'>

<title>Overzicht</title>

</head>

<body>

<center><h3>Overzicht artikelen Diabetes Hulmiddelen Service</h3>

<?

if(!@include"connect.php")
die("connect.php niet gevonden");



$sql = "SELECT * FROM dhs";

$res = mysql_query($sql) or die("Er is iets fout gegegaan:<br><br>" . mysql_error());

if(mysql_num_rows($res)){

echo"<table cellpadding='2' cellspacing='1' bgcolor='#FFFFFF'>";

$tr = 1;

while($rij = mysql_fetch_assoc($res))
{

if($tr)
echo"<tr>";

echo"
<table border='2' id='1' bordercolor='0000FF' cellspacing='1' bgcolor='#FFFFFF' cellpadding='5' width='100%'>
<tr>
<td valign='top'>
<table id='2' width='100%'>
<tr>
<th width='5%' align=\"left\">Id</th><th width='30%' align=\"left\">Artikel</th><th width='30%' align=\"left\">Eenheden</th><th width='35%' align=\"left\">Actie</th>
<tr>
<td><div align=\"left\"><font size=\"2\">" . $rij['id'] . "</font></div></td>
<td><div align=\"left\"><font size=\"2\">" . $rij['artikel'] . "</font></div></td>
<td><div align=\"left\"><font size=\"2\">" . $rij['eenheden'] . "</font></div></td>
<td><div align=\"left\"><font color=\"#000000\" size=\"1\"><a href='bewerken.php?id=" . $rij['id'] . "'>Bewerken</a> - <a href='verwijder.php?id=" . $rij['id'] . "'>Verwijderen</a> - <a href='toevoegen.php?id=" . $rij['id'] . "'>Toevoegen</a></font></div></td></tr>
</table>
</td>
</tr>
</table>
</td>
";


if(!$tr)
echo"<td></td>";

echo"</table><br><br>";

}

}else{

echo"Geen artikelen gevonden...<br><br>";

}
?>

</body>

</html>

Dit werkt volgens mij goed, behalve opmaak maar die vraag heb ik in een andere topic al gezet. Nu wil ik een artikel verwijderen en heb daarvoor in de database een kolom id aangemaakt met de volgende instellingen: 'id' int not null auto_increment primary key
Als ik iets toevoeg gaat dit goed. Echter nu wil ik een record verwijderen mbv verwijder.php

<?PHP

// verbinding database
include("connect.php");

// controleren of pagina zich zelf heeft aangeroepen
if (isset($_POST["bevestiging"])){
$query="DELETE FROM dhs WHERE id='" .$_POST["artikel"] ."'";
$result=mysql_query($query) or die ("FOUT: " . mysql_error());
echo("De volgende opdracht is uitgevoerd: <b>$query</b>\n");
if ($result){
echo ("Artikel " .$_POST["artikel"] . " is verwijderd<br>\n");
echo ("<a href=\"overzicht.php\">Terug naar artikel overzicht </a>");
}
}else{
// pagina niet zich zelf aangeroepen, nu bevestiging vragen
$query = "SELECT * FROM dhs WHERE id='" .$_GET["id"]."'";
$result = mysql_query($query) or die ("FOUT: " . mysql_error());
?>


<html>
<head>
<title>Verwijderen: weet u het zeker?</title>
</head>
<body>
<h2>Let op: wilt u deze gegevens verwijderen?</h2>



<?php
while (list($id, $artikel, $eenheden ) =
mysql_fetch_row($result)){
echo ("Artikel Id: $id<br>
Artikel: $artikel<br>
Eenheden: $eenheden<br>
<hr>");
}
?>


<form action="<?php echo($_SERVER["PHP_SELF"]);?>" method="post"
<input type="hidden" name="bevestiging" value="1">
<input type="hidden" name="artikel" value="<?php echo($_GET["id"]);?>">
<input type="Submit" value="Ja, verwijderen">
<input type="Button" value="Nee, terug"
onclick="javascript:history.back();">
</form>


<?php
//else-blok correct afsluiten
}
?>

</body>
</html>

Ik krijg dan de volgende output op mijn scherm:
De volgende opdracht is uitgevoerd: DELETE FROM dhs WHERE id='3' Artikel 3 is verwijderd
Terug naar artikel overzicht

Het lijkt alsof alles goed gaat maar de variabele $artikel heeft de waarde van die $id zou moeten hebben. Als ik in verwijder.php $artikel vervang door $id gaat het helemaal fout.

Als ik kijk is er ook niks verwijderd. Het lijkt wel alsof ik vanuit overzicht.php de variabelen verkeerd vul.

Ik hoop dat iemand ziet waar ik de mist in ga. Alvast bedankt.
Items uit je database verwijderen met zo'n lang script?
Als je een goede where conditie hebt in je delete query kan het heel kort:

DELETE FROM tabelnaam
WHERE voorwaarde
Ja maar als ik het goed heb gelezen en begrepen heb ik met verwijder.php enkele zekerheden in gebouwd. Maar ik ben een newbie en kom van mars.
Je kunt $artikel niet zomaar veranderen naar $id als je in het formulier 'artikel' als naam gebruikt.

Ik vind het verder trouwens geen bijzonder lang script, je handelt het juist allemaal netjes af.
Het lijkt alsof vanuit overzicht.php de $artikel wordt gevuld met de waarde van veld id. Ik zie echter niet waar het fout gaat. Ik heb de hele avond zal zitten zoeken op een foutje dat ik eerst bevesting met een kleine letter had en onder in het script met een hoofdletter, dan werkt het dus ook niet :(
Je gebruikt $artikel toch niet, je gebruikt $_POST['artikel']

Welke $artikel heb jij het over?
In je input-velden van verwijder.php gebruik je een veld met naam "artikel". Mijns inziens zou de naam "id" moeten zijn.

Als je server (nog) register globals ondersteunt, zou je een potentieel probleem kunnen hebben, $_GET['artikel'] ook wordt geregistreerd als $artikel, en in je code $artikel een ander datatype moet voorstellen.

Overigens moet je bij dit script heel erg uitkijken voor MySQL injection. Als ik de url van je verwijder.php zou weten, kan ik als id de volgende waarde opgeven:

' or id <> '

en weg is je data ;-)

De server waarop dit script draait ondersteunt register globals, hie rkwam ik achter toen ik opeen sporblemen met login sessie. Toen bleek dat bij een herinstallatie van de server dit was uitgeschakeld. En nadat de ondersteuning weer was ingeschakeld had ik geen sessie probleem meer.
Eerlijk gezegd snap ik je opmerking omtrent "artikel" en $GET_['artikel'] niet en ook niet de MySQL injection, ik dacht dat ik veilig bezig was volgens het boek van Peter Kassenaar. Ik zal het straks weer eens goed gaan bekijken misschien zien mijn ogen dan beter wat er aan de hand is.
Ik heb het boek van Kassenaar (gelukkig) niet, maar ik begrijp dat hij met betrekking tot sessies uitlegt dat je session_register moet gebruiken en dat hij het een bug van PHP vindt dat je een foutmelding krijgt als register globals aan staat.

Het klinkt misschien arrogant, maar als zo iemand over beveiliging praat, neem ik hem niet serieus.

De register_globals zorgt ervoor dat alle parameters die via $_GET/$_POST/$_SESSION beschikbaar zijn, ook worden geregistreerd als "normale" variabelen. In dit geval bijvoorbeeld is $_GET['artikel'] ook te gebruiken als $artikel.

Dit is een potentieel beveiligingsrisico, en daarom staat register_globals in PHP standaard al een hele tijd uit. Het bij-effect daarvan is dat session_register() daardoor ook niet meer werkt. In plaats daarvan moet je $_SESSION gebruiken voor je sessie-variabelen. Dat Kassenaar dit concept niet lijkt te begrijpen (of in ieder geval in zijn boeken beschrijft dat dit een bug zou zijn in PHP) vind ik dan ook niet positief.

Wat betreft MySQL injection: daarover kun je een vrij uitgebreide beschrijving vinden bij de tutorials op deze site.

Reageren