Hallo,

ik heb de volgende php error, maar weet niet hoe ik het kan oplossen.


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 ' 'passwoord1'), (''' at line 1



Update ik weet inmiddels hoe het komt.

Mijn registratie pagina bugt, en krijg het niet in orde. Iemand had zich geregistreerd onder de naam : "Pietje Puk', 'passwoord1'), ('"

Helaas krijg ik het niet voor elkaar om ook gedeeltes te detecteren in gebruikersnamen.
Het is mij momenteel alleen gelukt om gebruikersnamen te detecteren die zich "(" of "?" noemen, maar niet "(&'karel?"

Als iemand mij daar bij kan helpen, zal erg fijn zijn.

Dit is wat ik momenteel gebruik:

//kijken of de gebruikersnaam is toegestaan
$badnames = array("bitch", "fuck", "cancer", ".net", ".nl", ".be", ".com", ".nu", ".tv", ".de", ".jp", ".ru", ".", "-", "_", "@", "?", "!","http","/","`","'",")","(","$","%","&");
if (in_array($gebruiker, $badnames)) {
$fm = 1;
$melding = 'This username is not allowed.';
}

if (preg_match('/'.$badnames.'/',$gebruiker)){
$fm = 1;
$melding = 'This username is not allowed.';
}

Bedankt Ivo P, al heeft het niks met mijn "huidige" probleem te maken.
Het gaat mij nu puur om de symbolen in gebruikersnamen, dat die niet meer gebruikt kunnen worden.

Bijvoorbeeld dit : Pietje Puk', 'passwoord1'), ('

maar mijn huidige symbolen check, werkt alleen als de volledige gebruikersnaam een ( of een ' is.


Betreft de registratie datum, daar valt niks van de filteren, ik gebruik het alleen op profielen, zodat iedereen kan zien, wanneer hij/zij zich had aangemeld.
Marco Eilander op 30/09/2014 15:07:30

Bedankt Ivo P, al heeft het niks met mijn "huidige" probleem te maken.
Het gaat mij nu puur om de symbolen in gebruikersnamen, dat die niet meer gebruikt kunnen worden.


Daar heeft het dus juist WEL mee te maken: escapen is het zorgen dat karakters of teksten die niet gebruikt kunnen worden, toch kunnen worden ingevoerd.

Het voorbeeld dat je geeft, heeft problemen omdat er een ' in de tekst staat.
Dat kan gaan om een vervelende user, maar ook om een naam waarin gewoon zo'n apostrof staat (Jeanne d'Arc) of het woord "foto's".

In een query voor de database Mysql escape je door voor een ' en \ te plaatsen.
En omdat het simpele Addslashes() van php daarin niet volledig goed functioneert, is er de functie mysqli_real_escape_string() (en wat verwante versies).

Andere databases, zoals Oracle hebben een andere escape methode

INSERT INTO ....VALUES ('foto''s')
zou het dan zijn.

Een teken dat het slecht doet op beeldschermen is <
Daarom maak je daarvan: &lt; met htmlspecialchars().

Om gereserveerde woorden te kunnen gebruiken als kolomnaam kun je in Mysql `` gebruiken.

INSERT INTO `tabelnaam met spaties` (`column`, `is`, `not`, `allowed`) ....

Maargoed:
jouw probleem is simpel terug te brengen tot: gebruik een mysql-escape routine om die ' onschadelijk te maken.


----
over je datum:
je zegt nu dat je er niets mee gaat doen, maar ook niet:
"deze persoon is nu al 5 jaar lid van de site"
"nieuwe aanmeldingen deze week"

Omdat je dat met een stukje tekst toch niet op kunt vangen in een query, zou ik toch maar een kolom van het type Date of datetime gebruiken


- Aar - op 29/09/2014 23:23:43

Persoonlijk vind ik backticks zwaar overbodig...


Persoonlijk is geen verboden iets. Alles UI programma's samen met PHPmyadmin gebruiken backticks.
Niets mis mee toch?
Rickert Bombaklats op 30/09/2014 15:26:00


Niets mis mee toch?


behalve dan dat je grappen krijgt als tabelnamen met spaties, kolommen met verboden woorden.

SELECT `delete`, `from tabel2` FROM tabel2

krijgt een heel andere betekenis als je een keer de `` achterwege laat.

Er zijn duizende mogelijke kolom- en tabelnamen te verzinnen, en middels `` wil jij graag net die 50 verbode woorden in kunnen zetten (of die paar verboden tekens als % of spatie etc?
Dus als ik het goed begrijp? Beter zonder als met backticks? of juist andersom
Nooit backticks gebruiken.
Zelf schrijf ik ze niet, het framework met active record class handelt alles voor me af :P
Maar voor zover ik wist moesten ze er gewoon bij.
ze moeten er alleen bij als je zelf een probleem hebt veroorzaakt door verkeerde tabel- of kolomnamen te kiezen.
Ik heb nu dit :

<?php
mysql_query("INSERT INTO players(player_name,wachtwoord,join_date) VALUES('".mysql_real_escape_string($gebruiker)."','".mysql_real_escape_string(md5($ww))."','".mysql_real_escape_string($datum)."')");
?>


maar bestaat er niets simpels, als een array met niet toegestaande symbolen, die controleerd of het in de gebruikersnaam voorkomt? Stel dat het er wel in voorkomt, dat je dan een foutmelding krijgt, en dus niet kan registeren.
waarom zou hij niet mogen registreren?

Wil je dan ook verbieden dan iemand in zijn tekst een ' gebruikt?

mysql_real_escape_string() voldoet om die ' onschadelijk te maken. Daarmee moet het voor jou klaar zijn.

PS:
md5() levert een string op die bestaat uit cijfers en de letters A-F. Daar kan dus in principe nooit een ' in voorkomen. escapen voegt daar niet heel veel toe, maar is ook niet schadelijk, mits inderdaad zo om net niet md5() aan de buitenkant staat.

Reageren