[PHP/MySql] fout in syntax

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ruler-Nrg
  • Registratie: Oktober 2006
  • Laatst online: 16-09 11:50
Ik heb een webserver, hierop wil ik dermate van een formulier dingen op een sql server zetten.
het posten van de data gaat prima. Echt wil ik ook een verwijder pagina maken, Met de mogelijkheid om records te verwijderen. Dit doe ik door de id_aanvraag tabel het betreffende id te verwijderen.

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
<?php

// verbinding met database invoegen
include("db_connect.php");

// controleren of pagina zichzelf heeft aangeroepen
// via hidden-field uit het formulier
if (isset($_POST["bevestiging"])){
    $query="DELETE FROM lidy WHERE id_aanvraag=" .$_POST["id_aanvraag"];
    $result =  mysql_query($query) or die (mysql_error());
    echo("De volgende opdracht is uitgevoerd: <b>$query</b><br>\n");
    if ($result){
        echo ("Record nummer " .$_POST["id_aanvraag"] . " is verwijderd<br>\n");
        echo ("<a href=\"overzicht.php\">Terug naar het overzicht</a>");
    }
}else{
    // pagina heeft zichzelf nog niet aangeroepen, 
    // eerst om bevestiging vragen

   $query="SELECT * FROM lidy WHERE id_aanvraag=" .$_GET["id_aanvraag"];
   $result = mysql_query($query) or die (mysql_error());

    //$query = "SELECT * FROM lidy";
    //$result = mysql_query($query) or die(mysql_error());
?>
<html>
<head>
    <title>Verwijderen: weet u het zeker?</title>
</head>
<body>
<h2>Let op: wilt u deze gegevens verwijderen?</h2>
<?php
while ($rij = mysql_fetch_array($result)){
    echo("ID = " . $rij['id_aanvraag'] . "<br>\n");
    echo("Naam = ". $rij['voornaam'] . " " . $rij['achternaam'] . "<br>\n");
    echo("Kamer = ". $rij['kamer'] . "<br>\n");
    echo("Toestel = ". $rij['toestel']  . "<br><hr>\n");
}?>
<form action="<?php echo($_SERVER["PHP_SELF"]);?>" method="post">
    <input type="hidden" name="bevestiging" value="1">
    <input type="hidden" name="id_aanvraag" value="<?php echo($_GET["id_aanvraag"]);?>">
    <input type="Submit" value="Ja, verwijderen">
    <input type="Button" value="Nee, terug" onclick="javascript:history.back();">
</form>
<?php

}
?>
</body>
</html>


Het probleem is dat ik krijg: Alles gaat prima, Er is een connectie met de database (dit is mijn automelding)
Notice: Undefined index: id_aanvraag in C:\Users\Gijs de Vroom\Downloads\Webserver\Root\verwijder.php on line 20
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

wat mis ik? of hoe los ik het op?

Dell Precision, T9550, 8gb, 64GB ssd, 1920x1200RGB led.


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:47

TeeDee

CQB 241

Print je SQL query eens op het scherm en plaats die eens hier?

verder moet je ook niet raar opkijken, als je dit in productie zet, dat je hele db leeg gegooid is.SQL injection e.d.

[ Voor 52% gewijzigd door TeeDee op 23-04-2007 11:04 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

De foutmelding lijkt me redelijk duidelijk. Verder had je natuurlijk zelf ook nog even de query af kunnen drukken om te zien wat daar fout aan was (een simpele 'echo $query;' ertussen zetten). Dan had je namelijk gezien dat $_GET["id_aanvraag"] niet bestaat of niet is geset (wat ook keurig uit de eerste warning op te maken is).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • R4NCOR
  • Registratie: December 2000
  • Laatst online: 16-09 12:26

R4NCOR

eigenlijk gewoon Niels

$_GET['id_aanvraag'] is waarschijnlijk leeg, waardoor je een query krijgt die niet valid is.

Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Wat je nu doet is levensgevaarlijk. Iedereen kan nu willekeurige queries op jouw database uitvoeren omdat je de input van je $_GET variabelen niet test/controleerd.

Wat je eigenlijk zou moeten doen:
-controleer of er een waarde is voor id_aanvraag (hint: isset() )
-eventuele schadelijke tekens/code uit de string id_aanvraag halen
-daarna pas ga je eventueel iets doen met je database.

Acties:
  • 0 Henk 'm!

  • maxtz0r
  • Registratie: Februari 2007
  • Laatst online: 17-12-2022
edit:

hmmz nevermind:P

[ Voor 87% gewijzigd door maxtz0r op 23-04-2007 11:05 ]

Dying is God's way of telling you, you've been FIRED.


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dit is geen syntax fout. Je krijgt een notice dat een variabele niet geset is. En als gevolg daarvan staat ontbreekt er pas iets aan de query. Fouten gewoon van boven naar beneden oplossen. :)

Verder moet je letten op slq injection en kijken naar functies als mysql_real_escape_string in de documentatie.

