[PHP / MYSQL] Query

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

onlangs ben ik bezig met een soort invulformulier met 6 velden, die naar een SQL database worden geschreven alleen zit ik vast bij het volgende deel; wat is hier fout aan? En owja, als het een domme fout is, ik ben net begonnen met scripten dusja :)

PHP:
1
2
3
4
$sql = mysql_query ("INSERT INTO `computers` (`cid`, `cuser`, `csnr`, `cmerk`, `cspec`, `cos`, `cad`) VALUES
('', '$_POST['naam']', '$_POST['serienummer']', '$_POST['merk']', '$_POST['spec']', '$_POST['os']', '$_POST['ad']');"

$result = $sql or die ("MySQL Fout: ". mysql_error());


heeft iemand enig idee?

[ Voor 6% gewijzigd door Verwijderd op 10-02-2010 09:16 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 12-09 10:03

Creepy

Tactical Espionage Splatterer

(jarig!)
Wat gaat er mis dan? Krijg je een foutmelding? Zo ja, welke? Heb je je query al eens naar het scherm afgedrukt? Dat je net bent begonnen is niet erg, dat hebben allemaal een keer moeten doen. Maar je dumpt nu alleen een vraagt en gaat zitten afwachten totdat je een oplossing krijgt zonder dat je aangeeft wat je zelf hebt geprobeerd .e.d.. En dat verwachten we hier wel van je. Dus kan je iets meer informatie geven over wat er precies mis gaat?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Fout 1: SQL injectie
Fout 2: een vergeten ); op regel 2
Fout 3: die "or die (...)" liever niet, of op regel 2

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nou okee, hij laat helemaal geen SQL error of iets dergelijks zien, dit krijg ik te zien

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in regel 2 van dat stukje hier boven,

zelf denk ik dat het aan die '$_POST['naam']' dingen ligt... dat er iets met dubbele quotes of enkele moet, zo iets? maar ik kom er echt niet uit hoe en wat?

- de eerste ( ' ' , is met opzet leeg gelaten omdat dat een auto_increment ID is, en deze is dus niet ingevuld door iemand.

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
- de eerste ( ' ' , is met opzet leeg gelaten omdat dat een auto_increment ID is
Laat de naam van deze kolom dan weg in je query en laat de onzin-value dan ook weg uit de query. Of gebruik de value DEFAULT om de default waarde te gebruiken:

SQL:
1
INSERT INTO tabel(kolom) VALUES (DEFAULT);

Normale databases zullen een lege string, '', niet toestaan voor een integer en belonen met een foutmelding.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 11-09 20:27

Matis

Rubber Rocket

Allereerst raad ik aan om je query in een string te zetten, zodat je hem kunt echoën voordat je hem aanroept, daarnaast zou ik ook nog wat aan de syntax doen, want op deze manier gaat het niet werken.
Als je wat deftiger zou programmeren dan zou je snel genoeg zien waar het fout gaat.
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
<?php 
$query = 
"INSERT INTO 
  `computers` 
    (`cid`, 
    `cuser`, 
    `csnr`, 
    `cmerk`, 
    `cspec`, 
    `cos`, 
    `cad`) 
  VALUES 
    ('',
    '$_POST['naam']', 
    '$_POST['serienummer']', 
    '$_POST['merk']', 
    '$_POST['spec']', 
    '$_POST['os']', 
    '$_POST['ad']');" 

$sql = mysql_query ($query

$result = $sql or die ("MySQL Fout: ". mysql_error()); 
?>

Ik heb dus niets verbeterd, alleen een extra variabele toegevoegd, maar ik hoop dat je nu zelf al ziet waar het fout gaat.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Matis schreef op woensdag 10 februari 2010 @ 09:39:
Allereerst raad ik aan om je query in een string te zetten, zodat je hem kunt echoën voordat je hem aanroept, daarnaast zou ik ook nog wat aan de syntax doen, want op deze manier gaat het niet werken.
Als je wat deftiger zou programmeren dan zou je snel genoeg zien waar het fout gaat.
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
<?php 
$query = 
"INSERT INTO 
  `computers` 
    (`cid`, 
    `cuser`, 
    `csnr`, 
    `cmerk`, 
    `cspec`, 
    `cos`, 
    `cad`) 
  VALUES 
    ('',
    '$_POST['naam']', 
    '$_POST['serienummer']', 
    '$_POST['merk']', 
    '$_POST['spec']', 
    '$_POST['os']', 
    '$_POST['ad']');" 

$sql = mysql_query ($query

$result = $sql or die ("MySQL Fout: ". mysql_error()); 
?>

Ik heb dus niets verbeterd, alleen een extra variabele toegevoegd, maar ik hoop dat je nu zelf al ziet waar het fout gaat.
Dan gaat hij fout op de regel

PHP:
1
 '$_POST['naam']',

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in

[ Voor 6% gewijzigd door Verwijderd op 10-02-2010 09:46 ]


Acties:
  • 0 Henk 'm!

  • dev10
  • Registratie: April 2005
  • Laatst online: 09-09 15:21
Begrijp je ook waarom hij daar fout gaat?

Overigens is dit redelijk makkelijk op te lossen door je in te lezen op SQL injectie, want ik hoop niet dat je dit zo op internet gaat zetten. Leesvoer: Wikipedia: SQL-injectie

Acties:
  • 0 Henk 'm!

  • Pin0
  • Registratie: November 2002
  • Niet online
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
<?php 
$query = 
"INSERT INTO 
  `computers` 
    (`cid`, 
    `cuser`, 
    `csnr`, 
    `cmerk`, 
    `cspec`, 
    `cos`, 
    `cad`) 
  VALUES 
    ('',
    '{$_POST['naam']}', 
    '{$_POST['serienummer']}', 
    '{$_POST['merk']}', 
    '{$_POST['spec']}', 
    '{$_POST['os']}', 
    '{$_POST['ad']}');" ;

$sql = mysql_query ($query);

$result = $sql or die ("MySQL Fout: ". mysql_error()); 
?>


Zoiets zou moeten werken, dus met {} ivm. de enkele quotes, maar let inderdaad op SQL Injectie want dat vang je zo niet af. (voor het idee: als iemand bij naam iets als "; delete * from computers;" invoert)

Mijn Lego Mocs - LEGO idea: The Motorcycle Garage


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 11-09 20:27

Matis

Rubber Rocket

Verwijderd schreef op woensdag 10 februari 2010 @ 09:45:
Dan gaat hij fout op de regel

PHP:
1
 '$_POST['naam']',

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in
Ja, natuurlijk gaat hij daar fout, lees dit maar eens: http://php.net/manual/en/language.types.string.php en dan in het bijzonder het stukje over single- en double-quotes.

@hierboven, je moet niet alles voorkouwen :P

[ Voor 4% gewijzigd door Matis op 10-02-2010 09:55 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thanks Pino!
nu doet hij het!
en nou moet ik nog voor elkaar zien te krijgen dat je elke query kan aanpassen, of verwijderen 8)7
dat word nog maar ff studeren dus :o
Matis schreef op woensdag 10 februari 2010 @ 09:55:
[...]

Ja, natuurlijk gaat hij daar fout, lees dit maar eens: http://php.net/manual/en/language.types.string.php en dan in het bijzonder het stukje over single- en double-quotes.

@hierboven, je moet niet alles voorkouwen :P
Waarom niet ? ik vond het wel makkelijk namelijk :D

[ Voor 40% gewijzigd door Verwijderd op 10-02-2010 10:01 ]


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 11-09 20:27

Matis

Rubber Rocket

Verwijderd schreef op woensdag 10 februari 2010 @ 09:58:
Waarom niet ? ik vond het wel makkelijk namelijk :D
Omdat je er nu niet van hebt geleerd en hierom PRG Beleid

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • dev10
  • Registratie: April 2005
  • Laatst online: 09-09 15:21
Pin0 schreef op woensdag 10 februari 2010 @ 09:53:
Zoiets zou moeten werken, dus met {} ivm. de enkele quotes, maar let inderdaad op SQL Injectie want dat vang je zo niet af. (voor het idee: als iemand bij naam iets als "; delete * from computers;" invoert)
Als je mysql_query() gebruikt is dat niet zo'n probleem. ;) Maar dan nog moet je escapen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Matis schreef op woensdag 10 februari 2010 @ 10:03:
[...]

Omdat je er nu niet van hebt geleerd en hierom PRG Beleid
of jij denkt dat ik er nu niet van geleerd heb,
nu snap ik het ook hoor :D

Acties:
  • 0 Henk 'm!

  • Pin0
  • Registratie: November 2002
  • Niet online
Graag gedaan! ;-) Ik zie het meer als zetje in de juiste richting, als je al niet weet waarom het fout gaat weet je ook niet dat je het in de richting van quotes ed. moet gaan zoeken. Natuurlijk kom je er met veel zoeken wel achter maar, als iemand dan de oplossing geeft kan je daar wel iets van leren, zo van waar komen die {} vandaan? etc...

Ontopic, php.net is je vriend, zoek op mysql en alle mysql functies liggen voor het oprapen... check ook de examples en gebruikersbijdragen, ook erg leerzaam...

Mijn Lego Mocs - LEGO idea: The Motorcycle Garage


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Pin0 schreef op woensdag 10 februari 2010 @ 09:53:
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
<?php 
$query = 
"INSERT INTO 
  `computers` 
    (`cid`, 
    `cuser`, 
    `csnr`, 
    `cmerk`, 
    `cspec`, 
    `cos`, 
    `cad`) 
  VALUES 
    ('',
    '{$_POST['naam']}', 
    '{$_POST['serienummer']}', 
    '{$_POST['merk']}', 
    '{$_POST['spec']}', 
    '{$_POST['os']}', 
    '{$_POST['ad']}');" ;

$sql = mysql_query ($query);

$result = $sql or die ("MySQL Fout: ". mysql_error()); 
?>

Zoiets zou moeten werken, dus met {} ivm. de enkele quotes, maar let inderdaad op SQL Injectie want dat vang je zo niet af. (voor het idee: als iemand bij naam iets als "; delete * from computers;" invoert)
Sorry dat ik het zeg, maar dit is echt drama-code, een voorbeeld van hoe je het niet doet...

1) Variabelen buiten quotes halen, geen rotzooi er omheen zetten
2) Backticks ` horen niet thuis in SQL, gooi die zooi eruit
3) Kolommen waar je geen waarde wilt invullen ga je niet in je query opnemen of met NULL of DEFAULT vullen
4) SQL injection, je noemt het, maar dankzij de variabelen binnen de string kun je geen oplossing bieden.
5) Foutafhandeling is zeer ongelukkig
6) $sql is geen SQL wat dus weer tot onduidelijkheid en dus fouten gaat leiden.

Deze code moet echt even compleet herschreven worden. Succes!

Acties:
  • 0 Henk 'm!

  • Pin0
  • Registratie: November 2002
  • Niet online
Ging alleen om het werkend maken, dat het mooier kan spreekt voor zich. Maar om nu gelijk met Zend_Db aan te komen gaat een beetje ver...

Mijn Lego Mocs - LEGO idea: The Motorcycle Garage


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Er zit een hoop tussen je code van net en Zend_Db natuurlijk... :X

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
cariolive23 schreef op woensdag 10 februari 2010 @ 10:31:
[...]
Sorry dat ik het zeg, maar dit is echt drama-code, een voorbeeld van hoe je het niet doet...

1) Variabelen buiten quotes halen, geen rotzooi er omheen zetten
2) Backticks ` horen niet thuis in SQL, gooi die zooi eruit
3) Kolommen waar je geen waarde wilt invullen ga je niet in je query opnemen of met NULL of DEFAULT vullen
4) SQL injection, je noemt het, maar dankzij de variabelen binnen de string kun je geen oplossing bieden.
5) Foutafhandeling is zeer ongelukkig
6) $sql is geen SQL wat dus weer tot onduidelijkheid en dus fouten gaat leiden.

