Hoi mensen,
Wanneer ik in een verwerkingsscript data naar een MySQL-database wegschrijf mislukt dat steevast. Ik krijg geen PHP- of SQL-error, maar de meldingen die ik zelf heb ingebouwd spelen parten.
Kan iemand helpen?
Ikheb de zip met de benodigde bestanden in dropbox gezet. De link is: https://www.dro...s.zip?dl=0 , Klik dan op "Niet nu en downloaden" (of iets dergelijks) en dan opnieuw op "Downloaden".
Alvast bedankt voor de hulp.
Groeten, JoDe (Jordy)
In verwerkreg.php ontbreken er enkele quotes om de waarden van de in te voegen informatie.
Dus in plaats van:
INSERT INTO table (col1, col2) VALUES (val1, val2)
Zal dit iets moeten worden van de vorm:
INSERT INTO table (col1, col2) VALUES ('val1', 'val2')
Daarnaast doe je er verstandig aan deze waarden te escapen (betekent: het onschadelijk maken van karakters met speciale betekenis in, in dit geval, de MySQL context). Deze waarden zelf kunnen namelijk ook (enkele) quotes bevatten en dit zou dan je query alsnog breken.
Het escapen van een waarde doe je met de functie mysqli_real_escape_string($je_database_link, 'de te escapen waarde').
$sqlquery="INSERT INTO klanten (naam, tussenv, achternaam) VALUES ('".$vnaam."', ".$tussenv."', ".$anaam.");";
Natuurlijk inclusief de andere kolommen!
En kan je nog even wat verduidelijking geven over dat escapen, of me een link geven waar ik dat kan vinden?
Alvast bedankt vor je verder hulp en nog eens bedankt voor de hulp die ik al gekregen heb!
Groetjes, Jordy
Thomas - 12/06/2016 17:01 (laatste wijziging 12/06/2016 17:03)
Moderator
Euh ja, dat is het principe, maar dan wel enkele quotes om alle waarden, dus ook een openings-quote om $tussenv en een openings- en sluitingsquote om $anaam. Het is trouwens niet nodig om de query zelf te voorzien van een puntkomma aan het einde.
Stel bijvoorbeeld dat $vnaam in de bovenstaande (en gecorrigeerde) query de volgende waarde heeft:
' test
Dus een enkel aanhalingsteken, gevolgd door een spatie en dan de tekst "test". Wanneer je dit samenrijgt in de query klopt de vorm van de query niet meer. Je quotes lopen dan in de soep.
Wanneer je nu mysqli_real_escape_string($sqlconnect, $vnaam) gebruikt in plaats van simpelweg $vnaam dan wordt de quote die in de invoer zit zodanig aangepast zodat dit de query niet langer breekt.
Het principe van escapen zou eigenlijk altijd en overal toegepast moeten worden waar sprake is van invoer door een externe partij, zoals eindgebruikers die data versturen via een formulier.
Maar dan is de kous nog niet af. Iemand zou ook HTML of JavaScript code in kunnen voeren. Dit heeft tot gevolg dat, op het moment dat je deze informatie weer weergeeft, dat deze invoer van invloed kan zijn op het HTML-document of zelfs via JavaScript informatie ontvreemdt van de dan ingelogde gebruiker. Ook bij het weergeven zou je escaping moeten toepassen. Je werkt daar dan niet in de MySQL context maar in de HTML context. Daarvoor is weer een andere escaping functie: htmlspecialchars().
In het algemeen: alle data die afkomstig is van buitenaf moet je niet vertrouwen en zou je onschadelijk moeten maken via escaping-functionaliteit.
Wacht even, ik dacht dat VALUES ook tussen ronde haken moeten?!
Thomas - 12/06/2016 23:32 (laatste wijziging 12/06/2016 23:35)
Moderator
Euh ja, vorige voorbeeld aangepast. Maar controleer wel goed op welke plek je de string aan functie-aanroepen hangt. Deze dienen geen onderdeel te zijn van de stringtekst zelf (dit is dan letterlijke tekst), het resultaat van de functie moet aan de string geregen worden .