Ajout d'une plage de données

Résolu/Fermé
Ysabe_l Messages postés 12461 Date d'inscription vendredi 12 avril 2013 Statut Contributeur Dernière intervention 28 avril 2024 - 4 juin 2013 à 17:52
Ysabe_l Messages postés 12461 Date d'inscription vendredi 12 avril 2013 Statut Contributeur Dernière intervention 28 avril 2024 - 10 juin 2013 à 17:25
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 12461 Date d'inscription vendredi 12 avril 2013 Statut Contributeur Dernière intervention 28 avril 2024 274
4 juin 2013 à 20:56
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 12461 Date d'inscription vendredi 12 avril 2013 Statut Contributeur Dernière intervention 28 avril 2024 274
6 juin 2013 à 16:59
Je fais un p'tit up
0
jeremy.s Messages postés 1226 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
6 juin 2013 à 17:06
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 12461 Date d'inscription vendredi 12 avril 2013 Statut Contributeur Dernière intervention 28 avril 2024 274
6 juin 2013 à 17:14
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 lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
6 juin 2013 à 17:18
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 12461 Date d'inscription vendredi 12 avril 2013 Statut Contributeur Dernière intervention 28 avril 2024 274
6 juin 2013 à 22:34
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 lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
6 juin 2013 à 22:50
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 12461 Date d'inscription vendredi 12 avril 2013 Statut Contributeur Dernière intervention 28 avril 2024 274
7 juin 2013 à 09:56
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 lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
7 juin 2013 à 14:40
Ca marche :)
0
Ysabe_l Messages postés 12461 Date d'inscription vendredi 12 avril 2013 Statut Contributeur Dernière intervention 28 avril 2024 274
10 juin 2013 à 13:03
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 lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
10 juin 2013 à 14:44
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 12461 Date d'inscription vendredi 12 avril 2013 Statut Contributeur Dernière intervention 28 avril 2024 274
10 juin 2013 à 16:50
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 lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
10 juin 2013 à 17:05
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 12461 Date d'inscription vendredi 12 avril 2013 Statut Contributeur Dernière intervention 28 avril 2024 274
10 juin 2013 à 17:10
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 lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
10 juin 2013 à 17:13
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 12461 Date d'inscription vendredi 12 avril 2013 Statut Contributeur Dernière intervention 28 avril 2024 274
10 juin 2013 à 17:19
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 lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
10 juin 2013 à 17:22
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 12461 Date d'inscription vendredi 12 avril 2013 Statut Contributeur Dernière intervention 28 avril 2024 274
10 juin 2013 à 17:25
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