Deze code moet echt even compleet herschreven worden. Succes!
Als je je database exporteert, dan zie je toch ook van die "Backticks" ? dus ik snap niet dat jij er bij komt dat die er niet thuis horen
SQL:
1
2
3
.
CREATE TABLE IF NOT EXISTS `computers` (
  `cid`

dat heb ik dus geexporteerd, vanuit PHPMyadmin..

[ Voor 5% gewijzigd door Verwijderd op 10-02-2010 11:30 ]


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Verwijderd schreef op woensdag 10 februari 2010 @ 11:29:
[...]

Als je je database exporteert, dan zie je toch ook van die "Backticks" ? dus ik snap niet dat jij er bij komt dat die er niet thuis horen
SQL:
1
2
3
.
CREATE TABLE IF NOT EXISTS `computers` (
  `cid`

dat heb ik dus geexporteerd, vanuit PHPMyadmin..
Nee, MySQL heeft dit verzonnen, backticks komen niet voor in de SQL standaard. Dubbele quotes worden in andere databases gebruikt wanneer er wordt afgeweken van correcte namen.

PMA, dat is helemaal een drama, dat is al helemaal geen maatstaaf. Leer SQL en hou je zoveel mogelijk aan de SQL standaarden. Dan kun je ook met andere databases werken en zal zelfs MySQL zich redelijk gedragen.
Pagina: 1