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.