[PHP] UPDATE row

Pagina: 1
Acties:

Onderwerpen


  • Proxx
  • Registratie: Juni 2008
  • Laatst online: 29-05-2024
ik heb dus een database en een table met informatie en ik wil die aanpassen!
als ik in phpmyadmin onder sql query dit doe:
code:
1
UPDATE csv SET Voornaam='$vnaam',Tussenvoegsel='$tvoegsel',Achternaam='$anaam',Woonplaats='$wplaats',Afdeling='$adeling',Tel='$tel',Mobile='$gsm',Email='$mail',Geboortedatum='$gdatum',Website='$web',Muziek='$muz',Films='$mov',Hobbys='$hob',Motto='$mot',Quote='$quote' WHERE id='74'


wordt in de table csv id nummer 74 bijgewerkt met de juiste waardes. nu heb ik een php script en daar doet ie het niet. ik kijk er waarschijnlijk gigantisch over heen. maar ik begrijp het niet.

code:
1
2
3
    $sql = "UPDATE csv SET Voornaam='$vnaam',Tussenvoegsel='$tvoegsel',Achternaam='$anaam',Woonplaats='$wplaats',Afdeling='$adeling',Tel='$tel',Mobile='$gsm',Email='$mail',Geboortedatum='$gdatum',Website='$web',Muziek='$muz',Films='$mov',Hobbys='$hob',Motto='$mot',Quote='$quote' WHERE id='$id'";
    $result = mysql_query($sql) or die("Failed Query of " . $sql);
    echo "<p>Opgeslagen</p>";


ik zal anders ook maar ff eerlijk zeggen dat dit zowat mijn eerste eigen PHP script is :o

kan iemand mij een beetje op weg helpen ?

Proxx wijzigde deze reactie 31-07-2015 13:37 (1337%)


  • bindsa
  • Registratie: Juli 2009
  • Niet online
Sowieso mis ik de MySQL handler in de mysql_query functie, die werkt zo:
$result = mysql_query($query, $connection_handler);
En ik durf het bijna niet te vragen, maar heb je wel eerst contact gelegd met je database?
Er moet namelijk eerst contact worden gelegd met de MySQL server, met mysql_connect(); en mysql_select_database(); Van die functies krijg je een MySQL handler terug waarmee je vervolgens query's kan uitvoeren. Tot slot sluit je de verbinding af met mysql_close($handler);

[ Voor 29% gewijzigd door bindsa op 18-02-2010 17:34 . Reden: Uitbreiding ]


Verwijderd

Dit is niet veilig. Je moet nooit vertrouwen op wat gebruikers invoeren.
Maar wat gebeurd er niet? Slaat hij het niet op of krijg je een MySQL error? Want zo kunnen wel alleen maar gokken..

  • Jory
  • Registratie: Mei 2006
  • Laatst online: 19-09 09:16
@L0calh0st: Het tweede argument voor mysql_query() is optioneel. Wanneer je dat leeg laat, wordt gewoon de laatst gebruikte connectie gebruikt. (Bij een script waarvan je zeker weet dat je maar met één database praat, is dat dus helemaal geen probleem.)

Zoals MilanDrossaerts al zei, wat gebeurd er dan precies? Vervang de tweede regel eens door zoiets:
PHP:
2
$result = mysql_query($sql) or die("SQL Error:" . mysql_error() . "<br />in<br />" . $sql);

En vertel ons dan een precies wat er op je scherm komt te staan.

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op donderdag 18 februari 2010 @ 17:35:
Dit is niet veilig. Je moet nooit vertrouwen op wat gebruikers invoeren.
Maar wat gebeurd er niet? Slaat hij het niet op of krijg je een MySQL error? Want zo kunnen wel alleen maar gokken..
Gebruikersinvoer is allang afgehandeld, of TS moet nog op register globals vertrouwen.

Acties:
  • 0 Henk 'm!

  • Proxx
  • Registratie: Juni 2008
  • Laatst online: 29-05-2024
op het moment is er nog niks online dus ik heb er nog geen login systeem voor gemaakt. het is toch voor persoonlijk gebruik en puur voor de hobby ik wil gewoon eens frotten met php en mysql en kijken wat ik zelf allemaal al niet voor elkaar krijg door tutorials te volgen enzo. dit is tot nu toe nog allemaal heel goed gegaan met uitlezen en aanmaaken van een database tabel. maar nu liep ik vast.

