Erreur de syntaxe SQL près de... [Résolu/Fermé]

Messages postés
9
Date d'inscription
mardi 1 avril 2008
Statut
Membre
Dernière intervention
14 novembre 2014
- - Dernière réponse : Reivax962
Messages postés
3504
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
15 novembre 2019
- 4 avril 2008 à 11:24
Bonjour,

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.

Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
3504
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
15 novembre 2019
917
1
Merci
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

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 70699 internautes nous ont dit merci ce mois-ci

kategriss
Messages postés
9
Date d'inscription
mardi 1 avril 2008
Statut
Membre
Dernière intervention
14 novembre 2014
-
Merci !

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 :)
Reivax962
Messages postés
3504
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
15 novembre 2019
917 > kategriss
Messages postés
9
Date d'inscription
mardi 1 avril 2008
Statut
Membre
Dernière intervention
14 novembre 2014
-
Non non !
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...
kategriss
Messages postés
9
Date d'inscription
mardi 1 avril 2008
Statut
Membre
Dernière intervention
14 novembre 2014
> Reivax962
Messages postés
3504
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
15 novembre 2019
-
Ok !

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 ;)
Messages postés
33214
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
12459
0
Merci
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.
Reivax962
Messages postés
3504
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
15 novembre 2019
917 -
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());