Pourquoi mes champs doivent être obligatoires pour s'insérer
Résolu
OpenWeb
-
OpenWeb -
OpenWeb -
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.
Edit: Précision du langage dans la coloration syntaxique.
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:
- Pourquoi mes champs doivent être obligatoires pour s'insérer
- Insérer video powerpoint - Guide
- Insérer signature word - Guide
- Insérer liste déroulante excel - Guide
- Insérer sommaire word - Guide
- Insérer espace insécable word - Guide
4 réponses
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)
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 :
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;
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.
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 :
Cela évite des erreurs... surtout si tu changes l'ordre de tes champs dans ta table pour x ou y raisons. par exemple.....
(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.....
Et ça t'a inséré la ligne dans ta BDD ou pas ?
Si ça ne l'a pas inséré ... tu fais ceci :
Tu récupères la requête qui s'affichera sur ta page ... et tu la testes en direct dans ta BDD.
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.
Ok,
Tu peux tester ceci :
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);
J'ai essayé avec le PS2:
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.
<?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.
(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
.
==>>> Montres ton code modifié
Et quand tu dis ça ne marche pas ... c'est à dire ?? Merci de nous donner plus de détails.