Bonjour,

J'ai récemment réalisé un formulaire pour des demandes de réservation (voir lien ci-dessous).
http://www.jibego.com/rrps/reservation.php

J'aimerai pouvoir permettre à l'internaute d'ajouter plusieurs périodes lors de l'enregistrement (ajout de champs "Arrivée" et "départ" avec un bouton "+").

Comment dois-je procéder pour générer ces champs (avec jQuery je pense) et stocker ces données avec PHP pour les envoyer en base de données ?

Voici mon code de traitement PHP des données :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
<?php 
//import fichier config
include("config.inc.php");
//connection BDD
try {
	$bdd = new PDO($hote, $user, $password);
}
catch (Exception $e){
        die('Erreur : ' . $e->getMessage());
}
//Vérification du formulaire
//construction du tableau des variables
$filtres = array(
    'logement' => FILTER_SANITIZE_STRING,
    'adresse' => FILTER_SANITIZE_STRING,
    'npa' => array(
        'filter' => FILTER_CALLBACK,
        'options' => 'validerNpa'
    ),
    'ville' => FILTER_SANITIZE_STRING,
    'nom' => FILTER_SANITIZE_STRING,
    'prenom' => FILTER_SANITIZE_STRING,
    'email' => FILTER_VALIDATE_EMAIL,
    'arrivee' => array(
        'filter' => FILTER_CALLBACK,
        'options' => 'validerArrivee'
    ),
    'depart' => array(
        'filter' => FILTER_CALLBACK,
        'options' => 'validerDepart'
    )
);
//Fonction validation NPA
function validerNpa($npa) {
	//Retourne le numéro s'il est valide, sinon false.
    	return preg_match('#^[0-9]{4}$#', $npa) ? $npa : false;
}
//Fonction validation DATE
function validerArrivee($date_arrivee) {
	//Retourne le numéro s'il est valide, sinon false.
    	return preg_match('#^\d{4}-\d{1,2}-\d{1,2}$#', $date_arrivee) ? $date_arrivee : false;
}
//Fonction validation DATE
function validerDepart($date_depart) {
    //Retourne le numéro s'il est valide, sinon false.
	return preg_match('#^\d{4}-\d{1,2}-\d{1,2}$#', $date_depart) ? $date_depart : false;
}
$resultat = filter_input_array(INPUT_POST, $filtres);
if($resultat != null) { //Si le formulaire a bien été posté.
	//transforme post en variables
	extract($_POST);
	//Enregistrer des messages d'erreur perso.
	$messageErreur = array(
	    'email' => $t_erreurmail,
	    'npa' => $t_erreurnpa,
	    'arrivee' => $t_erreurdate,
	    'depart' => $t_erreurdate
	);
	$nbrErreurs = 0;
	foreach($filtres as $cle => $valeur) { //Parcourir tous les champs voulus.
	        if(empty($_POST[$cle])) { //Si le champ est vide.
	            $messageErreur = $t_erreur . '.<br/>';
	            $nbrErreurs++;
	        }
	        elseif($resultat[$cle] === false) { //S'il n'est pas valide.
	            $messageErreur = $messageErreur[$cle] . '<br/>';
	            $nbrErreurs++;
	        }
	}
	if($nbrErreurs == 0) {
		$t_intro = $t_champsvalid;
		//INSERT OCCUPANT
		// On vérifie si il n'y a pas d'occupants identiques
		$req = $bdd->prepare('SELECT id, nom, prenom, email, proprietaire FROM occupant WHERE nom = :nom AND prenom = :prenom');
		$req->execute(array(
			'nom' => $nom,
			'prenom' => $prenom
		));
		$r_occupant = $req->fetch();
		//Si il n'y en a pas on insert les données
		if (!$r_occupant){
			$ajout = $bdd->prepare('INSERT INTO occupant(nom, prenom, email, proprietaire, logement, date) VALUES(:nom, :prenom, :email, :proprietaire, :logement, NOW())');
			$ajout ->execute(array(
				'nom' => $nom,
				'prenom' => $prenom,
				'email' => $email,
				'proprietaire' => $type,
				'logement' => $logement
			));
			$info = 'Occupant ajouté';
			$ajout->closeCursor();
		}
		else{
			//Sinon on remplace les champs existant par les nouveaux
			$modif = $bdd->prepare('UPDATE occupant SET nom = :nom, prenom = :prenom, email = :email, proprietaire = :proprietaire, logement = :logement, date = NOW() WHERE nom = :nom AND prenom =:prenom');
			$modif ->execute(array(
				'nom' => $nom,
				'prenom' => $prenom,
				'email' => $email,
				'proprietaire' => $type,
				'logement' => $logement
			));
			$info = 'Occupant modifié';
			$modif->closeCursor();
		}
		$req->closeCursor();
		//On récupère l'ID du dernier propriétaire associé au logement
		$occ_id = $bdd->prepare('SELECT id FROM occupant WHERE proprietaire =\'1\' AND logement = :logement');
		$occ_id ->execute(array(
			'logement' => $logement
		));
		$donnees = $occ_id->fetch();
		$id_proprietaire = $donnees['id'];
		$occ_id->closeCursor();
		//INSERT LOGEMENT
		// On vérifie si il n'y a pas de logement identique
		$req = $bdd->prepare('SELECT nom, adresse, npa, ville, proprietaire FROM logement WHERE nom = :nom_logement');
		$req->execute(array(
			'nom_logement' => $logement
		));
		$r_logement = $req->fetch();
		//Si il n'y en a pas on insert les données
		if (!$r_logement){
			$ajout = $bdd->prepare('INSERT INTO logement(nom, adresse, npa, ville, proprietaire, date) VALUES(:nom_logement, :adresse, :npa, :ville, :proprietaire, NOW())');
			$ajout ->execute(array(
				'nom_logement' => $logement,
				'adresse' => $adresse,
				'npa' => $npa,
				'ville' => $ville,
				'proprietaire' => $id_proprietaire
			));
			$info2 = 'occupation ajouté';
			$ajout->closeCursor();
		}
		else{
			//Sinon on remplace les champs existant par les nouveaux
			$modif = $bdd->prepare('UPDATE logement SET nom = :nom_logement, adresse = :adresse, npa = :npa, ville = :ville, proprietaire = :proprietaire, date = NOW() WHERE nom = :nom_logement');
			$modif ->execute(array(
				'nom_logement' => $logement,
				'adresse' => $adresse,
				'npa' => $npa,
				'ville' => $ville,
				'proprietaire' => $id_proprietaire
			));
			$info2 = 'logement ajouté';
			$modif->closeCursor();
		}
		$req->closeCursor();
		//On récupère l'ID du dernier logement modifié
		$log_id = $bdd->query('SELECT id FROM logement ORDER BY date DESC LIMIT 0, 1');
		$donnees = $log_id->fetch();
		$id_logement = $donnees['id'];
		//INSERT OCCUPATION
		//On récupère l'ID du dernier occupant modifié
		$log_id = $bdd->query('SELECT id FROM occupant ORDER BY date DESC LIMIT 0, 1');
		$donnees = $log_id->fetch();
		$id_occupant = $donnees['id'];
		//On insére l'occupation
		$ajout = $bdd->prepare('INSERT INTO occupation(arrivee, depart, occupant, logement, date) VALUES(:date_arrivee, :date_depart, :occupant, :logement, NOW())');
		$ajout ->execute(array(
			'date_arrivee' => $arrivee,
			'date_depart' => $depart,	
			'occupant' => $id_occupant,
			'logement' => $id_logement
		));
		$info3 = 'occupation ajouté';
		$ajout->closeCursor();
	}
}		
?>

Si vous avez des exemples de tutos ou autres scripts pouvant m'aider, merci de me les communiquer.