Pourquoi mes champs doivent être obligatoires pour s'insérer

Résolu/Fermé
OpenWeb - Modifié par Whismeril le 12/05/2015 à 10:42
 OpenWeb - 13 mai 2015 à 09:47
Bonjour,

Le problème c'est que je ne peux pas insérer les données de mes champs dans ma BDD, à condition que ces champs soient "tous" remplis, sauf que ces champs peuvent être NULL.
<?php
if (isset($_POST['valider']))
  {  
            $nom_contact=$_SESSION['nom_contact'];
      $reponse = $bdd->query("SELECT * FROM structure WHERE nom_contact='$nom_contact'");
   $donnees = $reponse->fetch(PDO::FETCH_ASSOC); 
   $id_struct=$donnees['id_struct'];
   while ($donnees = $reponse->fetch(PDO::FETCH_ASSOC))
     if ($donnees["id_struct"]==$id_struct) 
                $id_struct=$donnees['id_struct']; 

    $nationalite=$_POST['nationalite'];
    $statut_conflit=$_POST['statut_conflit'];
    $etat=$_POST['etat'];
    //$sepulture=$_POST['id_sepulture'];
    $sexe=$_POST['sexe'];
    $age=$_POST['age'];
    $particularite=$_POST['particularite'];
    $confession=$_POST['confession'];
    $institution=$_POST['institution'];
    $administrative=$_POST['administrative'];
                         $aide_sociale=$_POST['aide_sociale'];
                         $date_ajout = date('Y-m-d H:i:s'); 
    
PRINT_r($_POST).'<br />';
$bdd->exec("INSERT INTO categorisation VALUES (null,'$id_struct','$nationalite','$statut_conflit','$etat','4','$sexe','$age','$particularite','$confession','$institution','$administrative','$aide_sociale','$date_ajout',NULL)") or print_r($bdd->errorInfo());
  }
?> 


Edit: Précision du langage dans la coloration syntaxique.
A voir également:

4 réponses

