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

EDI, CMS, Outils, Scripts et API PHP Discussion :

Colonne NULL


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Colonne NULL
    Bonjour,
    Le site de mon FAI fonctionne sous PHP 5.2.10 et MySQL 5.0.45.
    Pour un champ non obligatoire j'ai entré les paramètres : NULL oui et DEFALT : NULL.

    Que ce soit en MySQL ou en MySQLi et en utilisant la commande : "INSERT INTO table() VALUES() le champ n'affiche rien quand le champ du formulaire est vide et n'affiche surtout pas "NULL" . Ce qui perturbe les requêtes contenant la condition "IS NOT NULL"

    Que faire ?
    Merci d'avance

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 101
    Points : 4 446
    Points
    4 446
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function traitementPost($cle){
     $cle = $_POST[$cle]; // ...
     return "'".mysqli_real_escape_string(trim($cle))."'";
    }
    $valeur = empty($_POST['cle']) ? 'NULL' : traitementPost('cle');
    ensuite tout depend de la facon de construire la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'INSERT  values( ' . $valeur . ' )';
    $moi= ( !== ) ? : ;

  3. #3
    Futur Membre du Club
    Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci à papajoker pour la solution proposée

    MAIS :

    Avec le script proposé j'obtiens bien NULL (au sens VIDE) dans le champ de la table mais un champ vide quand je propose une valeur pour la variable.

    Il m'a semblé qu'il pouvait y avoir une confusion dans le script entre scle et 'clé'.
    J'obtiens le même résultat.

    Où est l'erreur ?
    ----------------------------------------------------------------
    Cidessous le sript ainsi que la table utilisée :

    Les parties objet d'un doute ont été commentées

    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
    <?php
    $serveur = "localhost";
    $base = "GACR";
    $utilisateur = "root";
    $mdp = "";
    $connexion = @mysqli_connect($serveur,$utilisateur,$mdp ,$base );
    ?>
     
    <?php
     function traitementPost($cle){
     $cle = /* $_POST[$cle]; */ $_POST['cle']; // ...
     return "'".@mysqli_real_escape_string(trim/* ('cle') */ ($cle))."'";
    }
     
    $ville = empty($_POST['ville']) ? 'NULL' : traitementPost($ville); 
    ?>
     
    <?php 
    $commande = "INSERT INTO essai ( ville ) VALUES (".$ville.")";
     
    $resultat =  mysqli_query($connexion,$commande);
    ?>
    ---- ------------------------------------------------
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE IF NOT EXISTS `essai` (
     
    `id` int(2) NOT NULL AUTO_INCREMENT,
     
    `ville` varchar(60) COLLATE latin1_general_ci DEFAULT NULL,
     
     PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     function traitementPost($cle){
       return  mysqli_real_escape_string(trim($_POST[$cle]));
    }
     
    $ville = empty($_POST['ville']) ? 'NULL' : traitementPost('ville');
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Futur Membre du Club
    Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Je ne comprend pas l'écriture $_POST[$cle]

    Je ne peux que recevoir du formulaire que $_POST['cle']

    éclairez ma lanterne SVP.

    Merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par brico-web Voir le message
    Je ne comprend pas l'écriture $_POST[$cle]
    Bonjour,
    relis le message de Sabotage :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function traitementPost($cle){
       return  mysqli_real_escape_string(trim($_POST[$cle]));
    }
    => $_POST[$cle] est dans la fonction traitementPost($cle), dont $cle est le paramètre.

    Concernant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ville = empty($_POST['ville']) ? 'NULL' : traitementPost('ville');
    => Opérateur de comparaison ternaire : $var = ([condition])? [si vrai] : [si faux];.
    Dernière modification par Invité ; 06/11/2013 à 16h14.

  7. #7
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 101
    Points : 4 446
    Points
    4 446
    Par défaut


    $cle est un nom de variable
    'cle' est une valeur

    assigne la valeur "toto" a la variable $cle
    Et oui $cle est différent de 'cle'

    ----------------
    Cours maternelle programmation PHP (je connais, j'suis passé par la)
    $moi= ( !== ) ? : ;

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    $cle est une variable qui prend la valeur de l'index qu'on veut traiter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $cle = 'ville';
    //$_POST[$clef] == $_POST['ville']
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Futur Membre du Club
    Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 6
    Points
    6
    Par défaut encore en difficulté
    Bonjour,

    -a- La fonction mysqli_real_escape_string() doit recevoir $connexion comme premier paramètre.

    -b- Le script suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $serveur = "localhost";
    $base = "gacr";
    $utilisateur = "root";
    $mdp = "";
    $connexion = mysqli_connect($serveur,$utilisateur,$mdp ,$base );
     
    $ville =  empty($_POST['ville'])? "NULL" :   mysqli_real_escape_string($connexion, trim($_POST['ville']))  ; 
     
    $sql = "INSERT INTO essai_NULL(ville) VALUES( '".$ville."')";
    $resultat = mysqli_query($connexion,$sql);
    ?>
    montre qu'il enregistre bien la valeur la valeur de $_POST['ville'] quand elle exixte mais enregistre la chaîne NULL et non la valeur NULL au sens de vide

    Le champ ville est pourtant paramétré pour accepter la valeur NULL et l'afficher par défaut.

    Pouvez-vous me mettre sur la voie du détail qui m'échappe
    merci

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "INSERT INTO essai_NULL(ville) VALUES( '".$ville."')";
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "INSERT INTO essai_NULL(ville) VALUES( ".$ville.")";

  11. #11
    Futur Membre du Club
    Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Toujours le même Pb
    Bonjour,
    Avec le script proposé la base ne reçoit rien lorsque je donne un valeur à $ville.Je ne suis pas surpris puisque l'écriture des VALUES doit traduire par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql="..........VALUES ( ' NANTES ' , ' PDL ' )"
    soit avec les variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql="....................VALUES (' ".$ville." ' , ' ".$region." ')" .
    Mon Pb reste entier

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ne mets les guillemets quand dans le cas "non null"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ville =  empty($_POST['ville'])? "NULL" :   mysqli_real_escape_string($connexion, "'" . trim($_POST['ville']) . "'")  ; 
     
    $sql = "INSERT INTO essai_NULL(ville) VALUES(".$ville.")";
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Futur Membre du Club
    Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 6
    Points
    6
    Par défaut ça va mieux ... mais : ...
    Bonjour,

    Merci pour l'aide jusqu'ici apportée.

    -a- Le problème posé ( NUL quand vide) est résolu si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ville =  empty($_POST['ville'])? "NULL" : "'" .  mysqli_real_escape_string($connexion,  trim($_POST['ville']) ). "'"  ;
    pour chaque variable et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ville =  empty($_POST['ville'])? "NULL" :    mysqli_real_escape_string($connexion,"'" . trim($_POST['ville']). "'"  ) ;
    comme conseillé.

    -b-Si je définis une fonction bdd1($cle)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php 
     function bdd1($cle){
     
       return  "'". trim($cle)."'";
    } 
     
    $nom =  empty($_POST['nom'])? "NULL" : bdd1($_POST['nom'])  ;
    ?>
    Le pb (NUL quand vide) est également résolu mais sans mysqli_real_escape_string()

    -c- Sij'introduis mysqli_real_escape_string() dans la fonction pour retrouver l'écriture variable par variable ça ne fonctionne plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php 
     function bdd2($cle){
     
       return  "'" .  @mysqli_real_escape_string($connexion,  trim($cle))."'"  ;
    } 
    $prenom =  empty($_POST['prenom'])? "NULL" : bdd2($_POST['prenom'])  ;
    ?>
    Pourquoi? et quelle est la solution ?

    Merci d'avance

  14. #14
    Invité
    Invité(e)
    Par défaut
    C'est pour ça que je préfère mettre une "chaine vide" plutôt que NULL dans mes champs...

    N.B. Quel intérêt d'insérer une ville "NULL" en BdD ?

  15. #15
    Futur Membre du Club
    Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    L'intérêt , pour moi, est que je travaille depuis plus de 10 ans sur des tables qui ont été servies jusque là avec le script de dreamweaver qui introduisait NULL pour les champs vides et que maintenant je dois continuer dans cette voie si par exemple je veux utiliser la condition "IS NOT NULL".

    Si j'ai bien compris je dois me résoudre au script "variable par variable ?

  16. #16
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Je ne m'embarquerai pas derrière jreaux62 et son conseil...

    Une autre approche ignorer les valeurs NULL des requêtes d'insertion.
    Si par exemple tu as 3 colonnes dans une table et que la 2ème est NULL, le sql devrait se résumer à
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO table (col1, col3) VALUES (:val1, :val3)
    Dans ce cas, le moteur de la base se chargera de la valeur de la colonne 2.

  17. #17
    Futur Membre du Club
    Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    reponse à rawsrc :

    Si je propose, par exemple sur un site, un formulaire d'adhésion à une association, certains postulants ont une adresse courriel,d'autres pas et le script d'insertion de l'enregistrement "email" est écrit une fois pour toutes.

  18. #18
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Effectivement si tout est codé en dur... Mais il est possible d'avoir un outil léger qui te valide les valeurs saisies et te génère automatiquement le SQL correspondant.

    Dans ton cas, tu dois te trimbaler partout des fonctions de validation et d'échappement de toutes les données alors que ces aspects sont grandement factorisables.

Discussions similaires

  1. ADO et les colonnes NULL
    Par qi130 dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/01/2008, 14h36
  2. composite-id et colonnes nulles
    Par mitje dans le forum Hibernate
    Réponses: 15
    Dernier message: 16/07/2007, 14h34
  3. Vérifier si colonne nulle dans résultat requete
    Par ouiskie dans le forum Requêtes
    Réponses: 1
    Dernier message: 04/03/2007, 07h45
  4. [2.0] Colonne nulle d'une table - Ajout de DataRow via BindingNavigator
    Par sundjata dans le forum Accès aux données
    Réponses: 5
    Dernier message: 16/11/2006, 03h23
  5. Comment faire un count de colonnes null
    Par claralavraie dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/01/2006, 14h13

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