[RESOLU] Formulaire avec date qui ne fonctionne pas quand le champ est vide

Eléphant du PHP | 64 Messages

23 mars 2017, 23:28

Bonjour à tous!

Je suis à le recherche d'information qui pourraient m'aider à comprendre et résoudre une erreur que j'ai fait.

Voila, j'ai un formulaire de saisie qui permet d'entrer des informations sur une personne tel que nom, date de naissance, nationalité, date de décès...

Le formulaire se comporte bien seulement quand les éléments dates, c'est à dire naissance son complétés.
Si je saisi un nom, un prénom, ça marche pas.
Si je saisi un nom et une date de naissance, ça marche pas.
Si je saisi tout ça marche et pareille avec seulement les dates.

Je travaille avec Mysql 5.7.9 et PHP 5.6.25.

Mes colonnes de dates ont été créées de cette manière:
Type : date
Valeur par défaut : null
Null : coché

Auriez-vous un tutoriel que je pourrais lire afin de comprendre mon problème?

Merci à vous.

Mammouth du PHP | 1967 Messages

24 mars 2017, 11:43

Pourrais tu nous montrer ton code, sans cela nous ne pouvons pas facilement t'aider
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 mars 2017, 12:38

salut,

j'ajouterais qu'a priori le problème se situe dans la partie php qui valide le formulaire.
Plus précisément dans la partie de validation des dates et peut être dans l'ordre des if / else.

Pour plus il faut le code (oui je répète Spols :))

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 64 Messages

24 mars 2017, 21:41

Bonjour Spols et moogli

Je pensais que mon problème viendrait certainement d'une erreur de base de débutant dont je ne connais pas le nom lol

Voila les codes, ils sont divisés sur deux fichiers.

Index php

<form action="personnalite.php" method="post">
        <p>
       <label for="nom">Nom</label> : <input type="text" name="nom" id="nom" /><br />
        
       <label for="prenom">Prénom</label> :  <input type="text" name="prenom" id="prenom"/><br />
        
       <label for="prenom2">Prénom 2</label> :  <input type="text" name="prenom2" id="prenom2"/><br />
        
       <label for="surnom">Surnom</label> :  <input type="text" name="surnom" id="surnom"/><br />
        
       <label for="Vprenom1">Vraie prénom 1</label> :  <input type="text" name="Vprenom1" id="Vprenom1"/><br />
        
       <label for="Vprenom2">Vraie prénom 2</label> :  <input type="text" name="Vprenom2" id="Vprenom2"/><br />
        
       <label for="Vnom">Vraie nom</label> :  <input type="text" name="Vnom" id="Vnom"/><br />
       
       <label for="naissance">Date de naissance</label> :   <input type="text" name="naissance" id="naissance"/><br />
       
       <label for="mort">Date de décès</label> :   <input type="text" name="mort" id="mort"/><br />
       
 


<label for="sexe_id">Sexe H/F</label> <select name="sexe_id" id="sexe_id">
		
        
        <?php

include ('cnxBdd.php');


$sexe = $bdd -> query('select sexMin, sexe_id, snom
from sexe
order by snom ASC');

while ($donnees = $sexe->fetch()) {
    echo '<option value="',$donnees['sexe_id'],'"';
    if (!empty($_POST['sexe']) && $_POST['sexe'] == $donnees['sexe_id']) {
        echo ' selected="selected"';
    }
    echo '>', $donnees['snom'],'</option>';
}
		$sexe->closeCursor();
			
			?>
			</select>  <br />

       <label for="photo">Lien photo</label> :   <input type="text" name="photo" id="photo"/><br />
      
       <label for="PersonnaliteLien">Lien sujet</label> :  <input type="text" name="PersonnaliteLien" id="PersonnaliteLien"/><br />
        
       <label for="PersonnaliteAvatar">Avatar</label> :  <input type="text" name="PersonnaliteAvatar" id="PersonnaliteAvatar"/><br />
        

        <input type="submit" value="Envoyer" />
	</p>
    </form>

personnalite.php
<?php
// Connexion à la base de données
include ('cnxBdd.php');

// Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('
INSERT INTO personnalite (
	nom, 
	prenom, 
	prenom2, 
	surnom, 
	Vprenom1, 
	Vprenom2, 
	Vnom, 
	naissance, 
	mort, 
	sexe_id,
	photo, 
	PersonnaliteLien, 
	PersonnaliteAvatar) 
	
VALUES(?, ?, ?, ?, ?, ?, ?, str_to_date(?, "%d/%m/%Y"), str_to_date(?, "%d/%m/%Y"), ?, ?, ?, ?)');


$req->execute(array(
	$_POST['nom'], 
	$_POST['prenom'], 
	$_POST['prenom2'], 
	$_POST['surnom'] , 
	$_POST['Vprenom1'], 
	$_POST['Vprenom2'], 
	$_POST['Vnom'], 
	$_POST['naissance'], 
	$_POST['mort'], 
	$_POST['sexe_id'], 
	$_POST['photo'], 
	$_POST['PersonnaliteLien'], 
	$_POST['PersonnaliteAvatar']));





// Redirection du visiteur vers la page 
header('Location: index.php');
?>
Vous pensez que ça pourrait être un problème de SQL genre le format des données vide envoyés feraient une erreur vers le serveur?

Mammouth du PHP | 1967 Messages

24 mars 2017, 23:28

Il faut que tu controle les entrées, il est très imprudent de les insérer directement en bdd.

De plus le format de la date est complètement incertain.

la solution basique serait de remplacer
$_POST['naissance']
par
(empty($_POST['naissance']) ? NULL : $_POST['naissance'])

et pareil pour les autres dates mais je te conseillerai vraiment de faire un traitement complet des données recues avant enregistrement en bdd
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 64 Messages

24 mars 2017, 23:47

Merci Spols e effet ça corrige mon problème.

Toutefois ce que tu conseille m'intrigue. Contrôler les données, format de date incertain, traitement complet des données.

Je ne comprend pas.

Mammouth du PHP | 1967 Messages

25 mars 2017, 17:51

Si quelqu'un rempli ton formulaire avec n'importe quelle donnée, il y aura un enregistrement dans ta bdd, en controlant le format de tes dates, le contenu des champs tu peux empecher les utilisations non-voulue de ton formulaire.

Je ne connais pas l'utilisation de ce formulaire ni sa portée pour être plus précis, mais en règle générale, ne jamais faire confiance aux données envoyées par l'utilisateur, toujours les controler avant de les utiliser.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 64 Messages

27 mars 2017, 22:31

Je n'ai pas encore vu comment faire un module de connexion aux formulaires de saisie et j'avoue ne pas avoir réfléchie si je serais seul ou si nous serons plusieurs à avoir accès à la base.

Je vais rechercher ce que tu me conseille. Merci.