Erreur de syntaxe SQL près de...
Résolu
kategriss
Messages postés
9
Statut
Membre
-
Reivax962 Messages postés 3742 Statut Membre -
Reivax962 Messages postés 3742 Statut Membre -
Bonjour,
J'ai un petit problème avec une requête SQL
La voici
Je ne sais pas pourquoi elle me renvoir un message d'erreur de ce type :
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 'force='2' WHERE id_user='2'' at line 1
A savoir que j'ai une requête de même type dans ma page (voir ci dessous) et elle ne pose aucun problème.
Merci d'avance pour votre aide.
J'ai un petit problème avec une requête SQL
La voici
mysql_query("UPDATE persos
SET force='" . $force . "'
WHERE id_user='" . $_SESSION['id_user'] . "'")or die(mysql_error());
Je ne sais pas pourquoi elle me renvoir un message d'erreur de ce type :
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 'force='2' WHERE id_user='2'' at line 1
A savoir que j'ai une requête de même type dans ma page (voir ci dessous) et elle ne pose aucun problème.
mysql_query("UPDATE persos
SET pa='" . $pa . "'
WHERE id_user='" . $_SESSION['id_user'] . "'")or die(mysql_error());
Merci d'avance pour votre aide.
A voir également:
- Erreur de syntaxe SQL près de...
- Erreur t32 ✓ - Forum Livebox
- Erreur 0x80070643 - Accueil - Windows
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- Erreur 4201 france tv ✓ - Forum Réseaux sociaux
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
2 réponses
Bonjour,
Il me semble que FORCE peut être un mot réservé.
N'hésite pas à protéger tes noms de colonnes et de table en utilisant des `force`
(alt gr + 7)
Xavier
Il me semble que FORCE peut être un mot réservé.
N'hésite pas à protéger tes noms de colonnes et de table en utilisant des `force`
(alt gr + 7)
Xavier
C'est beau, c'est frai, ça sent le site web piratable à volonté.
Enfin bon, met un espace juste avant ton SET et juste avant ton WHERE pour voir si ça passe.
Enfin bon, met un espace juste avant ton SET et juste avant ton WHERE pour voir si ça passe.
Effectivement, comme le dit SebSauvage, ton site a de bonnes chances d'être ouvert aux injections SQL (forme de piratage très facile à mettre en oeuvre qui permet d'exécuter n'importe quelle requête sur ta base... Y compris des Drop Table !)
Enfin, tout dépend de comment tu as enregistré le user_id dans ta session.
Mais imagine qu'un utilisateur s'enregistre sous le nom : « '; DROP TABLE persos »
Nom bizarre, tu me diras, mais que devient alors ta requête telle qu'envoyée au serveur ?
mysql_query("UPDATE persos
SET force='" . $force . "'
WHERE id_user='" . $_SESSION['id_user'] . "'")or die(mysql_error());
devient
UPDATE persos SET force='12' WHERE id_user = ''; DROP TABLE persos
MySQL va donc voir, en fait, deux requêtes, dont la deuxième... détruit ta table !
Il faut IMPÉRATIVEMENT utiliser, comme tu l'évoques, mysql_real_escape_string :
mysql_query("UPDATE persos
SET force='" . $force . "'
WHERE id_user='" . mysql_real_escape_string($_SESSION['id_user']) . "'")or die(mysql_error());
Enfin, tout dépend de comment tu as enregistré le user_id dans ta session.
Mais imagine qu'un utilisateur s'enregistre sous le nom : « '; DROP TABLE persos »
Nom bizarre, tu me diras, mais que devient alors ta requête telle qu'envoyée au serveur ?
mysql_query("UPDATE persos
SET force='" . $force . "'
WHERE id_user='" . $_SESSION['id_user'] . "'")or die(mysql_error());
devient
UPDATE persos SET force='12' WHERE id_user = ''; DROP TABLE persos
MySQL va donc voir, en fait, deux requêtes, dont la deuxième... détruit ta table !
Il faut IMPÉRATIVEMENT utiliser, comme tu l'évoques, mysql_real_escape_string :
mysql_query("UPDATE persos
SET force='" . $force . "'
WHERE id_user='" . mysql_real_escape_string($_SESSION['id_user']) . "'")or die(mysql_error());
C'était en effet ça, force était réservé alors j'ai mis forc à la place et ça marche très bien.
Par contre je suis encore un peu débutante en PHP/MySQL alors que veux-tu dire par
protéger tes noms de colonnes et de table en utilisant des `force` ?
Appliquer un mysql_real_escape_string et/ou un htmlspecialchars ne suffit pas ?
Merci encore :)
La « protection », c'est le fait de mettre des ` autour de tes noms de colonne !
Ce n'était pas la peine de renommer ta colonne, il suffisait d'écrire « `force` » au lieu de « force » à chaque fois que tu voulais utiliser cette colonne !
Enfin bon, l'important, c'est que ça fonctionne...
Merci pour ton aide :)
La prochaine fois je me servirais de la protection mais cette fois-ci ce n'était pas gênant de renommer ma colonne ;)