edit:
goh, gezellig druk hier. :P

[ Voor 6% gewijzigd door Voutloos op 23-04-2007 11:06 ]

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

$query="SELECT * FROM lidy WHERE id_aanvraag=" .$_GET["id_aanvraag"]; (line 20)

wordt

$query="SELECT * FROM lidy WHERE id_aanvraag=" .$_POST["id_aanvraag"];

Edit: een paar tips

if (isset($_POST["bevestiging"])){

gebruik if($_SERVER['REQUEST_METHOD'] == "POST") om te controleren of een form gesubmit is.

Valideer je GET variablen, ik neem aan dat id_aanvraag numeriek is dus dat kan je prima doen met if(isset($_GET[' id_aanvrag) && is_numeric($_GET['id_aanvraag']){ en dan je code.

Kijk maar eens wat er gebeurt als jij "paginanaam.php?id_aanvraag=rdgrdgj" in je browser tikt. En als dat mogelijk is, is SQL injection ook mogelijk.

Misschien is het ook handig om te kijken of het record uberhaubt wel bestaat, als jij nu "pagina.php?id_aanvraag=548583458" intikt krijg je waarschijnlijk een witte gebugde pagina. Controleer daarom of de rows bestaan met: if(mysql_num_rows($result) > 0){ en dan je code.

[ Voor 74% gewijzigd door Verwijderd op 23-04-2007 11:18 ]


Acties:
  • 0 Henk 'm!

  • sky-
  • Registratie: November 2005
  • Niet online

sky-

qn nna 👌

En dan natuurlijk wel even kijken of $_POST['id_aanvraag'] een INT is. Zoniet, de query niet uitvoeren.

don't be afraid of machines, be afraid of the people who build and train them.


Acties:
  • 0 Henk 'm!

  • Alex Picard
  • Registratie: November 2005
  • Laatst online: 04-09 11:25
Je kan natuurlijk ook $_REQUEST gebruiken, dan maakt het niet meer uit of de variabele nou ge-POST is, of ge-GET.

Verder: Waak voor sql-injection, zoals bovenstaande posters al terecht voor waarschuwden.

Edit: Je kan ook $id = 0 + $_REQUEST['aanvraag_id'] doen, om er zeker van te zijn dat het een int is.

[ Voor 20% gewijzigd door Alex Picard op 23-04-2007 11:17 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
^ en als iets toch sowieso een int moet zijn (je hebt immers geen quotes in de query), cast het dan ook gewoon naar een int, of pas dus gewoon consistent escaping toe.
Alex Picard schreef op maandag 23 april 2007 @ 11:16:
Je kan natuurlijk ook $_REQUEST gebruiken, dan maakt het niet meer uit of de variabele nou ge-POST is, of ge-GET.
$_REQUEST is voor mensen die niet willen nadenken. :P Er zit een duidelijk verschil tussen GET en POST en wanneer je welke methode gebruikt (idempotent zijn van de actie), dus wees dan ook gewoon duidelijk in de code. :)
$_REQUEST moet je alleen gebruiken in echt algemene stukken code, als je al specifiek een bepaalde actie doet, weet je gewoon hoe de input voor die actie is.
Edit: Je kan ook $id = 0 + $_REQUEST['aanvraag_id'] doen, om er zeker van te zijn dat het een int is.
Doe dan gewoon een echte cast. Ten eerste is voor de lezer gewoon duidelijker wat je doel is, ten tweede loop je niet de kans dat een collega met opruimwoede de 'triviale berekening' weghaalt. :+

[ Voor 80% gewijzigd door Voutloos op 23-04-2007 11:21 ]

{signature}


Acties:
  • 0 Henk 'm!

  • Alex Picard
  • Registratie: November 2005
  • Laatst online: 04-09 11:25
@Voutloos: I stand corrected: Echte cast is inderdaad beter, en get/post bebruiken geeft inderdaad meer code readability in bepaalde gevallen.

Acties:
  • 0 Henk 'm!

Verwijderd

Probleem is hierboven al opgelost geloof ik, maar vergeet niet mysql_escape_string() te gebruiken op elke variabele die je gebruikt in je mysql query! Als nu iemand als id_aanvraag "blaat; DROP TABLE lidy;" invult bijvoorbeeld, is je hele table weg.

Acties:
  • 0 Henk 'm!

  • Alex Picard
  • Registratie: November 2005
  • Laatst online: 04-09 11:25
Verwijderd schreef op maandag 23 april 2007 @ 13:27:
Probleem is hierboven al opgelost geloof ik, maar vergeet niet mysql_escape_string() te gebruiken op elke variabele die je gebruikt in je mysql query! Als nu iemand als id_aanvraag "blaat; DROP TABLE lidy;" invult bijvoorbeeld, is je hele table weg.
Dat heet SQL injection, en er is al door meerdere mensen voor gewaarschuwd, maar it's the thought that counts d:)b
Pagina: 1