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

Eléphanteau du PHP | 26 Messages

28 mai 2007, 11:44

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

28 mai 2007, 12:06

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 ' ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Invité
Invité n'ayant pas de compte PHPfrance

28 mai 2007, 13:59

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:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

28 mai 2007, 14:02

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 26 Messages

28 mai 2007, 14:08

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' ... :?

Eléphant du PHP | 377 Messages

28 mai 2007, 14:11

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);
Petit scarabée deviendra grand

Eléphanteau du PHP | 26 Messages

28 mai 2007, 14:18

Merci pour tout.

Tout fonctionne correctement :D

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

28 mai 2007, 14:36

Effectivement :-k

J'ai tellement l'habitude d'entourer mes requêtes de " que j'ai même pas vérifié :?
Désolé :oops:
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer