Problème de requete sql en php

voila, je fait une simple requette d’update dans un site en php et il me renvoir une synthaxe error

hophop, voici le méchant code mal fait par moi :

[quote]$result=mysql_query (“update ordinateur set num_pc=”.$_POST[“numero”].", modele=’".$_POST[“modele”]."’, type=’".$_POST[“type”]."’, os=’".$_POST[“os”]."’,ip=’".$_POST[“ip”]."’, mac=’".$_POST[“mac”]."’, usage=’".$_POST[“utilisation”]."’, ut=’".$_POST[“ut”]."’, emi=’".$_POST[“emi”]."’, gipss=’".$_POST[“gipss”].", date=’".$_POST[“date”]."’, logiciel sup=’".$_POST[“logiciel”]."’ where num_pc=".$_POST[“numero”]);
if (!$result) {
die('Requête invalide : ’ . mysql_error());[/quote]

je sais ce n’est pas tres claire…

et il m’envoi un : “Requête invalide : Erreur de syntaxe près de 'usage=‘Bureautique’, ut=‘3996’, emi=‘18553’, gipss=‘non ren’ à la ligne 2” (qui la ne doit pas etre la ligne 2 du coup mais bon…"

Sachant que les variable contenant “bureautique”, “3996” “18553” et “non ren” sont respectivement $_POST[“utilisation”], $_POST[“ut”], $_POST[“emi”] et $_POST[“gipss”]

je suis désolé, j’ai du mal a etre claire.

Merci de votre aide

[quote=« Toun.Rolyste, post:1, topic: 33116 »]voila, je fait une simple requette d’update dans un site en php et il me renvoir une synthaxe error

hophop, voici le méchant code mal fait par moi :

je sais ce n’est pas tres claire…

et il m’envoi un : « Requête invalide : Erreur de syntaxe près de 'usage=‹ Bureautique ›, ut=‹ 3996 ›, emi=‹ 18553 ›, gipss=‹ non ren › à la ligne 2 » (qui la ne doit pas etre la ligne 2 du coup mais bon…"

Sachant que les variable contenant « bureautique », « 3996 » « 18553 » et « non ren » sont respectivement $_POST[« utilisation »], $_POST[« ut »], $_POST[« emi »] et $_POST[« gipss »]

je suis désolé, j’ai du mal a etre claire.

Merci de votre aide[/quote]

dans un premier temps, pour être plus lisible, tu ferais bien d’assigner les variables globales dans des variables locales avec des noms plus simples, ça t’éviterait des erreurs d’echappement des caractères loufoques.

Ensuite, décompose ta requete (qui est toute simple, à vue de pif), il est fort probable que tu aies un caractère non echappé qui pose problème, et met tout ça dans une variable que tu affiches avant, en debug, histoire de voir si y’a pas un truc qui t’apparait spontanément B)

have fun :smiley:

edit : houla, y’a un peut etre un truc qui m’échappe mais je pense qu’updater un champ qui te sers de critère pour faire ton update, c’est un peu crado …

"update table set toto="prout" where toto="pouet" "

je pense que c’est pas la meilleure des idées… B)

C’est une perte de temps d’essaye de lire ce machin.
Fait un “echo” de la requete et colle la dans mysql ou dans phpmyadmin, tu verras, ca simplifie considerable le debugage.

LoneWolf
Debugage PHP pour les nuls

l’update du champ de critère était une tentative de débugage préalable, j’aurai du l’enlever car tu a raison, ca fait encore plus crado…

je vais mettre en oeuvre vos conseils, merci.

En passant, exécuter une requête SQL directement sans évaluer les variables, c’est mal.
C’est une porte ouverte pour les insertions barbares dans les tables par des vilains hackers… Ne jamais faire confiance aux paramètres que ça soit envoyé en post ou en get, toujours les évaluer (et corriger au besoin) côté serveur !

je n’ai pas pensé à optimiser la sécurité sachant que le poste qui contiendra cette page ne sera pas relier à internet, cette page n’a pour but que de simplifier l’interface vers une base de donnée afin que les utilisateur puissent trouver les infos qu’ils désirent sans avoir a tripatouiller phpmyadmin B)

il faudrait que tu affiches la requete, qu’on puisse voir pourquoi ton serveur te crache a la figure B)

en fait non, il reste un probleme…

voici la réponse de mysql :

[quote]requête SQL:

UPDATE ordinateur SET modele = “DELL”,
TYPE = “Fixe”,
os = “XP SP2”,
ip = “132.169.10.52”,
mac = “00-15-C5-4F-F2-EA”,
USAGE = “Bureautique”,
ut = “3996”,
emi = “18553”,
gipss = “non renseigné”,
date = “01/07”,
logiciel sup = “suite ADOBE + Project” WHERE num_pc =3[/quote]et l’érreur

