Page 1 sur 1

la validation du formulaire n'accepte pas un champs vide

Posté : 16 déc. 2006, 23:02
par ritpas
Bonjour,

j'ai créé un formulaire dont la validation ajoute un nouveau membre dans une base MYSQL "adherent". Le formulaire peut-être trouvé à l'adresse ci-dessous :
http://www.femmesbusinessangels.fr/maqu ... ement.html

Dans le champs "nombres d'enfants à charge : ", si on ne met rien, le formulaire ne se valide pas et signale une erreur de syntaxe mysql. par contre, si on met un nombre, le formulaire est validé et la base alimentée.
Le champs concerné dans la base MYSQL s'appelle "nb_enfants" et a les attributs suivants :
nb_enfants tinyint(3) UNSIGNED ZEROFILL Oui NULL

=> il davrait donc accepter les valeurs "nulles", pourtnat c'est pas le cas

Pourquoi?

Merci de votre aide

Pascal

Posté : 16 déc. 2006, 23:05
par Cyrano
Ajoute DEFAULT '0', ça simplifiera le problème.

Posté : 16 déc. 2006, 23:39
par Invité
ça ne marche pas, vu que j'ai définit le champs en type TINY INT, la valeur '0' par défaut n'est pas acceptée ce qui est logique.
Par ailleurs, si je remplace par 0 sans guillemet, le pb est toujours le même.
Bizarre mais je sais qu'on est pas loin de la solution.

merci

Posté : 16 déc. 2006, 23:57
par Invité
J'avais un peu mal compris ton commentaire...

si on exporte la table, le champs "nb_enfants" est défini par :
nb_enfants tinyint(1) unsigned zerofill default '0'

