login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Probleem met wegschrijven naar database (Opgelost)

Offline JoDe - 11/06/2016 19:50
Avatar van JoDeLid 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)

8 antwoorden

Gesponsorde links
Offline Thomas - 12/06/2016 16:37
Avatar van Thomas Moderator 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').
Offline JoDe - 12/06/2016 16:47
Avatar van JoDe Lid Hoi, bedankt voor de tips!


Dus dat is beter?
  1. $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
Offline Thomas - 12/06/2016 17:01 (laatste wijziging 12/06/2016 17:03)
Avatar van Thomas 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.
Offline JoDe - 12/06/2016 17:31
Avatar van JoDe Lid Dus om nu één kolop te escapen en te inserten ga ik best zo te werk:
  1. $sqlquery ="INSERT INTO klanten (vnaam) VALUES (mysqli_real_escape_string(".$sqlconnect.", '".$vnaam."'))";

Of heb ik wer wat fout begrepen?
Offline Thomas - 12/06/2016 19:38 (laatste wijziging 12/06/2016 23:32)
Avatar van Thomas Moderator Het is een combinatie van quotes in de querystring zelf en het concateneren (aaneenrijgen) van de ge-escapete waarden, dus als volgt:
  1. $sqlquery = "INSERT INTO klanten (vnaam) VALUES ('".mysqli_real_escape_string($sqlconnect, $vnaam)."')";

Dit zul je voor elk argument/waarde moeten doen.
Offline JoDe - 12/06/2016 22:25
Avatar van JoDe Lid Wacht even, ik dacht dat VALUES ook tussen ronde haken moeten?!
Offline Thomas - 12/06/2016 23:32 (laatste wijziging 12/06/2016 23:35)
Avatar van Thomas 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 .
Offline JoDe - 13/06/2016 13:51 (laatste wijziging 13/06/2016 15:19)
Avatar van JoDe Lid Oke, bedankt! Nu is het duidelijk!
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.355s