iig bedankt voor al de reacties. (die afhandeling van foutmeldingen moet ik me eens wat beter in gaan verdiepen. is toch altijd handig om te zien wat er nu precies fout gaat.

ik ga het meteen proberen.

om mijn probleem wat duidelijker te maken. hij slaat mijn input niet op.

ik heb een aantal textboxen waar ik de waardes van wijzig klik vervolgens op de submit button en dan ververs ik de pagina of ik kijk in phpmyadmin maar daar zijn de waardes nog steeds het zelfde

EDIT: heb net die foutafhandeling van Jory gebruikt en nu geeft ie nog steeds geen foutmelding

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
if ($_POST['save'])
 {
      $vnaam=$_POST["vnaam"];
      $tvoegsel=$_POST["tvoegsel"];
      $anaam=$_POST["anaam"];
      $wplaats=$_POST["wplaats"];
      $adeling=$_POST["adeling"];
      $tel=$_POST["tel"];
      $gsm=$_POST["gsm"];
      $mail=$_POST["mail"];
      $gdatum=$_POST["gdatum"];
      $web=$_POST["web"];
      $muz=$_POST["muz"];
      $mov=$_POST["mov"];
      $hob=$_POST["hob"];
      $mot=$_POST["mot"];
      $quote=$_POST["quote"];
      $id=$_POST["id"];
    
    $sql = "UPDATE csv SET Voornaam='$vnaam',Tussenvoegsel='$tvoegsel',Achternaam='$anaam',Woonplaats='$wplaats',Afdeling='$adeling',Tel='$tel',Mobile='$gsm',Email='$mail',Geboortedatum='$gdatum',Website='$web',Muziek='$muz',Films='$mov',Hobbys='$hob',Motto='$mot',Quote='$quote' WHERE id='$id'";
    $result = mysql_query($sql) or die("SQL Error:" . mysql_error() . "<br />in<br />" . $sql); 
      /* $result = mysql_query($sql) or die("Failed Query of " . $sql); */
     echo "<p> $quote , $vnaam , $anaam , $adeling </p>";
     echo "<p>Opgeslagen</p>";
 }
else if ($_POST['del']) 
 {
    echo "<p>format C:</p>";
}

PHP:
1
2
     echo "<p> $quote , $vnaam , $anaam , $adeling </p>";
     echo "<p>Opgeslagen</p>";
deze 2 lijnen heb ik er in gezet om te zien of hij wel bij mijn script uit kwam als ik op submit druk. en of dat er ook echt iets in de vars staat. en dat is allemaal goed zo te zien.

waarschijnlijk zal het allemaal wel een beetje omslachtig zijn maar het is echt mijn eerste werk :o en info uit tutorials bij me kaar geraapt. als iemand tips over iets anders dan mijn probleem heeft hoor ik het ook graag ;)

[ Voor 69% gewijzigd door Proxx op 19-02-2010 09:08 ]

Proxx wijzigde deze reactie 31-07-2015 13:37 (1337%)


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
GlowMouse schreef op donderdag 18 februari 2010 @ 18:28:
[...]

