Variabelen probleem
1. overzicht.php
<html>
<head>
<link rel='stylesheet' href='../zon.css'>
<title>Overzicht</title>
</head>
<body>
<center><h3>Overzicht artikelen Diabetes Hulmiddelen Service</h3>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?
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>";
}
?>
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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());
?>
// 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>
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
while (list($id, $artikel, $eenheden ) =
mysql_fetch_row($result)){
echo ("Artikel Id: $id<br>
Artikel: $artikel<br>
Eenheden: $eenheden<br>
<hr>");
}
?>
while (list($id, $artikel, $eenheden ) =
mysql_fetch_row($result)){
echo ("Artikel Id: $id<br>
Artikel: $artikel<br>
Eenheden: $eenheden<br>
<hr>");
}
?>
<form action="" method="post"
<input type="hidden" name="bevestiging" value="1">
<input type="hidden" name="artikel" value="">
<input type="Submit" value="Ja, verwijderen">
<input type="Button" value="Nee, terug"
onclick="javascript:history.back();">
</form>
</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.
Als je een goede where conditie hebt in je delete query kan het heel kort:
DELETE FROM tabelnaam
WHERE voorwaarde
Gewijzigd op 23/02/2006 23:33:00 door Jan Koehoorn
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.
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 :(
Welke $artikel heb jij het over?
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 ;-)
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.
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.