[RESOLU] Explication saisie de date en php

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Explication saisie de date en php

Re: Explication saisie de date en php

par ninouee » 27 juil. 2016, 22:21

Ahhh ça marche!!!! =D> :D :D :D :D

Merci à tous pour vos indications!

En effet il manquait un élément ici :
<label for="naissance">Date de naissance</label> :   <input type="text" name="naissance" id="naissance"/><br />
Et là il manquait une parenthèse, j'avais inversé les éléments de la date et il n'y avait pas les bon guillemets. Il fallait ça :
prepare('INSERT INTO personnalite (nom, prenom, naissance) VALUES(?, ?, str_to_date(?, "%d/%m/%Y"))');
Grace à vous je vais pouvoir passer au réglage du rendu de la date mais pour ça j'ai trouvé des sujets déjà existants.

Re: Explication saisie de date en php

par or 1 » 26 juil. 2016, 22:15

$_POST['naissance'] vaux bien ce qui est saisi dans la case ?
vu que le champ input pour la naissance n'a pas d’attribut name.

Re: Explication saisie de date en php

par ninouee » 26 juil. 2016, 21:59

Coucou

Je préférais faire mes tests et m'assurer que j'avais bien compris et que ça fonctionnait avant de clôturer le sujet.

Le soucis c'est que je pensais avoir compris et je ne sais pas où je bute. Je pense que ça doit être lié au format de date à envoyer sur le serveur.

J'ai essayé plusieurs combinaisons et rien n'y fait. Mes éléments nom et prénoms s'enregistrent bien dans la base mais pour la date rien.
J'ai tenté en retirant htmlspecialchars pensant que ça pouvait coincer mais non...

Je pense que ça vient des données de réglage saisies dans str_to_date(?, "Y-M-d"). le ? il correspond bien à naissance dans la formule SQL?
Ou alors je donne mal mon format de date à envoyer dans le serveur. Mon serveur veut des dates sous le format : 2016-07-30.
Si ça se trouve c'est une virgule qui coince...


Est-ce que vous pouvez me donner un indice pour que je comprenne où est mon erreur?

Voila le code

index php
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Index</title>
    </head>
    <style>
    form
    {
        text-align:center;
    }
    </style>

<body>


<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 1</label> :  <input type="text" name="prenom" id="prenom" /><br />
        
        
      <label for="naissance">Date de naissance</label> :   <input type="date"  id="naissance"/><br />
        
        

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







<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

// Récupération des 10 derniers messages
$reponse = $bdd->query('SELECT nom, prenom, naissance  FROM personnalite ORDER BY ID DESC LIMIT 0, 10');

// Affichage de chaque message (toutes les données sont protégées par htmlspecialchars)
while ($donnees = $reponse->fetch())
{
	echo '<p><strong>' . htmlspecialchars($donnees['nom']) . 
	
	'</strong> : ' . htmlspecialchars($donnees['prenom']) .
	
	'</strong> : ' . htmlspecialchars($donnees['naissance']). 
	
	'</p>';


}




$reponse->closeCursor();
?>
</body>
</html>
personnalite php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>

<body>
<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

// Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO personnalite (nom, prenom, naissance) VALUES(?, ?, str_to_date(?, "Y-M-d"))');
$req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['naissance']));





// Redirection du visiteur vers la page du minichat
header('Location: index.php');
?>
</body>
</html>
Merci à vous.

Re: Explication saisie de date en php

par moogli » 26 juil. 2016, 09:06

de rien,

si tu estime ton sujet résolus pense à l 'indiquer en cliquant sur le bouton a gauche du titre stp ;)

merci

@+

Re: Explication saisie de date en php

par ninouee » 25 juil. 2016, 20:16

Ahh merci pour la précision. Je croyais qu'il s'agissait d'une variable avec un effet spécifique.

Re: Explication saisie de date en php

par moogli » 25 juil. 2016, 11:21

salut,

$ma_date : correspond à l'entrée utilisateur saisie dans le formulaire. Ici c'est titre d'exemple tu utiliseras plutôt $_POST['naissance']

tu peux faire la conversion directement dans la requête SQL d'insertion avec la fonction mysql str_to_date (au final c'est pas plus mal de laisser le SGBD se démerder avec sont format de date interne ;) )
<?php
$bdd->prepare('INSERT INTO personnalite (nom, prenom, naissance) VALUES(?, ?, str_to_date(?,\'%Y-%m/%d\')');
A toi de vérifier que la date est bien dans le format attendu (les navigateur qui n’interprète par html5 vont, normalement, considérer le champs comme de type texte et du coup renvoyer ce qui a été saisie).

pour l'affichage il faut utiliser la fonction date_format indiquée par Ryle.

@+

Re: Explication saisie de date en php

par ninouee » 23 juil. 2016, 08:34

Pardon j'ai confondu le format ISO et l'US. ;-) C'est des petites choses qui vont rentrer peu à peu.

J'ai décidé de prendre le format date car il va se retrouver dans de nombreuses tables et normaliser certains éléments pourraient me faire gagner du temps notamment ici par rapport au codage de saisie et d'affichage.

Alors je suis désolée mais j'ai quelques questions car j'ai besoin de comprendre pour pouvoir utiliser correctement la solution que vous me donner.

Dans votre code, il commence par $ma_date et il y a à un moment donné $ts c'est ce qu'on appelle du langage objet genre PDO tel que $bdd dans mon fichier?

