Page 1 sur 1

Pb : sprintf ds une requete d'insertion mssql_query()

Posté : 28 mai 2007, 11:44
par risa83
Bonjour à tous et à toutes,

Je souhaiterais insérer des données dans une table
Pour cela j'utilise la fonction sprintf() qui me permet d'exécuter ma requete suivant des valeurs récupérées de diverses tables.

Tout fonctionne correctement lorsque j'insère un entier mais j'ai un problème lorsqu'il s'agit d'une chaine de caractère.
function insert_packRequete ($ID_PACKPOSITIONNEMENT, $ID_MOTEURDERECHERCHE, $REQ_MOT, $REQ_RANG){
  $query =sprintf('insert into PACKREQUETE(ID_PACKPOSITIONNEMENT, ID_MOTEURDERECHERCHE, REQ_MOT,  REQ_RANG) 
              values (%d, %d, %s, %d)',$ID_PACKPOSITIONNEMENT, $ID_MOTEURDERECHERCHE, $REQ_MOT, $REQ_RANG);
  $result = mssql_query($query) or die("Requete Sql non valide");
}
La valeur de $REQ_MOT provient d'une autre table et est définie en tant que varchar.
Voici l'erreur qui en découle :

Code : Tout sélectionner

Warning: mssql_query(): Sybase: Server message: The name 'chauffe' is not permitted in this context. Only constants, expressions, or variables allowed here. Column names are not permitted. (severity 15, procedure N/A) Requete Sql non valide
Tout aide sera la bienvenue :)

Merci

Posté : 28 mai 2007, 12:06
par zeus
Bonjour,

Dans une requête, à partir du moment que tu utilises une chaine de caractère comme valeur, il faut l'encadrer de '.
Le %s me laisse penser que $REQ_MOT est une chaine de caractère, donc qu'il faut l'encadrer par des ' ;)

Posté : 28 mai 2007, 13:59
par Invité
Bonjour,

Dans une requête, à partir du moment que tu utilises une chaine de caractère comme valeur, il faut l'encadrer de '.
Le %s me laisse penser que $REQ_MOT est une chaine de caractère, donc qu'il faut l'encadrer par des ' ;)

Merci pour ta reponse
En effet, en l'encadrant de la manière suivante, ma requete fonctionne :
 $query =sprintf('insert into PACKREQUETE(ID_PACKPOSITIONNEMENT, ID_MOTEURDERECHERCHE, REQ_MOT,  REQ_RANG) 
              values (%d, %d, %s, %d)',$ID_PACKPOSITIONNEMENT, $ID_MOTEURDERECHERCHE, '\''.$REQ_MOT.'\'', $REQ_RANG);
En revanche, je ne comprends pas pourquoi ma requete précédente est incorrect puisque $REQ_MOT est déclaré et initialisé en tant que chaine de caractère, de même type que le %s de sprintf() :shock:

Posté : 28 mai 2007, 14:02
par zeus
En fait, c'est pas la variable qu'il faut encadrer. C'est la valeur dans la requête :
Il faut écrire

Code : Tout sélectionner

INSERT INTO maTable(monChamp) VALUES ('mavaleurtexte')
J'aurais donc plutôt écrit ta requête de cette manière :
$query =sprintf('insert into PACKREQUETE(ID_PACKPOSITIONNEMENT, ID_MOTEURDERECHERCHE, REQ_MOT,  REQ_RANG) 
              values (%d, %d, '%s', %d)',$ID_PACKPOSITIONNEMENT, $ID_MOTEURDERECHERCHE, $REQ_MOT, $REQ_RANG);
Le soucis ne vient pas de la variable mais de la requête ;)

Posté : 28 mai 2007, 14:08
par risa83
En l'encapsulant de cette manière, j'ai l'erreur suivante :

Code : Tout sélectionner

Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING
La seule solution que j'ai trouvé pour pallier cette erreur est celle citée précédemment.

Solution que je trouve un peu 'lourde' ... :?

Posté : 28 mai 2007, 14:11
par Shrell
Si tu as fait un copier/coller direct du code de zeus, il y a un probleme de guillemets (d'ailleurs la coloration syntaxique le montre), d'où l'erreur.
Correction :
$query =sprintf("insert into PACKREQUETE(ID_PACKPOSITIONNEMENT, ID_MOTEURDERECHERCHE, REQ_MOT,  REQ_RANG)  
              values (%d, %d, '%s', %d)",$ID_PACKPOSITIONNEMENT, $ID_MOTEURDERECHERCHE, $REQ_MOT, $REQ_RANG);
ou encore
$query =sprintf('insert into PACKREQUETE(ID_PACKPOSITIONNEMENT, ID_MOTEURDERECHERCHE, REQ_MOT,  REQ_RANG)  
              values (%d, %d, \'%s\', %d)',$ID_PACKPOSITIONNEMENT, $ID_MOTEURDERECHERCHE, $REQ_MOT, $REQ_RANG);

Posté : 28 mai 2007, 14:18
par risa83
Merci pour tout.

Tout fonctionne correctement :D

Posté : 28 mai 2007, 14:36
par zeus
Effectivement :-k

J'ai tellement l'habitude d'entourer mes requêtes de " que j'ai même pas vérifié :?
Désolé :oops: