UPDATE dans champ FLOAT, valeur vide impossible ?

VaN
Mammouth du PHP | 1107 Messages

13 avr. 2010, 19:58

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 ?

Mammouth du PHP | 672 Messages

14 avr. 2010, 14:55

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...

VaN
Mammouth du PHP | 1107 Messages

14 avr. 2010, 17:22

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.