Au fait, merci pour le lien des tutoriels ça me sera très utile. ;-)

on j'ai essayé de voir comment utiliser $ma_date mais je ne comprend pas trop PHP...

Déjà, étant donné que je vais avoir plusieurs fois des saisies de dates, est-il préférable que je fasse un fichier de traitement de date à part qui pourrait être appelé en fonction des besoins?

Aussi, et le plus important, à quel endroit et comment ce code peut il être utilisé?

Désolée je débute vraiement et je suis dans le floue total...

Merci

Re: Explication saisie de date en php

par Ryle » 18 juil. 2016, 17:48

Bonjour,

Effectivement, le format de date de mysql n'est pas le format français (JJ/MM/AAAA), mais le format ISO (AAAA-MM-JJ). Le format américain quant à lui inverse jour et mois (MM/JJ/AAAA).

De façon à faciliter la vie de tes utilisateurs, il convient généralement de les laisser saisir leur date au format français 18/07/2016. Pour autant, au moment où tu vas les enregistrer dans ta base de données, il va te falloir transformer cette chaine pour l'insérer dans un format ISO afin que mysql comprenne ce que tu lui demandes. Et histoire de compliquer la chose, php va lui considérer qu'une date est par défaut dans un format américain... bref, c'est pas forcément simple, mais il existe des solutions :)

Déjà c'est très bien de vouloir utiliser le format date, ça simplifie les recherches, les filtres, les tris, les extractions. Pour ce qui est des conversions, tu peux considérer que la date que t'envoi l'utilisateur n'est qu'une chaine de caractères que tu peux découper et réassembler à ta guise. Tu peux aussi plus simplement utiliser la fonction date_create_from_format() :
$ma_date = '18/07/2016';
$ts = date_create_from_format('d/m/Y', $ma_date);
echo date_format($ts, "Y-M-d"); // affichera 2016-07-18
Tu peux ainsi convertir la date reçue pour l'insérer en base ;)

Il faudra alors, au moment où tu veux restituer ta date la convertir dans l'autre sens, soit de la même manière via php, soit directement dans ta requête avec la fonction date_format() de mysql : DATE_FORMAT(champ_date,'%d/%m/%Y')
(et ça ne fonctionne qu'avec les champs de type date, d'où l'importance de les utiliser :))

Pour en savoir plus sur les manipulations des dates avec php ou mysql tu trouveras plein d'élément (dont l'exemple ci-dessus) dans le topic suivant de la FAQ :
faq-tutoriels/quelques-petites-manipula ... t8323.html

Re: Explication saisie de date en php

par ninouee » 17 juil. 2016, 19:58

Je ne comprend pas trop la question. Ni la plus part des explications sur le sujets des dates et timestamp que j'ai trouvé sur le net... ;-)

Alors naissance c'est le nom de ma colonne de ma table c'est là où doit être saisie ma date.
Le type de donnée demandée est sur date. Quand je saisie directement la date de naissance sur mysql j'ai ce format 2012-05-05 .
J'ai fait pas mal d'essais et je pense que j'ai un problème de format.

Re: Explication saisie de date en php

par or 1 » 17 juil. 2016, 13:20

pour commencer
$_POST['naissance'] vaux bien ce qui est saisi dans la case ?

Explication saisie de date en php

par ninouee » 16 juil. 2016, 23:26

Bonjour à tous,

Je travaille sur un projet personnel de base de donnée sur les série.

J'ai donc une base avec MYSQL qui fonctionne sur wampserver et un début de création de formulaire qui fonctionne bien vu le peu que je lui demande.

Pour le moment j'arrive à insérer dans ma base un nom et un prénom d'acteur.

Là j'essaie de comprendre comment on travaille avec les dates car en France on a un soucis, on est en jj/mm/aaaa et en anglais, langage de programmation c'est l'inverse...

Sur mysql j'ai réglé ma colonne "naissance" avec un type date.

Pour mon formulaire de saisir j'avais trouvé ceci :

Code : Tout sélectionner

<input type="date" id="naissance"/>
mais rien n'est saisi sur la base.
Je me doute que ça ne peut pas être aussi simple.

Voila le code que j'ai pour le moment:

mon index
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Index</title>
    </head>
    <style>
    form
    {
        text-align:center;
    }
    </style>

<body>


<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 1</label> :  <input type="text" name="prenom" id="prenom" /><br />
        
        
      <label for="naissance">Date de naissance</label> :   <input type="date"  id="naissance"/><br />
        
        

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







<?php

try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}


$reponse = $bdd->query('SELECT nom, prenom, naissance  FROM personnalite ORDER BY ID DESC LIMIT 0, 10');


while ($donnees = $reponse->fetch())
{
	echo '<p><strong>' . htmlspecialchars($donnees['nom']) . 
	
	'</strong> : ' . htmlspecialchars($donnees['prenom']) .
	
	'</strong> : ' . htmlspecialchars($donnees['naissance']). 
	
	'</p>';
	

}


$reponse->closeCursor();
?>
</body>
</html>
personnalité
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>

<body>
<?php

try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}


$req = $bdd->prepare('INSERT INTO personnalite (nom, prenom, naissance) VALUES(?, ?, ?)');
$req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['naissance']));


header('Location: index.php');
?>
</body>
</html>