Page 1 sur 1

UPDATE dans champ FLOAT, valeur vide impossible ?

Posté : 13 avr. 2010, 19:58
par VaN
Bonsoir, je cherche à mettre à jour une ligne d'une de mes tables, de cette manière :
UPDATE cotisations_paliers SET palier_nom = 'Palier 5', palier_min = '150000', palier_max = '', palier_taux = '0.3' WHERE palier_id = '5'
Voici la structure de la table :
CREATE TABLE IF NOT EXISTS `cotisations_paliers` (
`palier_id` tinyint(4) NOT NULL AUTO_INCREMENT,
`palier_nom` varchar(50) NOT NULL,
`palier_min` float NOT NULL,
`palier_max` float DEFAULT NULL,
`palier_taux` float NOT NULL,
PRIMARY KEY (`palier_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

INSERT INTO `cotisations_paliers` (`palier_id`, `palier_nom`, `palier_min`, `palier_max`, `palier_taux`) VALUES
(1, 'Palier 1', 0, 14999, 2.5),
(2, 'Palier 2', 48000, 44999, 1.7),
(3, 'Palier 3', 45000, 74999, 1.2),
(4, 'Palier 4', 75000, 149999, 1),
(5, 'Palier 5', 150000, NULL, 0.3);
Or, cette requête insère un 0 au lieu d'une valeur vide, dans le champ palier_taux. J'ai essayé en changeant le type du champ palier_max sur VARCHAR, et là, aucun problème, j'ai bien une cellule vide.

Je ne peux pas garder un champ de type FLOAT, et y mettre une valeur vide ?

Re: UPDATE dans champ FLOAT, valeur vide impossible ?

Posté : 14 avr. 2010, 14:55
par macgawel
Bonjour.

Deux choses :
- Dans ta définition de table, tu as `palier_max` float DEFAULT NULL. Du coup, si tu ne le définis pas dans ton UPDATE, il prendra la valeur par défaut (NULL) :mrgreen:

- NULL (SQL) != NULL (PHP) != ''
traduction :
Tu demandes à SQL de mettre la valeur '' dans palier_max. Comme le champ est définit en FLOAT, la chaîne de caractères vide est "transformée" en FLOAT => 0.
Il faudrait demander à SQL de mettre la valeur NULL...

Re: UPDATE dans champ FLOAT, valeur vide impossible ?

Posté : 14 avr. 2010, 17:22
par VaN
Ok, mais comment je prépare ça en PHP ?

Voici mon script PHP et ma requête :
$clean["palier_id"] = mysql_real_escape_string($palier_id);
$clean["palier_nom"] = mysql_real_escape_string($palier_nom);
$clean["palier_min"] = mysql_real_escape_string($_POST["palier_min"][$palier_id]);
$clean["palier_max"] = mysql_real_escape_string($_POST["palier_max"][$palier_id]);
$clean["palier_taux"] = mysql_real_escape_string($_POST["palier_taux"][$palier_id]);
		
if(empty($clean["palier_max"])) {
		$clean["palier_max"] = NULL;
}

sql_query(sprintf("UPDATE ".$tables["cotisations_paliers"]." SET palier_nom = '%s', palier_min = '%s', palier_max = '%s', palier_taux = '%s' WHERE palier_id = '%d'", 
$clean["palier_nom"], $clean["palier_min"], $clean["palier_max"], $clean["palier_taux"], $clean["palier_id"]));
Or, le $clean["palier_max"] = NULL; en PHP ne marche clairement pas.