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

Langage PHP Discussion :

Column cannot be null


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    routier
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : routier
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Points : 31
    Points
    31
    Par défaut Column cannot be null
    Bonjour,

    Lorsque je saisi dans un formulaire une mesure avec un chiffre autre que 0.5, 1, 1.5 etc etc , j'ai cette erreur :
    Exception PDO: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'stock_reel' cannot be null

    mon code:
    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
    <?php
        //Rien de reçu => on bosse pas
        if (!empty($_POST)) {
            //Je mets tout dans un T/C
            try {
                //TOUJOURS ACTIVER LES EXCEPTIONS
                $bdd = new PDO('mysql:host=localhost;dbname=crealis;charset=utf8', 'root', '',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
                $toutes_donnees = $bdd->query('SELECT * FROM stock_antigel')->fetchAll();
                $requeteUpdate = "UPDATE stock_antigel SET mesure_observee = :mesure_observee,stock_reel = :stock_reel WHERE id = :id";
                $stmt = $bdd->prepare($requeteUpdate);
                $stmt->bindParam(':mesure_observee', $mesure, PDO::PARAM_STR);
                $stmt->bindParam(':stock_reel', $stock_reel, PDO::PARAM_INT);
                $stmt->bindParam(':id', $id, PDO::PARAM_INT);
                foreach($toutes_donnees as $donnees){
                    $id = $donnees['id'];
                    $mesure = $_POST["mesure_observee$id"];
                    $hauteur =$_POST["mesure_observee"];
                   if($donnees['facteur_conversion_mesureareel'] != 0){
                    $stock_reel = $mesure * $donnees['facteur_conversion_mesureareel'];}
                    else{
                    $toutes_tables = $bdd->prepare('SELECT volume FROM table_stockage WHERE hauteur = :hauteur');
                    $toutes_tables->bindParam(':hauteur',$donnees['mesure_observee'], PDO::PARAM_STR);
                    $toutes_tables->execute();
                   foreach($toutes_tables as $table){
                    $stock_reel = $table['volume'];
                   }}
     
                    if (!$stmt->execute()) {
                        throw new Exception('ERREUR UPDATE (ID '.$_POST['id'].')');
                    }
                } //fin foreach
                header('Location: index.php');
             }catch (PDOException $pdoE) {
                echo 'Exception PDO: '.$pdoE->getMessage();
            } catch (Exception $e) {
                echo 'Exception Autre: '.$e->getMessage();
            }
        }
    Par contre pour les valeurs entière ou en 1/2 genre 0.5, 1, 1.5 ...
    $stock_reel me retourne bien le bon résultat

  2. #2
    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
    PARAM_INT ca signifie "entier", utilise PDO:ARAM_STR
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    routier
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : routier
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Points : 31
    Points
    31
    Par défaut
    Bonjour,
    je me suis arraché les cheveux quand j'ai vu ta réponse vu le temps que j'ai passé dessus , malheureusement ça n' a pas résolu mon problème
    Merci

  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
    D'ou vient $stock_reel ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    routier
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : routier
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Points : 31
    Points
    31
    Par défaut
    stock_reel est un champ de ma table stock_antigel:
    Nom : snapshot10.png
Affichages : 234
Taille : 23,5 Ko
    qui se remplit suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $stock_reel = $mesure * $donnees['facteur_conversion_mesureareel'];
    si un autre champ facteur_conversion_mesureareel n'est pas égal à 0
    si ce facteur est égal à 0 , il va chercher dans la table table_stockage la valeur de volume pour une certaine hauteur:
    Nom : snapshot9.png
Affichages : 228
Taille : 21,5 Ko

    Enfin c'est ce que j'espérais faire

  6. #6
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Salut,

    s'agit-il d'une màj de masse ?
    Parce que je n'ai pas trop compris l'intérêt de ces 2 foreach.
    Dans le else, $stock_reel (qui semble être une colonne calculée) peut être NULL si la requête échoue et il n'y a pas de fetch.
    Le bienfait n'est jamais perdu

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    routier
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : routier
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Points : 31
    Points
    31
    Par défaut
    Salut Willy,
    je suis pas sur de comprendre ce que tu appelles mise à jour de masse mais non, j' essaye de créer ce programme
    j'ai rajouté le fetch et effectivement:
    Call to a member function bindValue() on null in /var/www/html/crealis/stock_antigel_update.php:22 Stack trace: #0 {main} thrown in /var/www/html/crealis/stock_antigel_update.php on line 22
    La ligne 22 est:
    $toutes_tables->bindParam(':hauteur',$hauteur, PDO::PARAM_STR)Mais pourquoi elle est null , je défini $ hauteur plus haut par $hauteur = $_POST["mesure_observee"];Quant au foreach, si je le met pas , je récupère un array,non?

  8. #8
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Je demande si c'est une ligne que vous voulez mettre à jour ou toutes les lignes de la table stock_antigel?
    Le bindValue, il sort d'où ? Et où avez-vous placé le fetch dans votre code ?
    Concernant le volume (qui réeprésente la valeur de $stock_reel quand le facteur est égal à 0) puisqu'elle dépend de la valeur de la hauteur, nous sommes d'accord sur le fait que la valeur $_POST['mesure_observe'] (vous avez mis $donnees['mesure_observee'] dans votre code initial) doit être présente dans la table table_stockage non ?
    Et si vous avez apporté des modifications, postez le nouveau code
    Le bienfait n'est jamais perdu

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    routier
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : routier
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Points : 31
    Points
    31
    Par défaut
    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
    <?php
        //Rien de reçu => on bosse pas
        if (!empty($_POST)) {
            //Je mets tout dans un T/C
            try {
                //TOUJOURS ACTIVER LES EXCEPTIONS
                $bdd = new PDO('mysql:host=localhost;dbname=crealis;charset=utf8', 'root', 'lionel0769',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
                $toutes_donnees = $bdd->query('SELECT * FROM stock_antigel')->fetchAll();
                $requeteUpdate = "UPDATE stock_antigel SET mesure_observee = :mesure_observee,stock_reel = :stock_reel WHERE id = :id";
                $stmt = $bdd->prepare($requeteUpdate);
                $stmt->bindParam(':mesure_observee', $mesure, PDO::PARAM_STR);
                $stmt->bindParam(':stock_reel', $stock_reel, PDO::PARAM_STR);
                $stmt->bindParam(':id', $id, PDO::PARAM_INT);
                foreach($toutes_donnees as $donnees){
                    $id = $donnees['id'];
                    $mesure = $_POST["mesure_observee$id"];
                   if($donnees['facteur_conversion_mesureareel'] != 0){
                    $stock_reel = $mesure * $donnees['facteur_conversion_mesureareel'];}
                    else{
                    $toutes_tables = $bdd->prepare("SELECT volume FROM table_stockage WHERE hauteur = :hauteur");
                    $toutes_tables->bindParam(':hauteur',$mesure, PDO::PARAM_STR);
                    $toutes_tables->execute();
                    $mesure = $_POST["mesure_observee$id"];
                    foreach($toutes_tables as $table){
                    $stock_reel = $table->fetch(PDO::FETCH_ASSOC);
                   }}
     
                    if (!$stmt->execute()) {
                        throw new Exception('ERREUR UPDATE (ID '.$_POST['id'].')');
                    }
                } //fin foreach
                header('Location: index.php');
             }catch (PDOException $pdoE) {
                echo 'Exception PDO: '.$pdoE->getMessage();
            } catch (Exception $e) {
                echo 'Exception Autre: '.$e->getMessage();
            }
        }
    ?>
    sur mon formulaire j'ai plusieurs champs:
    Nom : snapshot9.png
Affichages : 239
Taille : 10,6 Ko

    Tous ces champs se mettent à jour en même temps.
    Sur l'image, MEG, MPG, SOUDE fonctionne car le facteur de conversion est != 0
    Si le facteur de conversion est = 0 , je voudrais aller chercher le volume suivant la hauteur donc $mesure que j'ai saisi auparavant dans la table table_stockage

    Donc je ne veux pas modifier la table table_stockage mais la table stock_antigel en récupérant une valeur dans table_stockage

    le bindValus c'est une modification que j'avais fait pour essayer à la place du BindParam ici
    $toutes_tables->bindParam(':hauteur',$mesure, PDO::PARAM_STR);le fetch je l'avais placé la :
    $toutes_tables = $bdd->prepare("SELECT volume FROM table_stockage WHERE hauteur = :hauteur");mais rechangé depuis(voir code de ce message), je suis pas sur que c'est mieux

  10. #10
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Comme je l'ai dit, c'est quand le facteur est égal à 0 que le stock peut être NULL.
    Si par exemple $mesure vaut 1000 , il n y a aucune correspondance de cette hauteur dans la table table_stockage , dans ce cas on aura un NULL
    Donnez le formulaire généré.
    Le bienfait n'est jamais perdu

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    routier
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : routier
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Points : 31
    Points
    31
    Par défaut
    Oui, ça j'y avais pensé, je pensais géré cela avec des conditions
    Mais la c'est pas le cas:
    Nom : snapshot9.png
Affichages : 217
Taille : 60,1 Ko
    mes essais sont fait avec les valeurs de l'image de mon post précédent

  12. #12
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Dans le else, essayez ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $stmt = $bdd->prepare("SELECT volume FROM table_stockage WHERE hauteur = :hauteur");
    $stmt->bindValue('hauteur', $_POST["mesure_observee$id"]);
    $stmt->execute();
    $stock_reel = $stmt->fetchColumn(); //Peut être FALSE, si on a aucune correspondance
    Dans ce cas cas, il faut obligatoirement que la valeur de $_POST["mesure_observee$id"] soit présente dans la table table_stockage. Après la condition peut devenir un truc comme ça

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ($stock_reel === FALSE && !$stmt->execute()) {
        throw new Exception('ERREUR UPDATE (ID '.$_POST['id'].')');
    }
    Le bienfait n'est jamais perdu

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    routier
    Inscrit en
    Octobre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : routier
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2011
    Messages : 44
    Points : 31
    Points
    31
    Par défaut
    Salut,
    je viens de résoudre le problème, j'ai changé le type float en double
    Ceci m'a changé certaines valeurs genre 1.45 (avec le float) en 1.45000096875( avec le double), j'ai corrigé cette valeur en 1.45 et ça me retourne bien ce que je veux
    Merci de ton aide Willy

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/06/2012, 12h18
  2. [Mapping] MySQLIntegrityConstraintViolationException: Column cannot be null
    Par Floflo_85 dans le forum Hibernate
    Réponses: 2
    Dernier message: 08/08/2011, 11h04
  3. Update list 'Column cannot be null'
    Par kogangel dans le forum Hibernate
    Réponses: 1
    Dernier message: 20/11/2009, 17h53
  4. [EJB][JBOSS] ejb column cannot be null
    Par alfredeu dans le forum Wildfly/JBoss
    Réponses: 2
    Dernier message: 14/04/2005, 09h40

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