Requête SQL (UPDATE) ne fonctionnant pas

Bonjour,

Je développe actuellement un module et rencontre un problème… Je dois modifier la base de données à l’aide d’une requête SQL update dans mon PHP, hors elle ne fonctionne pas et je ne comprend pas pourquoi puisqu’elle fonctionne dans phpMyAdmin… Pourriez-vous m’aider ?

Voici ma requête :

Cordialement,

EDIT : j’ai finalement réussi a trouvé : il faut rajouter une ligne en dessous :

Bonjour,

je complète la réponse

… ref_client « ’.$this->db->escape($refProjet).’ » WHERE … rowid=’.(int)$facture[rowid];

Plusieurs choses :

  • le $this->db->escape vous permet de vous assurer qu’il n’y aura pas d’erreur si votre variable $refProjet contien un ’ ou autre caractères exotiques. Dans les faits c’est trés peu probable, Dolibarr ne le permet pas sur les « ref » en gérale, mais cet méthode est une bonne pratique, à mettre en place dés que vous passez une string dans une requête (je vous assure même dans les cas improbable de premier abords, cela arrive et on passe des heures à comprendre ce qui se passe). N’en faites pas l’économie.
  • (int)$facture[rowid] cela permet de vous faire 0 si $facture[rowid] est vide, et la requête ne plantera pas. D’ailleurs avez vous tester que $facture est un tableau et que $facture[rowid] n’est pas vide ?

De manière générale ces deux bonnes pratiques vont/doivent se généralisées dans Dolibarr Core ( et surtout dans les modules externes), cela protège des injections SQL.

  • le .’;’; à la fin c’est pas nécessaire, Dolibarr gère tout seul, pas besoin de finir le sql par un « ; » (biensur le php oui) . D’ailleurs il ne vous permettra pas de faire plusieurs requêtes séparées par des ; en une fois.

$facture[rowid] : cela ne peux pas fonctionné : « rowid » et pas « $rowid » ? Si votre version de php arrive à interpréter « rowid » tant mieux, mais cela ne va pas duré.

Pensez tous le temps à tester $request et faire quelque chose si la requête plante (setEventMessage($this->db->lasterror,‹ errors ›) où arréter le traitement (db->begin(), db->commit() ou db->rollback()) si il y a une erreur. Ne présumez jamais du fait que votre traitement va fonctionné. Tester les entrées et la sortie, toujours, et informez l’utilisateur ($this->error=… dans une classe et setEventMessage dans une page).

3 « J'aime »