jordane45 Messages postés 38150 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 avril 2024 4 651
12 mai 2015 à 10:52
Bonjour,
Tu dois t'assurer que les variables POST issues de ton formulaire existent AVANT de les utiliser .. et leur attribuer une valeur par défaut si elles n'existent pas.
Cela peut se faire ainsi (avec ISSET et l'écriture TERNAIRE)

$age=isset($_POST['age'])?$_POST['age']:'';


PS : Plutôt que d'autoriser les champs à NULL dans ta BDD, préfères les mettre "vide".

PS2 : Si tu tiens absolument les avoir à null ... il faudra que tu retires les QUOTES qui entourent tes variables dans la requêtes et les ajouter dans l'écriture ternaire
comme ceci :
$age=isset($_POST['age'])? "'".$_POST['age']."'":NULL;

1
jordane45 Messages postés 38150 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 avril 2024 4 651
12 mai 2015 à 10:56
Un autre solution serait d'utiliser les requêtes préparées
(ce que je te conseille d'utiliser.... pour TOUTES tes requêtes ... cela permet, entre autres choses, de limiter les risques d'injection SQL par des personnes mal intentionnées....)

https://www.php.net/manual/fr/pdo.prepare.php

.
0
Merci pour ta réponse. J'ai essayé mais ça ne change pas.
0
jordane45 Messages postés 38150 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 avril 2024 4 651 > OpenWeb
12 mai 2015 à 11:17
Tu as essayé QUOI ?

==>>> Montres ton code modifié

Et quand tu dis ça ne marche pas ... c'est à dire ?? Merci de nous donner plus de détails.
0
jordane45 Messages postés 38150 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 avril 2024 4 651
12 mai 2015 à 13:55
Commence par sortir la REQUETE de son exécution.
(cela te permettra d'en faire un ECHO pour savoir ce qu'elle contient exactement)

Ajoutes un bloc TRY/CATCH pour trapper les erreurs.



try {
$sql = "INSERT INTO categorisation 
          VALUES (null
                    ,$id_struct
                    ,$nationalite
                    ,$statut_conflit
                    ,$etat,4
                    ,$sexe
                    ,$age
                    ,$particularite
                    ,$confession
                    ,$institution
                    ,$administrative
                    ,$aide_sociale
                    ,'$date_ajout'
                    ,NULL";
$bdd->exec($sql)

} catch (Exception $e) {
    echo "<br><b>ERROR !</b><br>";
    echo $e->getMessage();
    echo "<br><b>REQUETE :</b><br>".$sql;
}


Si une erreur se produit, tu auras le message d'erreur exact ainsi que la requête qui l'a provoqué.
Tu prends la requête (qui sera affichée dans ta page....) et tu la testes en DIRECT 'c'est à dire... SANS PASSER PAR LE PHP ! ) dans ta BDD afin de voir ce qui ne vas pas.

Bien entendu... sans connaitre la structure de ta table .. impossible pour nous de t'en dire plus.


PS: Dans les requêtes INSERT ... il est préférable de préciser les champs sur lesquels tu fais l'insertion ...
Par exemple :
INSERT INTO matable (monChamp1,monChamp2,....)
                   VALUES ('valeur1','valeur2',...)


Cela évite des erreurs... surtout si tu changes l'ordre de tes champs dans ta table pour x ou y raisons. par exemple.....
1
J'ai copié ça, et il n'y a aucune erreur affichée
0
jordane45 Messages postés 38150 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 avril 2024 4 651 > OpenWeb
12 mai 2015 à 14:14
Et ça t'a inséré la ligne dans ta BDD ou pas ?

Si ça ne l'a pas inséré ... tu fais ceci :

try {
  $sql = "INSERT INTO categorisation 
          VALUES (null
                    ,$id_struct
                    ,$nationalite
                    ,$statut_conflit
                    ,$etat,4
                    ,$sexe
                    ,$age
                    ,$particularite
                    ,$confession
                    ,$institution
                    ,$administrative
                    ,$aide_sociale
                    ,'$date_ajout'
                    ,NULL";

  //le temps des tests :
  echo "<br><b>REQUETE :</b><br>".$sql;

 //exécution de la requête
  $bdd->exec($sql)

} catch (Exception $e) {
    echo "<br><b>ERROR !</b><br>";
    echo $e->getMessage();
    echo "<br><b>REQUETE :</b><br>".$sql;
}



Tu récupères la requête qui s'affichera sur ta page ... et tu la testes en direct dans ta BDD.
0
ça ne m'a rien inséré.
Maintenant, j'ai récupéré une requête : INSERT INTO categorisation VALUES (null ,20 ,'' ,'' ,'',4 ,'1' ,'2' ,'' ,'1' ,'' ,'1' ,'' ,'2015-05-12 14:32:46' ,NULL)
J'ai écrit ça en BDD, et j'ai une erreur : #1366 - Incorrect integer value: '' for column 'id_nationalite' at row 1
0
Dans la requête INSERT j'aurais dû avoir NULL au lieu de ' '
0
jordane45 Messages postés 38150 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 avril 2024 4 651
12 mai 2015 à 15:02
C'est quoi la structure de ta table ?
0
jordane45 Messages postés 38150 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 avril 2024 4 651
12 mai 2015 à 15:42
Ok,
Tu peux tester ceci :
$sql="
INSERT INTO `categorisation` 
            (  `id_struct`
              , `id_nationalite`
              , `id_statut_conflit`
              , `id_etat`
              , `id_sepulture`
              , `id_sexe`
              , `id_age`
              , `id_particularite`
              , `id_confession`
              , `id_institution`
              , `id_administrative`
              , `id_aide_sociale`
              , `date_ajout`
    ) VALUES (
             :id_struct
            ,:nationalite
            ,:statut_conflit
            ,:etat
            ,4
            ,:sexe
            ,:age
            ,:particularite
            ,:confession
            ,:institution
            ,:administrative
            ,:aide_sociale
            ,:date_ajout
           )";

$params = array(
             ":id_struct"=>$id_struct
            ,":nationalite"=>$nationalite
            ,":statut_conflit"=>$statut_conflit
            ,":etat"=>$etat
            ,":sexe"=>$sexe
            ,":age"=>$age
            ,":particularite"=>$particularite
            ,":confession"=>$confession
            ,":institution"=>$institution
            ,":administrative"=>$administrative
            ,":aide_sociale"=>$aide_sociale
            ,":date_ajout"=>$date_ajout);

 $prepare = $bdd->prepare($sql);
 $prepare->execute($params);

1
Bonjour,
Mon problème est résolu, et cela en faisant ceci :
$age=(isset($_POST['age']) && !empty($_POST['age']))? "'".$_POST['age']."'":'NULL';

Merci pour votre aide.
0
J'ai essayé avec le PS2:
<?php  
//date en France
date_default_timezone_set('Europe/Paris');
if (isset($_POST['valider']))
 {  
$nom_contact=$_SESSION['nom_contact'];
    echo $nom_contact;

      $reponse = $bdd->query("SELECT * FROM structure WHERE nom_contact='$nom_contact'");
   $donnees = $reponse->fetch(PDO::FETCH_ASSOC); 
   $id_struct=$donnees['id_struct'];
   while ($donnees = $reponse->fetch(PDO::FETCH_ASSOC))
     if ($donnees["id_struct"]==$id_struct) 
     $id_struct=$donnees['id_struct']; 


    $nationalite=isset($_POST['nationalite'])? "'".$_POST['nationalite']."'":NULL;
    $statut_conflit=isset($_POST['statut_conflit'])? "'".$_POST['statut_conflit']."'":NULL;
    $etat=isset($_POST['etat'])? "'".$_POST['etat']."'":NULL;
    //$sepulture=$_POST['id_sepulture'];
    $sexe=isset($_POST['sexe'])? "'".$_POST['sexe']."'":NULL;
    $age=isset($_POST['age'])? "'".$_POST['age']."'":NULL;
    $particularite=isset($_POST['particularite'])? "'".$_POST['particularite']."'":NULL;
    $confession=isset($_POST['confession'])? "'".$_POST['confession']."'":NULL;
    $institution=isset($_POST['institution'])? "'".$_POST['institution']."'":NULL;
    $administrative=isset($_POST['administrative'])? "'".$_POST['administrative']."'":NULL;
 $aide_sociale=isset($_POST['aide_sociale'])? "'".$_POST['aide_sociale']."'":NULL;
 $date_ajout = date('Y-m-d H:i:s'); 
    
PRINT_r($_POST).'<br />';
$bdd->exec("INSERT INTO categorisation VALUES (null,$id_struct,$nationalite,$statut_conflit,$etat,4,$sexe,$age,$particularite,$confession,$institution,$administrative,$aide_sociale,'$date_ajout',NULL)") or print_r($bdd->errorInfo()); 

}
?> 

J'ai tjrs la même erreur :
Array ( [0] => HY000 [1] => 1366 [2] => Incorrect integer value: '' for column 'id_nationalite' at row 1 )
Si je remplis la nationalité, j'aurais la même erreur mais pour le champ suivant (Incorrect integer value: for column 'id_statut_conflit' at row 1 )
Si je remplis la nationalité et le statut conflit, j'aurais l'erreur :
(Incorrect integer value: for column 'id_etat' at row 1 )
A chaque fois, j'ai cette erreur sur le 1er champ (dans l'ordre) qui n'est pas rempli.
0