[RESOLU] Insérer NULL dans la BDD lorsque le champs du formulaire n'est pas renseigné

Petit nouveau ! | 7 Messages

31 janv. 2017, 10:20

Bonjour !
Je suis un débutant en PHP, j'ai pour mission de faire un formulaire d'entrée de réservations, cependant je bloque à un endroit.
En effet, l'utilisateur doit rentrer des données via une formulaire php, appuyer sur un bouton qui executera donc une requête pour insérer dans la base de données, cependant je ne vois pas même après recherches comment insérer NULL dans la base de données si un champ optionnel n'est pas renseigné.

En gros, je ne vois pas comment faire pour mettre null dans la BDD si un champ n'est pas renseigné (j'ai une erreur dans visual studio me disant "Uncaught PDOException: SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect date value: '' for column 'DateFinRes'".
C'est peut être encore un peu brouillon niveau explication ! voici le code du formulaire

Code : Tout sélectionner

<p>Informations la réservation :</p> <form name="insertion" action="InsertionReservation.php" method="POST"> <table border="0" align="center" cellspacing="2" cellpadding="2"> <tr align="center"> <td id="TdBlur">Nom</td> <td><input type="text" name="nom" class="textbox"></td> </tr> <tr align="center"> <td id="TdBlur">Prénom</td> <td><input type="text" name="prenom" class="textbox"></td> </tr> <tr> <td id="TdBlur">Le véhicule est il réservé en permanence ?</td> <td><INPUT type= "radio" name="ResPerma" value="Oui">Oui</td> <td><INPUT type= "radio" name="ResPerma" value="Non">Non</td> </tr> <tr align="center"> <td id="TdBlur">Date du début de la réservation</td> <td><center><input type="date" name="DateDebutRes" class="textbox"></center></td> </tr> <tr align="center"> <td id="TdBlur">Date de fin de réservation</td> <td><center><input type="date" name="DateFinRes" class="textbox"></center></td> </tr> <tr align="center"> <td id="TdBlur">Type de véhicule</td> <td><center><input type="text" name="TypeVehicule" class="textbox"></center></td> </tr> <tr align="center"> <td id="TdBlur">Numéro d'identification du véhicule</td> <td><center><input type="text" name="NumId" class="textbox"></center></td> </tr> </tr> <tr align="center"> <td id="TdBlur">KMage du véhicule (si connu)</td> <td><center><input type="text" name="KmAvant" class="textbox"></center></td> </tr> <tr align="center"> <td colspan="2"><input type="submit" value="insérer" class="myButton"></td> </tr> </table> </form> </body> </body> </html>
Suivi du code avec la requête d'insertion :

Code : Tout sélectionner

