[PHP/SQL] delete uit database via php

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zit met het volgende:
Ik heb een pagina die de inhoud van mijn database weergeeft. In de laatste tabel staat een link als je daarop klikt zou je de regel uit de database moeten kunnen verwijderen. Maar wanneer ik op die link klik krijg ik een waarschuwing dat het niet verwijderd is.

Dit is mijn code die de query uitvoert:
code:
1
2
3
4
5
6
7
8
9
10
11
<?php
$id= $_GET['id']; 
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("voorraad", $con);
mysql_query('delete * FROM producten WHERE artnr="$id"') or die ("FOUT");
?>

Dit is het stukje code dat d.m.v GET een id meegeeft:
code:
1
echo "<td>" . "<a href='verwijder.php?id=" . $row['artnr'] . "'>verwijder</a>" . "</td>";


Wanneer ik mijn GET echo dan krijg ik het juiste artikelnummer te zien dat verwijderd moet worden.

Is er iets fout met de query die ik laat uitvoeren?

BVD Denniske

Acties:
  • 0 Henk 'm!

  • J3roen
  • Registratie: Januari 2000
  • Niet online

J3roen

Intentionally left blank

je moet $_GET['id'] gebruik ipv. $id.

Dus:
mysql_query('delete * FROM producten WHERE artnr="{$_GET['id']}"') or die ("FOUT");

Of het verstandig is, is een tweede :)

Acties:
  • 0 Henk 'm!

  • Facer
  • Registratie: Januari 2002
  • Niet online

Facer

Ken net.....

mysql_query('delete * FROM producten WHERE artnr="$id"') or die ("FOUT");
Probeer eens
PHP:
1
echo 'delete * FROM producten WHERE artnr="$id"'


De output is dan denk:
delete * FROM producten WHERE artnr="$id"

Oplossing:
PHP:
1
mysql_query('delete * FROM producten WHERE artnr='.$id) or die ("FOUT");


En controleer of $id een integer is ivm SQL injectie

[ Voor 13% gewijzigd door Facer op 09-12-2008 18:35 . Reden: SQL injectie toegevoegd ]


Acties:
  • 0 Henk 'm!

  • Aloys
  • Registratie: Juni 2005
  • Niet online
Maak er eerst eens DELETE FROM (zonder sterretje) van en haal dan de variabele buiten de aanhalingstekens. Wat ook nog wel slim is om te doen is intval() erom heen te zetten...Weet je zeker dat er geen troep in je query komt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wanneer ik jullie oplossingen probeer, dan krijg ik een lege pagina met FOUT te zien, dus is de query niet geslaagd.
wanneer ik de query echo krijg ik :
code:
1
delete * FROM producten WHERE artnr="$id"FOUT

Dus wordt mijn GET niet goed uitgelezen.

Acties:
  • 0 Henk 'm!

Verwijderd

Aan de andere reacties heb je niet zoveel. De fout zit hem erin dat je enkele quotes (') hebt gebruikt voor die query string, en niet dubbele quotes ("). Er worden dus geen variabelen vervangen door hun waarde.

Acties:
  • 0 Henk 'm!

  • DeluxZ
  • Registratie: Augustus 2003
  • Laatst online: 09-09 09:10

DeluxZ

Livin' the good life

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$id= $_GET['id']; 
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("voorraad", $con);
mysql_query("DELETE FROM producten WHERE artnr = ' " . $id . " ' ") or die(mysql_error());

?>


Zet er eens or die(mysql_error()) achter dan weet je wat php voor fout geeft. FOUT is natuurlijk niet echt handig :)

]|[ Apple Macbook Pro Retina 13" ]|[


Acties:
  • 0 Henk 'm!

Verwijderd

DeluxZ schreef op dinsdag 09 december 2008 @ 18:50:

Zet er eens or die(mysql_error()) achter dan weet je wat php voor fout geeft. FOUT is natuurlijk niet echt handig :)
Er is niks mis met zijn query, behalve dan dat er geen rijen worden verwijderd omdat er geen is met id '$id'.
Los daarvan zou ik eerder aanraden een fatsoenlijk framework te gebruiken zodat de TS niet hoeft te struikelen over basisdingetjes die iedereen weleens een keer fout doet.

Acties:
  • 0 Henk 'm!

  • DeluxZ
  • Registratie: Augustus 2003
  • Laatst online: 09-09 09:10

DeluxZ

Livin' the good life

