IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Enregistrement de valeurs décimales


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Par défaut Enregistrement de valeurs décimales
    Bonjour,

    J'ai une base de données MySQL avec une table "biens" qui contient des biens immobiliers, qui possèdent entre autres des champs "superficie" et "montant" (c'est-à-dire loyer). Le formulaire comporte des zones de saisie qui permettent le contrôle de saisie de nombres décimaux, grâce à l'attribut step="any". Après les avoir testés, je constate qu'ils acceptent la virgule mais pas le point comme marqueur des décimales.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="number" step="any" required class="form-control" name="superficie">
    Pour faire les choses biens, au lieu d'enregistrer directement dans la base de données, je passe par l'instanciation d'un objet métier (pattern DAO). Afin de récupérer les données de mon formulaire, j'ai donc créé un "manager" ou objet "DAO", qui fait le lien entre mon objet métier et ma base de données. Il a donc une méthode "lire_formulaire()" que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static function lire_formulaire() {
    		$bien = new Bien();
     
    		foreach ($_POST as $key => $value) {
    			$setter = 'set'.ucfirst($key);
     
    			$bien->$setter($value);
    		}
     
    		return $bien;
    	}
    Cette méthode est appelée sur la page de traitement de mon formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (!empty($_POST)) {
    			$bien = BienDAO::lire_formulaire();
    			$dao = new BienDAO();
    			$dao->ajouter($bien);
     
    		}
    Quant à ajouter(), elle appelle la requête SQL pour enregistrer les données dans la base :

    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
    public function ajouter(Bien $bien) {
     
     
    		$req = $this->bdd->prepare("INSERT INTO biens (type,date_creation,date_modif,description,code_postal,ville,voie,superficie, montant, plusieurs) VALUES(:type,:date_creation,:date_modif,:description,:code_postal,:ville,:voie,:superficie,:montant,:plusieurs)");
    		$req->bindValue(':type',$bien->getType(),PDO::PARAM_STR);
    		$req->bindValue(':date_creation',date('Y-m-d'),PDO::PARAM_STR);
    		$req->bindValue(':date_modif',date('Y-m-d'),PDO::PARAM_STR);
    		$req->bindValue(':description',htmlspecialchars($bien->getDescription()),PDO::PARAM_STR);
    		$req->bindValue(':code_postal',$bien->getCode_postal(),PDO::PARAM_INT);
    		$req->bindValue(':ville',$bien->getVille(),PDO::PARAM_STR);
    		$req->bindValue(':voie',$bien->getVoie(),PDO::PARAM_STR);
    		$req->bindValue(':superficie',$bien->getSuperficie(),PDO::PARAM_INT);
    		$req->bindValue(':montant',$bien->getMontant(),PDO::PARAM_INT);
    		$req->bindValue(':plusieurs',$bien->isPlusieurs(),PDO::PARAM_BOOL);
     
    		$req->execute();
    		$req->closeCursor();
    	}
    Bref, lorsque la fonction est appelée, j'ai vérifié que les attributs $superficie et $montant de mon objet métier sont bien des floats, avec une décimale bien placée. A ce niveau-là, ça a donc l'air de marcher. Et c'est normal, puisque dans mon objet métier, j'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function setSuperficie($superficie) {
    		$this->superficie = (float) $superficie;
    	}
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function setMontant($montant) {
    		$this->montant = (float) $montant;
    	}
    Par ailleurs, mes champs 'superficie' et 'montant' de ma base de données sont des FLOAT. Tout devrait logiquement bien se passer. Pourtant, si je retourne sur ma base de données, ces champs n'ont pas de décimale, et sont arrondis à l'entier le plus proche.

    ...En écrivant ce post, je me rends compte que le problème vient certainement de PARAM_INT dans les lignes suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $req->bindValue(':superficie',$bien->getSuperficie(),PDO::PARAM_INT);
    $req->bindValue(':montant',$bien->getMontant(),PDO::PARAM_INT)
    En fait, il n'existe pas de constante PARAM_FLOAT, ou autre, pour les décimales. J'ai essayé de supprimer le paramètre, ou de mettre un PARAM_STR, mais rien ne fonctionne. Le résultat est toujours le même.

    Quelqu'un saurait-il pourquoi ? Merci de votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    • 1/ il faut utiliser PDO::PARAM_STR
    • 2/ la décimale est un point ou une virgule ?
    • 3/ comment sont définis les champs en base de données ? (DECIMAL... ?)

  3. #3
    Membre confirmé Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Par défaut
    Je l'ai dit : la décimale est exprimée par l'objet métier PHP. C'est donc, sauf erreur, un point. En réalité c'est un type float. Quant à la base de données, c'est un FLOAT, comme je l'ai précisé dans mon post. Et, comme je l'ai dit également, j'ai essayé PARAM_STR, ça ne marche pas non plus.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Donc... Tant pis ?

  5. #5
    Membre confirmé Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Par défaut
    Bah, non, pas tant pis... Il doit bien y avoir une solution ! Depuis 22 ans que PHP existe, ils n'ont pas pensé à donner la possibilité d'utiliser des données décimales dans une base de données ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Markos22 Voir le message
    ...C'est donc, sauf erreur, un point...
    Tu n'as jamais pensé à vérifier, pour en être CERTAIN ?
    Citation Envoyé par Markos22 Voir le message
    ...Quant à la base de données, c'est un FLOAT...
    OK. Ou DECIMAL(6,2)
    Citation Envoyé par Markos22 Voir le message
    ...j'ai essayé PARAM_STR, ça ne marche pas non plus.
    "ça ne marche pas" ne veut rien dire et n'apporte aucune information.
    Et, comme je l'ai dit, il faut utiliser PARAM_STR.

  7. #7
    Membre confirmé Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Par défaut
    Tu n'as jamais pensé à vérifier, pour en être CERTAIN ?
    J'ai vérifié, avec un var_dump de mon objet métier. Il me renvoie un float avec un nombre où la décimale est exprimée par un point. Mais comme ce n'est pas une chaîne de caractères, ce n'est ni un point ni une virgule, mais une valeur numérique.
    "ça ne marche pas" ne veut rien dire et n'apporte aucune information.
    Tu as raison, je vais être plus précis : ça ne me renvoie aucun message d'erreur, mais ça enregistre le nombre sous forme d'entier dans la base de données. Le nombre est donc arrondi.

  8. #8
    Invité
    Invité(e)
    Par défaut
    On est bien obligé de te croire sur parole, puisque tu ne montres rien...
    (ni résultat du var_dump, ni structure/type de la donnée en BdD)

    J'ai dit, et je redis donc :
    Citation Envoyé par jreaux62 Voir le message
    Et, comme je l'ai dit, il faut utiliser PARAM_STR.
    Du coup...


    N.B. Une autre action a réaliser : tester la requête directement dans phpMyAdmin.

Discussions similaires

  1. [AC-2003] Enregistrement de valeurs décimales
    Par tarnx dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/01/2010, 11h26
  2. Comparaison valeurs décimales
    Par Mvu dans le forum ASP
    Réponses: 1
    Dernier message: 21/03/2006, 17h23
  3. [Sql] susbstr et valeur décimale
    Par arezki76 dans le forum Oracle
    Réponses: 1
    Dernier message: 26/12/2005, 11h16
  4. saisie d'une valeur décimale dans un CSpinEdit
    Par Milowen dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/10/2005, 09h57
  5. Réponses: 4
    Dernier message: 20/06/2005, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo