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

Outils MySQL Discussion :

Enregistrer une valeur NULL (vide) issue d'un formulaire


Sujet :

Outils MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2018
    Messages : 38
    Points : 36
    Points
    36
    Par défaut Enregistrer une valeur NULL (vide) issue d'un formulaire
    Lorsque je ne saisis rien dans le champ du formulaire, je souhaite que la base de données SQL indique 'NULL' dans le champ correspondant. Pour celà, j'ai paramétré la ligne de cette donnée à la valeur par défaut = 'NULL'. Malgré ça, c'est la valeur '0' qui est enregistrée.J'ai essayé plusieurs types de variables (text, number dans le formulaire et varchar, float dans la table). Rien n'y fait, Je joins le scripts de mon banc d'essai
    Je joins d'abord le script du formulaire de saisie
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8"/>
        </head>
     
     
    			<article class="sous_centrale4"id="sous_centrale4">
    <?php	
    // Rapport d'erreurs activé:
     
    		ini_set('display_errors',1);
    		error_reporting(E_ALL);	
     
    ?>
     
    <table>
    	<form action="testFloatval.php" method="post">
     
    	<tr>
    		<th><label for="variable">VARIABLE</label> :</th>
    		<td><input type="text" name="variable" id="variable"/></td>
    	</tr>
    	<tr>
    		<th><label for="variable">TYPE</label> :</th>
    		<td><select type="text" name="type" id="type"/>
    		<option value="Text">Text</option>
    		<option value="NumberFloat">NumberFloat</option>
    		<option value="NumberVarchar">NumberVarchar</option>				
    		</select></td>
    	</tr>	
    		<th><label for="Envoyer"></label> </th>
    		<td><input type="submit" value="ENREGISTRER" /></td>
     
    	</form>
    </table>
     
    			</article>		
     
    </html>
    Je joins ensuite le script PhpMySql de transfert vers la bdd
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
    	$variable1=$_POST['variable'];
    	$variable2= floatval($variable1);
    	echo '<p>VARIABLE 1 = '.$variable1.'</p>';
    	echo '<p>VARIABLE 2 = '.$variable2.'</p>';	
    ?>
    <?php
     
    // Connexion à la base de données
     
    		try
    		{
    		$bdd = new PDO('mysql:host=localhost;dbname=varchar_float;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    		}
    catch(Exception $e)
    		{
            die('Erreur : '.$e->getMessage());
    		}
     
    // Rapport d'erreurs activé:
     
    		ini_set('display_errors',1);
    		error_reporting(E_ALL);			
     
    	$req=$bdd->prepare('INSERT INTO variableForeceeNull (variableText, variableNumberFloat, variableNumberVarchar) VALUES (:variableText, :variableNumberFloat, :variableNumberVarchar)');
     
    	$req->execute(array(
    	'variableText'=>$variable2,
    	'variableNumberFloat'=>$variable2,
    	'variableNumberVarchar'=>$variable2	
    	)); 
     
    ?>
    Merci de toute suggestion. CaptainChistian

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 102
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 102
    Points : 8 212
    Points
    8 212
    Billets dans le blog
    17
    Par défaut
    Ton script est dur à lire.

    Avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <td><input type="text" name="variable" id="variable"/></td>
    $_POST['variable'] sera toujours récupérée, même si rien n'est saisi.

    Si dans ta base tu veux NULL à la place d'une chaîne vide, alors tu peux faire :

    INSERT INTO ta_table (col_variable)
    VALUES (NULLIF(:col_variable, ''));
    => NULLIF() retourne NULL si :col_variable est égale au 2nd paramètre (ici une chaîne SQL vide), sinon retourne la valeur :col_variable


    Voilà pour ton besoin. Dans la pratique avoir une chaîne vide est plutôt mieux que NULL, car avec une chaîne vide tu sais que l'utilisateur n'a rien saisi, alors qu'avec NULL tu ne le sais pas (valeur inconnue).
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 735
    Points
    52 735
    Billets dans le blog
    5
    Par défaut
    NULL et chaine vide n'étant pas du tout la même chose certaines requêtes donneront des résultats faux, notamment dans les calculs d’agrégation, les opérations ensembliste, les concaténations....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 102
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 102
    Points : 8 212
    Points
    8 212
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    NULL et chaine vide n'étant pas du tout la même chose certaines requêtes donneront des résultats faux, notamment dans les calculs d’agrégation, les opérations ensembliste, les concaténations....
    Merci de le rappeler. J'espère que cette remarque ne s'adresse pas à moi
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Je pense que la réponse de Frédéric s'adresse à captainchristian à cause du titre de son sujet : "enregistrer une valeur null (vide) [...]"

    Titre qui comporte deux erreurs :
    • la première, soulignée par Frédéric, qui consiste à confondre "null" et vide, notions totalement différentes, à l'exception notable d'Oracle qui confond les deux
    • la deuxième qui consiste à parler de valeur "null", alors que "null" est tout le contraire d'une valeur, c'est un marqueur d'absence de valeur !


    Pour bien voir la différence :

    Code SQL : 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
    19
    20
    create table T1
         (  T1ID integer primary key
          , T1C1 char(1)
          , T1C2 char(1)
         )
    ;
    insert into T1 (T1ID, T1C1, T1C2)
    values (1, '', '')
         , (2, '', null)
         , (3, null, null)
    ;
    select T1ID
         , T1C1
         , T1C2
         , case when T1C1=T1C2 then 'égal'
                else 'différent'
           end as egal
         , concat ('AAA', T1C1, 'BBB', T1C2, 'CCC') as  conc
    from T1
      ;

    Résultat :

    Nom : Sans titre.png
Affichages : 59
Taille : 3,5 Ko

    On constate qu'une chaîne de caractères vide est égale à une autre chaîne vide (ligne 1) alors qu'une colonne marquée "null" n'est ni égale à une chaîne vide (ligne 2), ni à une colonne marquée "null" (ligne 3).
    "null" ne sera jamais égal à quoi que ce soit, puisque, par définition, ça signifie que la valeur est inconnue.

    De plus, comme le mentionnait Frédéric, si on concatène une chaîne de caractères avec une colonne marquée "null", alors le résultat est une colonne marquée "null" (lignes 2 et 3)

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2018
    Messages : 38
    Points : 36
    Points
    36
    Par défaut Enregistrer une valeur NULL (vide) issue d'un formulaire
    A l'attention de Seb
    J'ai simplifié le script. J'ai tenté d'appliquer la fonction SQL NULLIF() mais ça ne marche pas; Je joins les nouveaux scripts
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8"/>
        </head>
     
     
    			<article class="sous_centrale4"id="sous_centrale4">
    <?php	
    // Rapport d'erreurs activé:
     
    		ini_set('display_errors',1);
    		error_reporting(E_ALL);	
     
    ?>
     
    <table>
    	<form action="testFloatval.php" method="post">
     
    	<tr>
    		<th><label for="variable">VARIABLE</label> :</th>
    		<td><input type="text" name="variable" id="variable"/></td>
    	</tr>
    		<th><label for="Envoyer"></label> </th>
    		<td><input type="submit" value="ENREGISTRER" /></td>
    	</tr>												
    	</form>
    </table>
     
    			</article>		
     
    </html>
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?php
    	$variable1=$_POST['variable'];
     
    	echo '<p>VARIABLE 1 = '.$variable1.'</p>';	
     
    // Connexion à la base de données
     
    		try
    		{
    		$bdd = new PDO('mysql:host=localhost;dbname=varchar_float;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    		}
    catch(Exception $e)
    		{
           die('Erreur : '.$e->getMessage());
    		}
     
    // Rapport d'erreurs activé:
     
    		ini_set('display_errors',1);
    		error_reporting(E_ALL);			
     
    	$req=$bdd->prepare('INSERT INTO variableForeceeNull (variableText) VALUES (NULLIF(:variableText,''))');	
     
    	$req->execute(array(
    	'variableText'=>$_POST['variable']	
    	)); 
     
    ?>
    Merci de ton aide. Captainchristian

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 735
    Points
    52 735
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Merci de le rappeler. J'espère que cette remarque ne s'adresse pas à moi
    Si, si... Je te visais particulièrement.... Mais comme tu as un casque !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/02/2013, 22h18
  2. Enregistrer une valeur vide dans un champ DATE
    Par delilou dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 25/01/2012, 15h54
  3. Enregistrer une valeur NULL dans un sgbd
    Par gastoncs dans le forum VB.NET
    Réponses: 5
    Dernier message: 01/10/2011, 10h43
  4. Réponses: 4
    Dernier message: 05/08/2009, 09h23
  5. Réponses: 2
    Dernier message: 21/12/2007, 16h05

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