[quote]MySQL a répondu:
#1064 - Erreur de syntaxe près de ‘usage=“Bureautique”, ut=“3996”, emi=“18553”, gipss="non renseign’ a ligne 1[/quote]

ca pourrait pas etre l’espace dans ta colonne “logiciel sup” qui mettrait le boxon? Parce que la syntaxe SQL semble passer chez moi sinon

Nop, c’est pas l’espace :’( je vien de le bouger et il me donne toujours une synthaxe incorecte…

bon, j’y replonge, j’aimerai trouver avant ce soir B)

tu l’as bougé ? t’as fait quoi avec ?

remplace le par un underscore, et ensuite fais un echo de ta requete et paste le ici.

La structure de la table pourrait aider, aussi B)

j’ai juste remplacer l’espace par un underscore, je colle la structure de ma table

[quote]Champ Type Null Défaut

num_pc int(11) Non
modele varchar(50) Non
type varchar(50) Non
os varchar(50) Non

ip varchar(20) Oui NULL
mac varchar(20) Oui non renseigné
usage varchar(50) Oui non renseigné
ut varchar(20) Oui non renseigné
emi varchar(20) Oui non renseigné
gipss varchar(20) Oui non renseigné
date varchar(10) Oui non rensei
logiciel_sup varchar(50) Oui aucun
num_utilisateur int(11) Non 0[/quote]

réponse bete : avec un “usage” en minuscule ? B)

non, les bdd sont generalement case insensistive.

il y aurait pas une erreur de guillemets devant usage?

Il faut utiliser l’apostrophe inversée autour des noms de variables (Alt Gr + 7) et le guillemet simple (sous la touche 4) pour entourer les valeurs, quel que soit le type.

[quote=“Berzehk, post:14, topic: 33116”]non, les bdd sont generalement case insensistive.

il y aurait pas une erreur de guillemets devant usage?

Il faut utiliser l’apostrophe inversée autour des noms de variables (Alt Gr + 7) et le guillemet simple (sous la touche 4) pour entourer les valeurs, quel que soit le type.[/quote]
C’est pas obligatoire pour l’apostrophe inversée mais ça aide effectivement.
Par contre il me semble bien que le guillemet simple ne sert qu’à mettre à jour les champs de type char, ce qui donnerait pour la requête :

UPDATE ordinateur SET modele = ‘DELL’,
type = ‘Fixe’,
os = ‘XP SP2’,
ip = ‘132.169.10.52’,
mac = ‘00-15-C5-4F-F2-EA’,
usage = ‘Bureautique’,
ut = ‘3996’,
emi = ‘18553’,
gipss = ‘non renseigné’,
date = ‘01/07’,
logiciel sup = 'suite ADOBE + Project’
WHERE num_pc = 3

pour le “usage” il est en minuscule dans la requette quand je l’écrit et il le met en maj lorsqu’il me la remontre quand il m’annonce que la requette ne passe pas.

J’ai eu une idée, mais c’est surement des bétise, ne ce peut il pas que “usage” soit un mot de commande sql et qu’il ne le prenne pas comme nom de champ ?

je fait le teste de passage au guillement simple

Edit :

ok, c’est bon, ca marche B) en fait, il fallait bien les champ, mais pour les valeur il faut les double guillemets sinon il ne les prend pas comme du char et ce demande ce qu’on est en train de lui raconter

voici la requette qui fonctionne

[quote]update ordinateur set
modele=“DELL”,
type=“portable + station d’acceuil”,
os=“XP SP2”,
ip=“132.169.9.150”,
mac=“00-15-C5-4F-F2-43”,
usage=“Bureautique”,
ut=“4273”,
emi=“18707”,
gipss=“non renseigné”,
date=“non rensei”,
logiciel_sup=“suite ADOBE + Project” where num_pc=19[/quote]

Merci a tous

[quote=“Toun.Rolyste, post:16, topic: 33116”]pour le “usage” il est en minuscule dans la requette quand je l’écrit et il le met en maj lorsqu’il me la remontre quand il m’annonce que la requette ne passe pas.

J’ai eu une idée, mais c’est surement des bétise, ne ce peut il pas que “usage” soit un mot de commande sql et qu’il ne le prenne pas comme nom de champ ?

je fait le teste de passage au guillement simple

Edit :

ok, c’est bon, ca marche B) en fait, il fallait bien les champ, mais pour les valeur il faut les double guillemets sinon il ne les prend pas comme du char et ce demande ce qu’on est en train de lui raconter

voici la requette qui fonctionne
Merci a tous[/quote]
les champs usage, date et type, oui c’est pas terrible… Il vaut mieux utiliser des noms dont tu sois certain (genre usage_ordi, date_inser et type_ordi).

ah je viens de voir ton message : je pensais que mysql prenait la même syntaxe qu’oracle pour les valeur des champs en caractères. Bizarre…

Dorénavant je penserai a utiliser des noms de champs plus sur et plus perso B)