Ajout d'une plage de données

Résolu
Ysabe_l Messages postés 12714 Date d'inscription   Statut Contributeur Dernière intervention   -  
Ysabe_l Messages postés 12714 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je suis en train de mettre sur un site de location saisonnières d'un appartement, une gestion des locations.

J'ai donc un formulaire d'ajout de réservation, qui demande les coordonnées de la personne, la date d'arrivée et la date de départ (tout ça sera saisi par l'administrateur du site, pas par les clients).

A partir de cette date d'arrivée et de cette date de départ je voudrais ajouter dans la base de données un champ pour chaque jour où l'appartement est réservé. Un calendrier est affiché sur le site et se sert de cette base de données pour afficher le jour en vert si le logement est vide et en orange si il est réservé. Si j'ajoute manuelle un champ dans la base de données le calendrier affiche bien la bonne couleur.

Si j'ai en date d'arrivée le 2013-01-02 et en date de départ le 2013-01-08 il me faut dans la base de données
2013-01-02 - reserve
2013-01-03 - reserve
2013-01-04 - reserve
2013-01-05 - reserve
2013-01-06 - reserve
2013-01-07 - reserve
2013-01-08 - reserve
sinon mon calendrier ne saura pas afficher la bonne couleur (enfin plus précisément, je ne saurais pas lui faire afficher la bonne couleur ;) ).

Mon problème est que je n'arrive pas à lui faire ajouter ces champs. J'ai essayé plusieurs choses (avec des for et des while, différentes combinaisons, déclarer $date de différentes manières).

Pour l'instant j'en suis là :

$date = new DateTime();
$date = $date_arrivee;
while ($date <= $date_depart) // pour tous les jours entre l'arrivée et le départ ajout dans la base de données comme réservé
{
	try
	{
		$requete = $DB->prepare('INSERT INTO occupation (date, statut) VALUES (:date, "reserve")');
		$requete->execute(array('date'=>$date)) or die(print_r($requete->errorInfo()));
	}
	catch(PDOException $e)
	{
		echo 'Erreur ajout à la base de données';
	}
	$date->add(new DateInterval('P1D'));
}


Je n'ai aucune erreur, mais ma table ne se rempli pas.

Merci d'avance à ceux qui pourront m'aider à surmonter ce blocage.

18 réponses

Ysabe_l Messages postés 12714 Date d'inscription   Statut Contributeur Dernière intervention   277
 
Autant pour moi, tout à l'heure avec un autre truc je n'avais pas d'erreur, avec ce code là j'ai bien une erreur :

Fatal error: Call to a member function add() on a non-object in C:\messites\wamp\www\studio-nice\admin\nouvelle_reservation.php on line 97

la ligne 97 étant la suivante

$date->add(new DateInterval('P1D'));
0
Ysabe_l Messages postés 12714 Date d'inscription   Statut Contributeur Dernière intervention   277
 
Je fais un p'tit up
0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Salut !

Je pense avoir trouvé ton erreur :

$date = new DateTime(); // tu déclare un datetime : Très bien
$date = $date_arrivee; // C'est quoi $date_arrivee ?
A mon avis c'est ce que tu as récupéré du formulaire, donc un string.
Donc ton $date n'est plus un datetime, mais un string !

Sinon ton algo est très bien, quand tes $date, $date_depart serront bien des objet datetime le code fonctionnera parfaitement :)

0
Ysabe_l Messages postés 12714 Date d'inscription   Statut Contributeur Dernière intervention   277
 
Oui $date_arrive et $date_depart sont issus du formulaire (date d'arrivée et date de départ).

Donc dans la saisie, la personne écrit bien en format date 2013-01-20, dans la base de données j'ai défini que le champ est au format date. Mais quand il récupère la variable issue du formulaire il ne l'interprète pas comme une date, donc il va falloir le lui préciser !

Alors du coup je vois maintenant parfaitement le soucis mais va falloir que je réfléchisse pour le résoudre (non je ne demande pas la solution, j'aime trouver par moi même).

Une histoire de stringtotime si je me souviens bien, je vais regarder ça ce soir et si c'est bon je passerai en résolu.

Merci en tout cas de ton aide, maintenant j'ai compris l'erreur !

D'ailleurs en toute logique si j'arrive à bien faire en sorte que $date_arrive et $date_depart soient des dates je n'aurais plus besoin de mettre mon $date = new DateTime(); puisqu'il le saura que c'est une date.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Alors regarde la doc du constructeur de DateTime, tu auras la réponse :)
Pour le strtotime c'est effectivement ce qu'il faut.
Ton format de date est prèske bon il me semble, à voir dans la fonction strtotime !

Et non tu n'as pas forcément besoin de $date du coup.
$date_d = ton objet de date qui correspont à $date_depart
$date_a = ton objet de date qui correspond à $date_arrivee

while($date_a <= $date_d)
{
insert into
$date_a->add(new DateInterval('P1D'));
}
0
Ysabe_l Messages postés 12714 Date d'inscription   Statut Contributeur Dernière intervention   277
 
Bon pour donner des nouvelles je n'y arrive pas du tout, mais je pense que demain ça ira mieux après une bonne nuit.
0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Alors voila la doc du constructeur de DateTime :
https://www.php.net/manual/fr/datetime.construct.php
En premier paramètre il prend une chaine de caractères correspondant à une date au format yyyy-mm-dd (Ce que tu as, ca tombe bien ;-)

Je t'ai peut être donné trop d'indice, toi qui voulais cherché par toi même =/

En tout cas ne supprime pas ton while ! Il est très bien !
tu as juste à refaire l'instantion de $date et de $date_depart ;-)
0
Ysabe_l Messages postés 12714 Date d'inscription   Statut Contributeur Dernière intervention   277
 
J'avais bien trouvé la doc mais j'étais trop fatiguée pour comprendre hier soir je crois. Je regarderai ça ce soir mais moins tard ^^

Et oui j'ai fais exprès de mettre dans ce format de date je sais que c'est plus international et donc ça passe toujours mieux.

Je posterai mon code quand j'aurais réussi à le faire marcher.

Merci encore de ton aide.
0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Ca marche :)
0
Ysabe_l Messages postés 12714 Date d'inscription   Statut Contributeur Dernière intervention   277
 
Et bien voilà, j'ai passé des heures à me prendre la tête dessus, alors que ce n'était pas fondamentalement compliqué. Mais j'ai réussi !!

Donc si ça peut un jour intéresser quelqu'un qui tombera dessus la fonction donne ça :

$date_d = new DateTime($date_depart);
$date = new DateTime($date_arrivee);
while ($date <= $date_d) // pour tous les jours entre l'arrivée et le départ ajout dans la base de données comme réservé
{
	try
	{
		$requete = $DB->prepare('INSERT INTO occupation (date, statut) VALUES (:date, "reserve")');
		$date = date_format($date, 'Y-m-d');
		$requete->execute(array('date'=>$date)) or die(print_r($requete->errorInfo()));
	}
	catch(PDOException $e)
	{
		echo 'Erreur ajout à la base de données';
	}
	$date = new DateTime($date);
	$date->add(new DateInterval('P1D'));
}


Merci encore de ton aide jeremy.s !
0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Bah voilà :)

