[RESOLU] Datepicker et affichage input en Fr + vérification

Eléphant du PHP | 55 Messages

03 oct. 2013, 16:00

Bonjour,
Je viens d'ajouter datepicker à certaines de mes pages et en français. Tout marche.
Tout s'insère aussi bien en bdd. Utilisation de PDO.
Ce que j'aimerais changer: l'affichage de la date dans mon input.
Date 2013/10/28 en Date 28/10/2013.

Le problème est le suivant: dans ma fonction j'ai ajouté un format.Je ne parviens pas à l'afficher en fr et si je change ce format, je ne peux faire d'insertion dans ma bdd.
[javascript]
jQuery(function($){
$.datepicker.setDefaults($.datepicker.regional['fr']);
$('#datepicker').datepicker({
dateFormat:'yy-mm-dd',
});

});
[/javascript]

Si je modifie le format, l'insertion en bdd n'est pas conforme. J'obtiens 0000-00-00.
Comment faire en sorte que la date apparaisse au format fr et qu'elle soit insérée au format ang.
J'ai essayé strtotime mais cela n'a rien donné. A moins que je l'ai mal utilisé dans ma requête ci-dessous:
$req="INSERT INTO jeux(intitule_jeux,descriptif,date)
	VALUES(:intitule,:descriptif,:date)";
	$preReq=$bdd->prepare($req); 
	$res=$preReq->execute(array(
				  ':intitule'=>$intitule,
				  ':descriptif'=>$descriptif,
				   ':date'=>date("yy/mm/dd",strtotime($date)),
	));
Et comment vérifie-t-on la date pour éviter injection?

Merci par avance
Ionesco

Eléphant du PHP | 116 Messages

03 oct. 2013, 16:24

Salut,

Dans ton js, tu peux changer en dd/mm/yyyy

Du coup ton input il aura une valeur, par exemple 03/10/2013

Pour le traiter avec php et l'ajouter dans ta base il te faut une date au format us : yyyy-mm-dd

Du coup :
$datefr =  DateTime::createFromFormat('d/m/Y', $dateDeTonPost);
$tadateainserer =  $datefr ? $datefr->format('Y-m-d') : date('d/m/Y');
Pour vérfier une date tu peux utiliser checkdate() autrement. Mais dans mon exemple tu en as pas besoin, car si la variable $dateDeTonPost est pas au bon format ou n'est pas bonne, $tadateainserer prendra pour valeur la date du jour.
@+,
Computarelier

Eléphant du PHP | 55 Messages

03 oct. 2013, 16:39

Mille mercis.
Ça fonctionne au poil!
Ta réponse fait-elle partie d'une méthode ou bibliothèque, est-elle standard ? ou créée de toute pièce ? Car je ne connaissais pas certains éléments. Normal, je débute mais je cherche à progresser.
Ionesco

Eléphant du PHP | 116 Messages

03 oct. 2013, 16:56

"Ma" méthode te souhaite de très longues et joyeuses heures de lecture. Les gars de PHP sont malsains. Rien que pour les dates et les heures t'en prends l'équivalent de 30 années d'abonnement à Paris Match : http://www.php.net/manual/fr/book.datetime.php .

Bonne lecture & à bientôt :)
Computarelier
@+,
Computarelier

Eléphant du PHP | 55 Messages

10 oct. 2013, 16:13

Bonjour,
Je reviens sur le sujet car j'ai noté un autre problème. J'ai essayé de le résoudre mais mes connaissances limitées ne me permettent pas de le solutionner. J'ai parcouru les informations contenues dans le lien. J'en ai pour 30 ans. Mais super intéressant. Les dates, un vrai casse-tête.
Je m'explique.
Suite à la solution que tu m'as proposée, qui fonctionne très bien, je n'ai pas réussi à l'appliquer dans un autre cas de figure: celui de la récupération de la date lors d'une modification.
Quand je mets ce code:
$date = $_POST['date'];
		$datefr = DateTime::createFromFormat('d/m/Y',$date);
		$dateAModifier=$datefr ? $datefr->format('Y-m-d'):date('d/m/Y');
Et l'affiche dans mon formulaire :
<label>DATE</label>
			<input type="text" name="date" id="datepicker" value="<?php echo $jeux['date'];?>"/>
		</div>
Dans ma bdd, j'ai ce problème.
Dans le champ input la date s'affiche à l'anglaise. Puis lorsque je la modifie, prend la forme d'une date en français. Puis les modifications sont envoyées à la bdd. Dans ce cas précis, aucun problème. Mais si la modification ne porte pas sur la date, mais sur le descriptif par exemple, la date retournée en bdd est modifiée et automatiquement devient 0000-00-00.
Je comprends la raison, que le format n'est pas reconnu donc on affiche par défaut. Je ne sais comment m'y prendre pour le modifier pour que ce soit vrai dans les 2 cas: avec ou sans modification.
Dans mon fichier jQuery : dateFormat:'yy-mm-dd'
J'ai essayé de modifier le format de la date qui est reçu Y-m-d pour que je puisse le lire en d/m/Y. C'est tombé à l'eau.
Je crois qu'il faut qu'il récupère l'un ou l'autre des formats mais avec la fonction jQuery, tout est figé.
Merci par avance à ceux qui m'éclaireront.
Cordialement,
Ionesco

Eléphant du PHP | 116 Messages

10 oct. 2013, 16:31

Hellow,
Sur un objet DateTime tu peux agir comme ça :
echo $date->format('Y-m-d');

Ca te permet de :
1/ Tu récupères un POST en format date FR
2/ Tu créers un DateTime
3/ Ce DateTime tu le mets dans ta BDD avec ->format('Y-m-d');
4/ Ce même DateTime tu l'exploites en jQuery avec ->format('y-m-d');
etc ...

En fait je suis pas sûr de comprendre réellement to problème. :|

@+
Computarelier
@+,
Computarelier

Eléphant du PHP | 55 Messages

10 oct. 2013, 16:46

Bonjour,
Merci pour cette réponse. En fait, quand je suis sur ma page modification, je souhaite voir apparaître les données que j'ai en bdd.
Ex: jeu, descriptif, date. Ce qui est dans ma bdd
Jeu : puissance 4
Descriptif: alignement de 4 jetons en h, v ou d
Date: 2013-10-11

Dans ma page modif.php
J'affiche ces éléments. Sauf que la date elle se présente ainsi au lieu de 11/10/2013
Jeu : puissance 4
Descriptif: alignement de 4 jetons en h, v ou d
Date: 2013-10-11

Donc si je modifie le nom du jeu et que je clique sur Enregistrer en bdd, j'obtiens:
Jeu : puissance 4
Descriptif: alignement de 4 jetons en h, v ou d
Date: 0000-00-00
Sans avoir modifier la date, il me met celle par défaut. Donc les dates sont fausses.
A l'inverse, si je modifie tout se passe bien.
J'aimerais éviter cette erreur et je ne sais comment faire.
Je ne sais comment placer dans le echo
echo $date->format('Y-m-d'); 
avec mon code: 
<input type="text" name="date" id="datepicker" value="<?php echo $jeux['date'];?>"/>
Est-ce : 
<input type="text" name="date" id="datepicker" value="<?php echo $date->format((Y-m-d')$jeux['date']);?>"/>
Merci
Cordialement
Ionesco

Eléphant du PHP | 116 Messages

10 oct. 2013, 19:02

Vu que tu es dans un input autant faire en sorte que ça s'affiche normalement pour que l'utilisateur voit une date format FR. Est ce que c'est le cas ?

Si oui, dans la page qui traite le formulaire tu créés un DateTime avec ton $_POST['date'] et tu le convertis en Y-m-d pour la BDD. Si non, ben fais le en vue de pouvoir faire le si oui :-)
@+,
Computarelier

Eléphant du PHP | 55 Messages

11 oct. 2013, 14:25

Bonjour Computarelier,
Ça fait plaisir de voir que je ne suis pas seul dans ce grand marasme php.
Effectivement, j'ai essayé de modifier de différentes manières les dates. Le problème est que la date s'affiche malgré tout à l'anglaise, je ne parviens pas à la remettre en fr lors de l'affichage direct. Mais si je modifie la date avant de soumettre le formulaire, elle est bien en Fr. Et une fois le clic sur modifier, la nouvelle date s'enregistre bien dans la bdd.
Le souci est si je ne fais pas de modification, comme l'affichage est 0000-00-00, le format date d/m/Y n'est plus reconnu et donc dans la bdd, s'affiche la valeur par défaut 0000-00-00. Et je voudrais l'éviter mais je ne sais pas comment procéder ni même par où commencer.

Je ne comprends pas le dernier commentaire. Je ne saisis pas ce que je dois faire.
Pourrais-tu développer un peu plus?
Merci par avance,
Ionesco

Eléphant du PHP | 116 Messages

12 oct. 2013, 11:16

