Bonjour,
Actuellement entrain de réaliser un petit webservice que je test en local, lors de l'appel d'une simple méthode CRUD je me retrouve avec une perte de valeur, =>
Méthode d'update :
PS correspondant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 public function setRequeteModifier($obj) { $classe=get_class($obj); $table = $classe; $proprietes=$obj->getProprietes(); //récupération du tableau associatif clés-valeurs de l'objet $where = " WHERE "; //sous chaîne pour la clause WHERE $params = array(); $sql="UPDATE $table SET "; //début de la requête $id=""; foreach($proprietes as $key=>$val)//suppose que l'identifiant de la classe et de la table est id_ + nom de la classe : si classe est Client alors id_client. Ou suppose que l'identifiant est un des termes saisies directement dans la condition. { if(($key != "id_".$classe) && ($key != "id_".get_parent_class($obj)) && ($key !="id_row") && ($key !="id_hydroweb") && ($key !="id_profil") && ($key !="id_service") && ($key !="id_login_sdis") && ($key !="id_cis") && ($key !="id_login_ext")) //j'écarte l'identifiant des champs à modifier { $sql=$sql.$key."=?,"; //on ajoute un ? -> //requête préparée avec marqueurs interrogatifs $params[]=$val; // echo ($val); } else { $where = $where.$key."=?"; //requête préparée avec marqueurs interrogatifs $id=$val; // echo $params[]=$val; // echo $key; } } $proprietes= $val; $params[]=$val; // $params[] = $id; //on ajoute lid à la fin du tableau des paramètres $sql = rtrim($sql, ","); // enleve la derniere virgule, PHManuel : Supprime les espaces (ou d'autres caractères) de fin de chaîne $sql = $sql . $where; //on ajoute la clause WHERE à la fin de la requête $this->requete = $sql; //on stocke le texte de la requête dans $this->requete $this->parametres = $params;//on stocke les valeurs des paramètres dans $this->parametres }// fin de la méthode setRequeteModifier()
Le petit bout de ma classe lié à cette méthode:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 public function setPSModifier($obj) { //exemple ps = modifierClient $nomps=self::$_appel." modifier". get_class($obj). " " . substr(self::$_syntaxe,0,1);//Appel et nom de la procedure stockée $proprietes=$obj->getProprietes(); try { $i=0; $params = array(); foreach($proprietes as $key=>$val) { $nomps = $nomps. "?,"; $params[] = $val; } $nomps = rtrim($nomps, ",");// enlever la derniere virgule $nomps = $nomps . substr(self::$_syntaxe,1,1); $this->requete = $nomps; $this->parametres = array(); $this->parametres = $params; } catch (PDOException $e) { throw new PDO3Exception($e->code); } }// fin de la méthode setPSModifier()
Ainsi que les parties du WSDL correspondant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public function modifierUnRattachement ($id_service, $trigramme_service, $code_insee) { $rattach = new tbl_rattachement_sdis_communes($id_service ,$trigramme_service, $code_insee); Gestion::modifier($rattach); }
Jusqu'à présent tout ce passe bien, aucune erreur d'affichée, la modification se réalise bien SAUF que certaines valeurs de champs sont passées je ne sais pourquoi à "0" exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 <message name="modifierUnRattachementRequest"> <part name="id_service" type="xsd:int"/> <part name="trigramme_service" type="xsd:string"/> <part name="code_insee" type="xsd:int"/> </message> <message name="modifierUnRattachementResponse"> </message> <operation name="modifierUnRattachement"> Modifier un Rattachement SDIS / Commune : <input message="typens:modifierUnRattachementRequest"/><br/> <output message="typens:modifierUnRattachementResponse"/><br/> </operation> <operation name="modifierUnRattachement"> <soap:operation soapAction="urn:RattachementAction"/> <!-- <input> --> <!-- <soap:body namespace="urn:hydroweb" use="encoded" --> <!-- encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> --> <!-- </input> --> <output> <soap:body namespace="urn:hydroweb" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </output> </operation>
Invocation de la méthode modifier :
On retrouve donc,
Code : Sélectionner tout - Visualiser dans une fenêtre à part $res4 = $client->modifierUnRattachement("YOLO", 39999, 767);
en premier le champ => trigramme_service, (varchar)
en second le champ => code_insee, (int)
en troisième le champ => id_service (int, AI, PK)
Problème étant, que si j'utilises cette méthode directement sans passer par le Webservice, celle-ci fonctionne correctement, mais dans ce cas présent, voici ce que j'obtiens:
Pièce jointe 347566
Alors que je devrais avoir :
Pièce jointe 347567
Mais la chose que je ne comprends pas, cette perte de valeur j'ai l'impression qu'elle ne se fait que sur des champs "string" et pas tous, en effet sur une autre table, certains champs de type string vont être correctement update, tandis que d'autre seront passés à "0" sans raison.
On dirait que lorsque la requête passe dans le webservice, certaines valeurs sont transformées en "0" (hypothèse).
Si vous avez une idée/besoin d'autres informations supplémentaires, n'hésitez pas !
Partager