Par contre un truc me dérange, ton objet $date est un peu manipulé de Datetime à String, c'est pas spécialement propre ni judicieux :

$date_d = new DateTime($date_depart);
$date = new DateTime($date_arrivee);
while ($date <= $date_d) // pour tous les jours entre l'arrivée et le départ ajout dans la base de données comme réservé
{
try
{
$requete = $DB->prepare('INSERT INTO occupation (date, statut) VALUES (:date, "reserve")');
$date = date_format($date, 'Y-m-d');
$requete->execute(array('date'=>$date)) or die(print_r($requete->errorInfo()));
}
catch(PDOException $e)
{
echo 'Erreur ajout à la base de données';
}
$date = new DateTime($date);
$date->add(new DateInterval('P1D'));
}


Ce que tu peux faire :


$date_d = new DateTime($date_depart);
$date = new DateTime($date_arrivee);
while ($date <= $date_d) // pour tous les jours entre l'arrivée et le départ ajout dans la base de données comme réservé
{
try
{
$requete = $DB->prepare('INSERT INTO occupation (date, statut) VALUES (:date, "reserve")');
$requete->execute(array('date'=>$date->format('Y-m-d'))) or die(print_r($requete->errorInfo()));
}
catch(PDOException $e)
{
echo 'Erreur ajout à la base de données';
}
$date->add(new DateInterval('P1D'));
}


0
Ysabe_l Messages postés 12714 Date d'inscription   Statut Contributeur Dernière intervention   277
 
Alors figure toi que ça me dérangeait aussi mais que je ne voyais pas du tout comment résoudre ça !

Donc voilà même pas besoin de poser la question que j'ai la réponse. T'es trop fort.

Merci encore :)
0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Le date_format tu l'utilisais bien, et tu n'es pas obligé de toujours passé par des variables, il suffit de regarder quel type veut chaque fonction, et quel type renvois chaque fonction ;-)

Le execute veut un tableau de string, et date_format te renvois un string, donc voilà :) Pas besoin de changer de type $date, il ne changera pas quand tu utilises date_format :)
0
Ysabe_l Messages postés 12714 Date d'inscription   Statut Contributeur Dernière intervention   277
 
Ben je ne sais pas ce que j'ai fichu (j'ai fait tellement de tests !) mais quand j'ai cru avoir testé comme ça et avoir eu un message d'erreur c'est pour ça que j'étais partie sur ces transformations.
0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Ya rien de faux disons, mais c'est pas spécialement très clair quand on débute de faire comme j'ai fait.
C'est défois préférable de faire comme tu as fait, mais en passant par une variable intermédiaire tout en gardant l'objet que l'on utilise :) C'est plus clair et plus compréhensible quand on débute
0
Ysabe_l Messages postés 12714 Date d'inscription   Statut Contributeur Dernière intervention   277
 
J'avoue que le php je l'ai appris sur le tas en stage (avec Internet pour seule aide) de 4 seulement de 4 semaines et ... avec des bouts de codes existants qui étaient obsolètes et utilisant beaucoup de techniques pas très élégantes. Alors forcément maintenant que j'essaye de me lancer sur un vrai site pour moi j'ai un peu de mal à adapter mon peu de connaissances. Oui je sais un bon gros tuto, mais je n'ai juste pas le temps de me plonger vraiment dedans en ce moment. Mais j'ai déjà imprimé tout le tuto du site du zéro que je lirai cet été.

Heureusement qu'il y a des gens prêts à aider !
0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Le site grafikart propose des tuto vidéos très instructifs ;-) Mais il faut déjà avoir des bases du langage, ce n'est pas vraiment pour partir de 0.
Et puis les vidéos c'est plus motivant qu'un roman de 50 pages sur un écran ;-)
0
Ysabe_l Messages postés 12714 Date d'inscription   Statut Contributeur Dernière intervention   277
 
C'est sur ce site que j'ai suivi l'explication pour créer un calendrier, que j'ai ensuite modifié selon mes besoins bien sur.

Tu as raison qu'il y a pas mal de choses intéressantes dessus, après j'ai tendance à privilégier le papier qu'on peut consulter partout aux vidéos consultables uniquement sur un ordinateur connecté à Internet.

Mais tu vais quand même retourner y faire un tour (toujours cet été, quand j'aurai enfin du temps).
0