Een van die basis dingen is dat je met mysql_error er meer informatie uit kan halen. Waarschijnlijk geeft hij dan een duidelijkere fout terug dan alleen FOUT, waar je natuurlijk, onbeschofd gezegd, geen zak aan hebt als je aan het ontwikkelen bent.

]|[ Apple Macbook Pro Retina 13" ]|[


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
DeluxZ schreef op dinsdag 09 december 2008 @ 18:50:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$id= $_GET['id']; 
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("voorraad", $con);
mysql_query("DELETE FROM producten WHERE artnr = ' " . $id . " ' ") or die(mysql_error());

?>


Zet er eens or die(mysql_error()) achter dan weet je wat php voor fout geeft. FOUT is natuurlijk niet echt handig :)
Wanneer ik deze query laat uitvoeren krijg ik een blanco witte pagina en er is niets uit mijn database verwijderd.
wanneer ik $id echo krijg ik het getal 1. Dit is het artikelnummer dat ik aanklikte

[ Voor 6% gewijzigd door Verwijderd op 09-12-2008 18:56 ]


Acties:
  • 0 Henk 'm!

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 09-09 17:18
Verwijderd schreef op dinsdag 09 december 2008 @ 18:44:
Wanneer ik jullie oplossingen probeer, dan krijg ik een lege pagina met FOUT te zien, dus is de query niet geslaagd.
wanneer ik de query echo krijg ik :
code:
1
delete * FROM producten WHERE artnr="$id"FOUT

Dus wordt mijn GET niet goed uitgelezen.
DELETE * FROM is sowieso niet goed (zover ik weet.). Dit moet gewoon DELETE FROM zijn. Je kan namelijk niet specifieke colommen verwijderen, enkel rijen. Wil je colommen verwijderen, gebruik dan een UPDATE statement
Verwijderd schreef op dinsdag 09 december 2008 @ 18:54:
[...]


Wanneer ik deze query laat uitvoeren krijg ik een blanco witte pagina en er is niets uit mijn database verwijderd.
wanneer ik $id echo krijg ik het getal 1. Dit is het artikelnummer dat ik aanklikte
Als je artnr veld van het type integer is, kan je de quotes weglaten.
code:
1
2
mysql_select_db("voorraad", $con);
mysql_query("delete FROM producten WHERE artnr=$id" ) or die ("FOUT");

[ Voor 30% gewijzigd door mrFoce op 09-12-2008 18:59 ]


Acties:
  • 0 Henk 'm!

Verwijderd

mrFoce schreef op dinsdag 09 december 2008 @ 18:55:

DELETE * FROM is sowieso niet goed (zover ik weet.).
Klopt helemaal, daar heb ik dan weer overheen gekeken, en daar zou inderdaad een iets zinvollere error uit volgen. Neemt niet weg dat het ongelofelijk lomp blijft om vanaf scratch nog iets te willen programmeren. Kijk, vroegâh waren er geen bruikbare frameworks, tegenwoordig is dat wel anders. Toch blijven mensen met "my first php script" tutorials klooien.

Acties:
  • 0 Henk 'm!

Verwijderd

Ik zou ook de input nog even checken voordat je die query uitvoerd. Anders heb je kans op SQL-Injection


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

$id = isset($_GET['id']) && is_numeric($_GET['id']) ? $_GET['id'] : false; 

if($id)
{
    $con = mysql_connect("localhost","root","") or die(mysql_error());
    mysql_select_db("voorraad", $con) or die(mysql_error());
    mysql_query("DELETE FROM producten WHERE artnr = '".$id."'") or die(mysql_error());

    if(mysql_affected_rows())
    {
        echo 'row deleted';
    }
    else
    {
        echo 'niet gedelete, kon de row met het id: '.$id.' niet vinden';
    }
}
else
{
    die("hack attempt");
}

?>

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bedankt allemaal het werkt, het lag aan de quotes.

Acties:
  • 0 Henk 'm!

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 09-09 17:18
Verwijderd schreef op dinsdag 09 december 2008 @ 19:03:
Ik zou ook de input nog even checken voordat je die query uitvoerd. Anders heb je kans op SQL-Injection


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

$id = isset($_GET['id']) && is_numeric($_GET['id']) ? $_GET['id'] : false; 

if($id)
{
    $con = mysql_connect("localhost","root","") or die(mysql_error());
    mysql_select_db("voorraad", $con) or die(mysql_error());
    mysql_query("DELETE FROM producten WHERE artnr = '".$id."'") or die(mysql_error());

    if(mysql_affected_rows())
    {
        echo 'row deleted';
    }
    else
    {
        echo 'niet gedelete, kon de row met het id: '.$id.' niet vinden';
    }
}
else
{
    die("hack attempt");
}

?>
Dat sowieso, maar dat is verder aan de TS :) Ik zou btw geen ' zetten om integers. Dat is niet nodig en kan problemen geven.

Acties:
  • 0 Henk 'm!

  • DeluxZ
  • Registratie: Augustus 2003
  • Laatst online: 09-09 09:10

DeluxZ

Livin' the good life

Verwijderd schreef op dinsdag 09 december 2008 @ 18:59:
[...]

Klopt helemaal, daar heb ik dan weer overheen gekeken, en daar zou inderdaad een iets zinvollere error uit volgen. Neemt niet weg dat het ongelofelijk lomp blijft om vanaf scratch nog iets te willen programmeren. Kijk, vroegâh waren er geen bruikbare frameworks, tegenwoordig is dat wel anders. Toch blijven mensen met "my first php script" tutorials klooien.
Welk framework zou je aanraden aan iemand die net update/insert/delete queries kan uitvoeren met behulp van tutorials. Ik heb wel frameworks gezien waar je niet echt blij van wordt als je net met php begint.

]|[ Apple Macbook Pro Retina 13" ]|[


Acties:
  • 0 Henk 'm!

  • Erikie
  • Registratie: September 2000
  • Laatst online: 14:16

Erikie

www.erikie.nl

gewoon niet met een framework aan de slag gaan als je net begint met php. Zorg eerst dat je php , mvc model en het oop gedeelte onder de knie hebt. (dat duurde bij mij een jaar btw :P )

kijk dan vervolgens naar het zend framework (1.7 :9 ).

traktor scratch!


Acties:
  • 0 Henk 'm!

  • DeluxZ
  • Registratie: Augustus 2003
  • Laatst online: 09-09 09:10

DeluxZ

Livin' the good life

Ik raad ook niemand aan om met een framework te beginnen. Ik ben zelf redelijk bekend met PHP (het meeste lukt me wel) maar soms zijn er frameworks waarvan de documentatie ook zo slecht is dat ik er ook niet uitkom zonder uren te klooien. Ook frameworks met goede documentatie zijn niet altijd even gemakkelijk te begrijpen.

]|[ Apple Macbook Pro Retina 13" ]|[


Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

als je in het vervolg nu zo werkt:

PHP:
1
2
3
$query = "SELECT * FROM blabla WHERE yada=$foobar";

mysql_query( $query );


en als het dan niet werkt even dit doet:

PHP:
1
2
3
4
5
$query = "SELECT * FROM blabla WHERE yada=$foobar";

echo $query;

mysql_query( $query );


dan had je kunnen lezen dat je query niet klopte. plus zoals geopperd kijk eens naar mysql_error();

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

Verwijderd schreef op dinsdag 09 december 2008 @ 18:52:
[...]Los daarvan zou ik eerder aanraden een fatsoenlijk framework te gebruiken zodat de TS niet hoeft te struikelen over basisdingetjes die iedereen weleens een keer fout doet.
Over php frameworks heb ik hetzelfde gevoel als met de bekende javascript libraries: ja ze zijn enorm handig en tijdsbesparend, maar leer alsjeblief eerst op de normale manier met php/javascript werken, anders heb je geen flauw benul waar je mee bezigbent en zal je nooit optimaal code leren schrijven ;)
*edit* zoals mensen boven mij zeggen dus :)

[ Voor 3% gewijzigd door boe2 op 10-12-2008 01:40 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 11-09 22:10

krvabo

MATERIALISE!

iH8 schreef op dinsdag 09 december 2008 @ 23:50:
als je in het vervolg nu zo werkt:

PHP:
1
2
3
$query = "SELECT * FROM blabla WHERE yada=$foobar";

mysql_query( $query );
En als jij hem dan niet aanleert om variabelen in strings te zetten.. :P
Variabelen in een string is ranzig, onduidelijk en traag ;)

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

krvabo schreef op woensdag 10 december 2008 @ 01:52:
[...]

En als jij hem dan niet aanleert om variabelen in strings te zetten.. :P
Variabelen in een string is ranzig, onduidelijk en traag ;)
ok, ok... het ging mij erom dat ie z'n query had kunnen echoën en dan had ie meteen gezien wat er mis was. maar idd.

Aunt bunny is coming to get me!


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Intentionally left blank


  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 07:19
Nog een kleine opmerking:

Ik zou de de TS willen aanraden om voor het verwijderen van die rijen geen $_GET te gebruiken, maar $_POST. In de eerste plaats is POST simpelweg wel voor dit soort acties bedoeld en GET niet. In de tweede plaats kan het gebruik van GET problemen geven. Als je een browser gebruikt met prefetching dan kijkt zo'n browser bij alle links op een pagina alvast wat erachter zit, zodat wanneer je die aanklikt de pagina gelijk geladen kan worden. Hierbij wordt een POST nooit gevolgd en een GET soms wel. Stel dat je browser al die links met ?action=delete&id=1
?action=delete&id=2
etc

Gaat prefetchen is zonder je wil een stuk van je database vernietigd.

Daarom: gebruik POST, want dat is hier simpelweg voor bedoeld.
Pagina: 1