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

Signaler
Messages postés
9
Date d'inscription
mardi 1 avril 2008
Statut
Membre
Dernière intervention
14 novembre 2014
-
Messages postés
3605
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
16 juillet 2020
-
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.

2 réponses

Messages postés
3605
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
16 juillet 2020
961
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
1
Merci

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

CCM 56623 internautes nous ont dit merci ce mois-ci

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 :)
Messages postés
3605
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
16 juillet 2020
961 >
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...
Messages postés
9
Date d'inscription
mardi 1 avril 2008
Statut
Membre
Dernière intervention
14 novembre 2014
>
Messages postés
3605
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
16 juillet 2020

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
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 206
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.
Messages postés
3605
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
16 juillet 2020
961
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());