Erreur de syntaxe SQL près de...

Résolu/Fermé
kategriss Messages postés 9 Date d'inscription mardi 1 avril 2008 Statut Membre Dernière intervention 14 novembre 2014 - 3 avril 2008 à 15:01
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 - 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.

2 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
3 avril 2008 à 15:05
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
kategriss Messages postés 9 Date d'inscription mardi 1 avril 2008 Statut Membre Dernière intervention 14 novembre 2014
3 avril 2008 à 15:22
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 :)
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011 > kategriss Messages postés 9 Date d'inscription mardi 1 avril 2008 Statut Membre Dernière intervention 14 novembre 2014
3 avril 2008 à 17:42
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...
0
kategriss Messages postés 9 Date d'inscription mardi 1 avril 2008 Statut Membre Dernière intervention 14 novembre 2014 > Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021
3 avril 2008 à 21:40
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 ;)
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
3 avril 2008 à 15:07
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.
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
4 avril 2008 à 11:24
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());
0