Gebruikersinvoer is allang afgehandeld, of TS moet nog op register globals vertrouwen.
Iets met assumptions en fuckups :)
@Proxx: Lees je eens even in in SQL injection, want als ik naar bovenstaande code kijk heb je een flink probleem ;) Verder: Kijk vooral even of $id bevat wat je verwacht want enkel een record dat het juiste ID zal worden bijgewerkt (en überhaupt: je bent wel op de hoogte tussen het verschil INSERT en UPDATE? Just checking... Ik weet namelijk niet of je een record wil updaten of inserten). Ook zie ik dat je $id tussen quotes (2x ' dus) hebt staan; dat is alleen nodig bij strings, niet voor integers.

[ Voor 31% gewijzigd door RobIII op 19-02-2010 09:32 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Echo je query eens en prak hem via phpMyAdmin bijvoorbeeld eens je database in, dan zie je wellicht wel een foutmelding verschijnen. Heb je error_reporting en display_errors wel aan staan :?

Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Ik zie in je php script nergens dat een connectie met de database gemaakt wordt....doe je dit niet, of heb je dit uit je code gelaten?

Verder, geef de (relevante) inhoud van je tabel eens, en je update statement. Zoals RobIII al opmerkt, een update op een niet bestaande rij geeft geen foutmelding, maar ook geen update.

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

DB connect gebeurt zo, zit dit al in je code?

PHP:
1
2
3
4
5
$username="username";
$password="password";
$database="your_database";
mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");


Voor de veiligheid van user input kun je mysqlrealescapestring gebruiken om sql injection te voorkomen. http://php.net/manual/en/...ql-real-escape-string.php

Voor de reageerders: niet te moeilijk denken, TS meld zelf ook al dat de query in phpmyadmin wel gewoon draait.

[ Voor 36% gewijzigd door YakuzA op 19-02-2010 09:55 ]

Death smiles at us all, all a man can do is smile back.
PSN


Acties:
  • 0 Henk 'm!

  • Proxx
  • Registratie: Juni 2008
  • Laatst online: 29-05-2024
connect.php heb ik aangeroepen met include en ik kan gewoon de database uitlezen dus connectie is er wel.

die sql injections heb ik al over gelezen maar niks mee gedaan. omdat dit mijn eerste script is en gewoon wil kijken of ik een simpel adresboekje kan maken voor mijn eigen. als alles functie werken ga ik de beveiliging en alles nog een keer na lopen.

die '$id' zal ik even aanpassen. eerst stond het volgens mij wel zonder quotes maar heb die toegevoegd omdat ik dacht dat dat misschien de fout was :)

@cartman ik heb hem al via PHPmyadmin uitgevoerd en daar werkt het perfect :S

EDIT: nu krijg ik wel een melding na dat ik die quotes weg gehaald heb :D

code:
1
SQL Error: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


ik ga zelf ff proberen of ik het niet opgelost krijg

zo kom ik nog eens ergens

[ Voor 21% gewijzigd door Proxx op 19-02-2010 10:10 ]

Proxx wijzigde deze reactie 31-07-2015 13:37 (1337%)


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
mijn gok: $id is leeg. Mysql trekt het namelijk wel als je de volgende query gebruikt:
code:
1
UPDATE .....WHERE id='';

maar niet als je de quotes weghaalt:
code:
1
UPDATE .....WHERE id=;

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Print nou *(&^@$ gewoon de letterlijke query.

{signature}


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Csv is een reserved word in MySQL (net zoals bijvoorbeeld "select" dat is) en dus kun je die niet zomaar in je query gebruiken. Als je die tabelnaam toch wil gebruiken zul je er backticks (onder je escape-toets) omheen moeten zetten.

Overigens is die tabelnaam sowieso een slechte keuze want hij omschrijft de inhoud niet. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
NMe schreef op vrijdag 19 februari 2010 @ 10:30:
Csv is een reserved word in MySQL (net zoals bijvoorbeeld "select" dat is) en dus kun je die niet zomaar in je query gebruiken. Als je die tabelnaam toch wil gebruiken zul je er backticks (onder je escape-toets) omheen moeten zetten.
Dat is niet waar, csv is géén gereserveerd woord. Zie de handleiding. Verder zijn backticks ` geen oplossing, hooguit een pleister. Een betere naam zou een oplossing zijn, zorgt direct voor duidelijkheid.

De foutmelding gaat ook niet over een gereserveerd woord, dan had je een andere melding gekregen.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
cariolive23 schreef op vrijdag 19 februari 2010 @ 10:35:
Verder zijn backticks ` geen oplossing, hooguit een pleister. Een betere naam zou een oplossing zijn, zorgt direct voor duidelijkheid.
offtopic:
Los van het wel of niet gereserveerd zijn van csv; backticks (of voor andere DBMS-en andere tekens) zijn wel degelijk een oplossing. Soms kom je gewoon niet onder een gereserveerd woord uit. Van een date kun je nog wel eens een createdate of editdate maken of iets dergelijks maar soms is een date gewoon een date. En een user is soms gewoon een user. Een order is soms een order. Ik vertik het dan ook om allerlei vage andere alternatieven te gaan bedenken voor die termen, ondanks dat ze gereserveerd (kunnen) zijn (afhankelijk van het DBMS soms). Als je gewoon aanleert alle namen te escapen met backticks, blokhaken of whatever je DBMS graag wil hebben dan heb je er geen last van. Ik zie het dan ook als een best practice, en zeker niet als een 'pleister'.

Maar die discussie holy war is vaker gevoerd...

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Proxx
  • Registratie: Juni 2008
  • Laatst online: 29-05-2024
NMe schreef op vrijdag 19 februari 2010 @ 10:30:
Csv is een reserved word in MySQL (net zoals bijvoorbeeld "select" dat is) en dus kun je die niet zomaar in je query gebruiken. Als je die tabelnaam toch wil gebruiken zul je er backticks (onder je escape-toets) omheen moeten zetten.

Overigens is die tabelnaam sowieso een slechte keuze want hij omschrijft de inhoud niet. ;)
de tabel heeft alle data die ik uit een csv bestand geimporteerd heb. haha daarom is het csv :o

ik heb het probleem gevonden. nu ik het script na loop is het in eens heel duidelijk maar ook een heel domme fout.

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
<?php
if ($_POST['save'])
 {
      $vnaam=$_POST["vnaam"];
      $tvoegsel=$_POST["tvoegsel"];
      $anaam=$_POST["anaam"];
      $wplaats=$_POST["wplaats"];
      $adeling=$_POST["adeling"];
      $tel=$_POST["tel"];
      $gsm=$_POST["gsm"];
      $mail=$_POST["mail"];
      $gdatum=$_POST["gdatum"];
      $web=$_POST["web"];
      $muz=$_POST["muz"];
      $mov=$_POST["mov"];
      $hob=$_POST["hob"];
      $mot=$_POST["mot"];
      $quote=$_POST["quote"];

/*     ik heb helemaal geen textbox met een ID dus mijn var $id is gewoon leeg.
     $id=$_POST["id"]; */

      $id = $_GET["id"];
/* dit kan wel aangezien ik in de url toch op geef welk id bewerkt moet worden ( view.php?id=*&cmd=edit ) */
    
    $sql = "UPDATE csv SET Voornaam='$vnaam',Tussenvoegsel='$tvoegsel',Achternaam='$anaam',Woonplaats='$wplaats',Afdeling='$adeling',Tel='$tel',Mobile='$gsm',Email='$mail',Geboortedatum='$gdatum',Website='$web',Muziek='$muz',Films='$mov',Hobbys='$hob',Motto='$mot',Quote='$quote' WHERE id=$id";
    $result = mysql_query($sql) or die("SQL Error:" . mysql_error() . "<br />in<br />" . $sql); 
      /* $result = mysql_query($sql) or die("Failed Query of " . $sql); */
     echo "<p> $quote , $vnaam , $anaam , $adeling </p>";
     echo "<p>Opgeslagen</p>";
 }
else if ($_POST['del']) 
 {
    echo "<p>format C:</p>";
}
?>


ik heb geen ID form aangezien dit automatisch in de tabel gebeurt dus ik maakte een var aan die leeg was :X
KabouterSuper schreef op vrijdag 19 februari 2010 @ 10:18:
mijn gok: $id is leeg. Mysql trekt het namelijk wel als je de volgende query gebruikt:
code:
1
UPDATE .....WHERE id='';

maar niet als je de quotes weghaalt:
code:
1
UPDATE .....WHERE id=;
je zat wel heel erg in de buurt :D

BTW ik zal nu even gaan kijken naar die sql injections

[ Voor 14% gewijzigd door Proxx op 19-02-2010 10:57 ]

Proxx wijzigde deze reactie 31-07-2015 13:37 (1337%)


Acties:
  • 0 Henk 'm!

  • gvdh
  • Registratie: December 2009
  • Laatst online: 12:06
Met error_reporting op E_ALL zou je die fout direct gezien hebben. Dan krijg je een fout dat $_POST["id"] niet bestaat. Hiermee vermijd je veel stomme programmeerfouten.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Proxx schreef op vrijdag 19 februari 2010 @ 10:43:
ik heb geen ID form aangezien dit automatisch in de tabel gebeurt dus ik maakte een var aan die leeg was :X
RobIII schreef op vrijdag 19 februari 2010 @ 09:17:
[...]
Verder: Kijk vooral even of $id bevat wat je verwacht
Debuggen: Hoe doe ik dat?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Proxx
  • Registratie: Juni 2008
  • Laatst online: 29-05-2024
ik heb helemaal over jou $id reactie heen gelezen :o
van die sql injection en insert / update heb ik dan weer wel gelezen :X sorry

overdat debuggen. ik ga het de volgende keer eerst eens nalezen. maar debuggen is soms moeilijk als je de juist syntax / foutmeldingen niet bij elkaar weet te koppelen vandaar dat ik het toch maar gepost had.

[ Voor 22% gewijzigd door Proxx op 19-02-2010 11:35 ]

Proxx wijzigde deze reactie 31-07-2015 13:37 (1337%)


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

cariolive23 schreef op vrijdag 19 februari 2010 @ 10:35:
[...]

Verder zijn backticks ` geen oplossing, hooguit een pleister.
Succes met een tabel die gebruikers bevat die je Engelstalig in enkelvoud een naam hoort te geven, en dat zonder backticks. ;)
Een betere naam zou een oplossing zijn, zorgt direct voor duidelijkheid.
Dat ontken ik in dit geval ook niet. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1