Salut je reprends. Pour ton formulaire de modification d'un champs date :

1) Tu attribues à $date la valeur de ton champ SQL (format en)
2) Dans ton affichage tu fais une nouvelle datetime à partir de la date EN et tu fais un format en FR : comme ça les gens voient la date au format FR
3) Tu vérifies si la date est bonne en créant un datetime à partir de la FR et tu la mets dans une variable avec le format EN
4) Dans ton update tu mets cette variable EN

Normalement tu as tous les petits bouts de code éparpillés dans ce message ...

Est ce que c'est un peu plus clair ?
@+,
Computarelier

Eléphant du PHP | 55 Messages

13 oct. 2013, 12:36

Bonjour,
J'ai essayé de mettre en place la solution mais j'ai une erreur. Entre-temps, je suis parvenu à résoudre le problème. J'ai corrigé le code.

Mon code sur la page Modif
$date = $_POST['date'];
		$datefr = DateTime::createFromFormat('d/m/Y', $date);
		$dateAModifier=$datefr ? $datefr->format('Y-m-d'):date('d/m/Y');

$requete=$bdd->prepare("UPDATE jeux SET  date=:date WHERE id_jeux=:id");
			$requete->execute(array(
                                                 ':intitule'=>$intitule,
                                                 ':descriptif'=>$descriptif,
                                   		':date'=>$dateAModifier,
					        ':id'=>$id));
Et j'ajoute une requête supplémentaire qui affiche les éléments de la page HTML
//---requête fiche modif
$req=$bdd->prepare("SELECT * FROM jeux WHERE id_jeux=:id");
$req->execute(array(':id'=>$_GET['id']));
$jeux=$req->fetch();
Dans la même page, côté HTML
<label>DATE</label>
			<input type="text" name="date" id="datepicker" value="<?php $dateEn = $info['date'];
			$dateFr = DateTime::createFromFormat('Y-m-d',$dateEn);
			echo $dateModif= $dateFr ? $dateFr->format('d/m/Y'):date('Y-m-d');?>"/>
Il fallait juste modifié le contenu dans le input. A priori, pour le moment ça marche. Dans le firebug, les éléments apparaissent correctement. Le code ci-dessus est bon si çela intéresse certain(e)s internautes.

Grâce à tes explications computarelier, j'ai réussi. Merci de m'avoir accompagné jusqu'au bout. =D>
Ionesco

Eléphant du PHP | 116 Messages

13 oct. 2013, 15:55

:non: Non non non... C'est pas terminé ! :-)

Pour ton update, tu prends $dateAMofifier :
$dateAModifier=$datefr ? $datefr->format('Y-m-d'):date('d/m/Y');
Ce petit bout de code te dit que si $datefr est ok, tu la convertis en date EN (ok !) sinon bah tu prends pour date la date d'aujourd'hui (ok !) ...
... mais en format fr ! :-) Modifie ça, des fois où la date donnée serait pas bonne sinon tu vas avoir des 000 !

@+
Computarelier
@+,
Computarelier

Eléphant du PHP | 55 Messages

13 oct. 2013, 16:27

J'ai essayé de modifier mais je ne vois pas la différence.
$dateAModifier=$datefr ? $datefr->format('Y-m-d'):date('d/m/Y');
Cela signifie mettre
$dateAModifier=$datefr ? $datefr->format('d/m/Y'):date('Y-m-d');
Peux-tu me dire à quel moment la date serait mal saisie?
Merci
Ionesco

Eléphant du PHP | 116 Messages

13 oct. 2013, 16:41

Le calendrier ne marche pas, quelqu'un a désactivé JS, ton input est pas en readonly et est donc modifiable à la main, quelqu'un passe par un curl ou modifie les infos avec un tramper... :-)

Si tu penses que ça ne risque pas d'arriver, dans ce cas le ternaire que je t'ai signalé est inutile :-)
@+,
Computarelier

Eléphant du PHP | 55 Messages

14 oct. 2013, 12:15

Bonjour,
Trop content pour être vrai. Le calendrier est utilisé dans la backoffice. Il y a peut-être un risque de ce fait.
Merci pour tes réponses, je ne connaissais pas toutes ces attaques potentielles. J'apprends beaucoup.
Néanmoins ma réponse postée est-elle correcte?
J'ai fait le test, si j'enregistre un nouveau jeu sans mettre de date, au moment de la modification sur la page Modif, la date du jour sera insérée automatiquement.
Y a-t-il une faille?
Cordialement
Ionesco