il ya donc bien default '0', cependant ça ne marche toujours pas :(

Posté : 17 déc. 2006, 01:01
par Cyrano
Fais afficher la requête envoyée et colle ça ici avec le cas échéant le message d'erreur renvoyé. En option appréciée, envoie aussi la structure de la table.

Posté : 19 déc. 2006, 12:17
par ritpas
ci-dessous la structure de la table avec notamment la structure du champs nb_enfants :

Code : Tout sélectionner

CREATE TABLE `adherent` ( `id_membre` int(10) unsigned NOT NULL auto_increment, `nom` tinytext NOT NULL, `prenom` tinytext NOT NULL, `pass` tinytext NOT NULL, `email` longtext NOT NULL, `date_demande` date NOT NULL COMMENT 'date de la demande d''adhesion', `date_naissance` date NOT NULL COMMENT 'date de naissance du membre', `adresse` mediumtext NOT NULL, `code_postal` varchar(5) NOT NULL, `ville` tinytext NOT NULL, `tel_portable` varchar(15) NOT NULL, `tel_fixe` varchar(15) default NULL, [b] `nb_enfants` tinyint(4) default NULL COMMENT 'nombre d''enfants à charge',[/b] `date_adhesion` date default NULL COMMENT 'date d''adhesion après validation', `statut` enum('TEMP','FBA','PORTEUR') default 'TEMP', `souhait_statut` enum('FBA','PORTEUR') NOT NULL default 'PORTEUR', `PT` enum('OUI','NON') NOT NULL default 'NON' COMMENT 'FBA appartenant au pôle technique', `CA` enum('OUI','NON') NOT NULL default 'NON' COMMENT 'FBA appartenant au Conseil d''administration', PRIMARY KEY (`id_membre`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Adhérent de FBA';
Voici na requête envoyée :

Code : Tout sélectionner

INSERT INTO adherent(id_membre,nom,prenom,pass,email,date_demande,date_naissance,adresse,code_postal,ville,tel_portable,tel_fixe,nb_enfants,date_adhesion, statut, souhait_statut,PT,CA) VALUES ('','$nom','$prenom','$pass','$email','$date_demande','$date_naissance','$adresse','$code','$ville','$tel_portable','$tel_fixe' ,$nb_enfants,'0000-00-00','TEMP','$souhait_statut','NON','NON')
Pour l'instant, j'ai contourné le problème via php, si aucune valeur n'est fixée lors de la validation du formulaire pour le champs nb_enfants, je lui fixe une valeur par défaut via php égale à 0.

Posté : 19 déc. 2006, 12:44
par Cyrano
Note : quand on demande une structure de table, on ne demande pas la requête de création, on souhaiterait voir ceci :

Code : Tout sélectionner

mysql> DESC `adherent`; +----------------+------------------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+------------------------------+------+-----+---------+----------------+ | id_membre | int(10) unsigned | NO | PRI | NULL | auto_increment | | nom | tinytext | NO | | NULL | | | prenom | tinytext | NO | | NULL | | | pass | tinytext | NO | | NULL | | | email | longtext | NO | | NULL | | | date_demande | date | NO | | NULL | | | date_naissance | date | NO | | NULL | | | adresse | mediumtext | NO | | NULL | | | code_postal | varchar(5) | NO | | NULL | | | ville | tinytext | NO | | NULL | | | tel_portable | varchar(15) | NO | | NULL | | | tel_fixe | varchar(15) | YES | | NULL | | | nb_enfants | tinyint(4) | YES | | NULL | | | date_adhesion | date | YES | | NULL | | | statut | enum('TEMP','FBA','PORTEUR') | YES | | TEMP | | | souhait_statut | enum('FBA','PORTEUR') | NO | | PORTEUR | | | PT | enum('OUI','NON') | NO | | NON | | | CA | enum('OUI','NON') | NO | | NON | | +----------------+------------------------------+------+-----+---------+----------------+ 18 rows in set (0.01 sec)
Ça facilite beaucoup la lecture et ceux qui répondent n'ont pas toujours le temps de créer les tables en local pour voir ça.

Bon, je regarde rapidement et je reviens là-dessus.

Posté : 19 déc. 2006, 12:48
par ritpas
Désolé. Tu m'as quelque chose.

En tous cas, merci pour ton aide.

Posté : 19 déc. 2006, 12:51
par Cyrano
Autre problème : je t'ai mentionné : "Fais afficher ta requête" : tu as envoyé l'extrait de code alors que j'aurais souhaité que tu fasse ceci :
<?php
$sql = "INSERT INTO adherent(nom, prenom, pass, email, date_demande, date_naissance, adresse, code_postal, ville, tel_portable, tel_fixe, nb_enfants, date_adhesion, statut, souhait_statut, PT, CA) ".
       "VALUES ('". $nom ."', '". $prenom ."', '". $pass ."', '". $email ."', '". $date_demande ."', '". $date_naissance ."', '". $adresse ."', '". $code ."', '". $ville ."', '". $tel_portable ."', '". $tel_fixe ."' , ". $nb_enfants .", '0000-00-00', 'TEMP', '". $souhait_statut ."', 'NON', 'NON')";
echo("<p>". $sql ."</p>");
?>
Et ensuite que tu nous mettes ici ce que ça affiche à l'écran dans la page. S'il y a des variables indéfinies, on ne pourra pas le savoir autrement.

Posté : 21 déc. 2006, 11:33
par fgranjon
Je ne sais si tu as eu ta réponse ,je vais quand même répondre au cas ou.

Ton problème est lié a ta requète sql, pour faire simple , tu te retrouves avec 2 virgules d'affilées c'est cela qui est invalide .

syntaxe invalide:

Code : Tout sélectionner

insert into tablex values ('une valeur',,'une autre valeur')
Les syntaxes valides pour cette même requète sont:

Code : Tout sélectionner

insert into tablex values ('une valeur',null,'une autre valeur')

Code : Tout sélectionner

insert into tablex values ('une valeur',0,'une autre valeur')

Code : Tout sélectionner

insert into tablex values ('une valeur','','une autre valeur')
Donc effectivement quand tu forces ta variable à 0 , tu te retrouves dans une syntaxe valide (la n°2)

Après les valeurs par défaut d'un champ ne sont utilisées que quand tu fais un insert et que tu omets des champs .
Imagine une table "essais" avec 3 champs :
  • champ1
    champ2
    champ3 default null
tu va pouvoir faire un insert en faisant :

Code : Tout sélectionner

insert into essais (champ1,champ2) values ('val1','val2');
La tu ne précise pas champ3 donc il prendra sa valeur par défaut.

Posté : 21 déc. 2006, 19:14
par ritpas
merci pour ta réponse!!

Mais je ne vais plus modifier le sql, je laisse la solution consistant à mettre une valeur par défaut via programmation.