<?php try { // PDO // Logins $bdd = new PDO('mysql:host=localhost;dbname=emprunt', 'root', '*********'); $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (Exception $e) { // Message erreur die('Erreur : ' . $e->getMessage()); } $tab = array( ':nom' => $_POST['nom'], ':prenom' => $_POST['prenom'], ':ResPerma' => $_POST['ResPerma'], ':DateDebutRes' => $_POST['DateDebutRes'], ':DateFinRes' => $_POST['DateFinRes'], ':TypeVehicule' => $_POST['TypeVehicule'], ':NumId' => $_POST['NumId'], ':KmAvant' => $_POST['KmAvant']); //création de la requête insert $sql = "INSERT INTO `reservation` (`nom`, `prenom`, `ResPerma`, `DateDebutRes`, `DateFinRes`, `TypeVehicule`, `NumId`, `KmAvant`) VALUES (:nom, :prenom, :ResPerma, :DateDebutRes, :DateFinRes, :TypeVehicule, :NumId, :KmAvant)" ; $req = $bdd->prepare($sql); if ($req->execute($tab)) { echo '<center><h3>Insertion effective !</h3></center>'.'<center><h1><a href="reservation.php">Retour</a></h1></center>'; } else { echo 'Erreur d\'insertion : l\'insertion n\'est pas effective'; } // fermeture connexion if($bdd){ $bdd = NULL; } ?>
Dans la BDD (MySQL) c'est le champ DateFinRes qui est en NULL par défaut, celui que l'on est pas obligé de renseigner et qui me pose problème.

Merci !

Mammouth du PHP | 1967 Messages

31 janv. 2017, 14:42

pour autant que le champs dans la bdd puisse être null, c'est au niveau de ton tableau $tab qu'il faut jouer en utilisant l'opérateur ternaire par exemple
$tab = array(
':nom' => $_POST['nom'],
':prenom' => $_POST['prenom'],
':ResPerma' => $_POST['ResPerma'],
':DateDebutRes' => $_POST['DateDebutRes'],
':DateFinRes' => (empty($_POST['DateFinRes']) ? 'NULL' : $_POST['DateFinRes']),
':TypeVehicule' => $_POST['TypeVehicule'],
':NumId' => $_POST['NumId'],
':KmAvant' => $_POST['KmAvant']);
Par contre il n'y a aucune vérification des champs obligatoires, c'est la première chose qui devrait être faite.
Il faudrait aussi ensuite t'assurer que les valeurs fourni par l'utilisateur sont du bon type (entier, chaine de caractère, date, ...)
et seulement si tous ca est bon lancer la connection et la requète à la bdd
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 7 Messages

31 janv. 2017, 16:47

Merci pour la réponse !
Après modification, j'ai ce message qui apparaît "Uncaught PDOException: SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect date value: 'NULL' for column 'DateFinRes'"

Pour ce qui est des champs ils concordent bien avec ceux de la BDD
Image

Pour ce qui est des vérifications, pour l'instant je vais partir sur du minimum syndical, pour commencer le travaille de fond, je commencerai bien par ce contrôle ci.

Merci !

Mammouth du PHP | 1967 Messages

31 janv. 2017, 17:01

je pense qu'il faut supprimer les ' autour du null dans le code que je t'ai donné.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 7 Messages

01 févr. 2017, 13:01

Magnifique ça marche maintenant ! merci !

J'ai une autre question, j'en profite, concernant l'affichage (qui est fonctionnel) y'a t'il moyen d'afficher la date en dd/mm/yyyy au lieu de yyyy/mm/dd ?

Code de récupération des données :

Code : Tout sélectionner

<td><?php echo $donnees['NumeroRes']; ?></br></td> <td><?php echo $donnees['Nom'] ; ?></td></br> <td><?php echo $donnees['Prenom'] ; ?></td></br> <td><?php echo $donnees['ResPerma'] ; ?></td></br> <td><?php echo $donnees['DateDebutRes'] ; ?></td></br> <td><?php echo $donnees['DateFinRes'] ; ?></td></br> <td><?php echo $donnees['TypeVehicule'] ; ?></td></br> <td><?php echo $donnees['NumId'] ; ?></td></br> <td><?php echo $donnees['KmAvant'] ; ?></td></br>
Code de la requête :

Code : Tout sélectionner

try { $bdd = new PDO('mysql:host=localhost;dbname=emprunt;charset=utf8', 'root', 'MDP'); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } $reponse = $bdd->query('SELECT * FROM reservation'); while ($donnees = $reponse->fetch())
Merci !

Mammouth du PHP | 1967 Messages

01 févr. 2017, 14:32

tu peux définir le format que tu veux avec ceci
http://www.w3schools.com/sql/func_date_format.asp

il faudra donc préciser le * dans ta requète SELECT ce qui est pas plus mal
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 7 Messages

01 févr. 2017, 15:21

Merci pour la fonction !
Cependant, je doit avouer que j'ai du mal à la placer, voici les formes que j'ai essayé :

Code : Tout sélectionner

$reponse = $bdd->query('SELECT date_format( * ,%d%m%Y) FROM reservation');

Code : Tout sélectionner

$reponse = $bdd->query('SELECT *, date_format(DateFinRes,%d%m%Y) FROM reservation');
J'ai aussi essayé de mettre les quotes simples mais du coup ça me "coupe" le commentaire qui contient la requête:

Code : Tout sélectionner

$reponse = $bdd->query('SELECT *, date_format(DateFinRes,'%d%m%Y') FROM reservation');
(l'autre forme aussi)
Ni sous la forme où je remplace les simple ' par des doubles "

Code : Tout sélectionner

$reponse = $bdd->query("SELECT * date_format(DateFinRes,'%d %m %Y') FROM reservation");
J'ai l'erreur
Uncaught Error: Call to a member function fetch() on boolean
Merci !

Mammouth du PHP | 1967 Messages

01 févr. 2017, 16:04

tu dois remplacer ton * par la liste des champs que tu veux récupèrer un à un
et pour le date_format, donne lui un alias avec AS pour te faciliter la vie
tu peux mettre des simple quotes dans des simple quote si tu les échappe avant.

par exemple
$reponse = $bdd->query('SELECT Nom, Prenom, ..., date_format(DateFinRes,\'%d %m %Y\') AS DateFinRes FROM reservation');

remplacer les ... par tous les champs désiré.
il vaut toujours mieux expliciter ce que tu veux récupèrer dans ta requète que d'utiliser *
car ca te permet de savoir ce qui éxiste sans devoir aller vérifier le schéma de la table. de plus si tu n'as pas besoin de tout, autant ne récupèrer que ce que tu as besoin.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 7 Messages

02 févr. 2017, 12:29

Merci pour l'aide et les conseils, c'est exactement ce qu'il me fallait, maintenant tout est fonctionnel et je vais creuser un peu pour + de contrôles.
Merci !