[RESOLU] Problème d'insertion de données

Eléphanteau du PHP | 16 Messages

15 févr. 2017, 11:16

Bonjour,
J'essaye d'insérrer plusieurs enregistrments en même temps, ces données viennent d'un formulaire, dans la page de validation je dois récupérer les index du tableau et là je n'y arrive pas, dans ma table il me met x fois la même personne mon problème est que je ne sais pas récupérer les index du tableau
foreach($_POST['id_perso'] as $i => $v) {
 $req->execute(array(
    ':id_perso'=>$v, 
    ':id_ligne_voyage'=>$_POST['id_ligne_voyage'], // ici je devrais avoir l'index et non pas $_POST
Enfin j'espère que ce message est clair...Merci de votre aide.
<?php	
						$param_Voyage = $bd->query('SELECT id, id_ligne_voyage, destination, DATE_FORMAT(date_debut, "%d/%m/%Y") as date_debut,
							DATE_FORMAT(date_fin, "%d/%m/%Y") as date_fin,
							nbre_place, montant_g, piece 
							FROM param_voyage WHERE id_ligne_voyage ="' . $_SESSION['id_voy']. '" ');
								$data_voyage = $param_Voyage->fetch();
								echo "<p><B>Voyage sélectionné " .$data_voyage['destination'].
									" du " .$data_voyage['date_debut']. " au " .$data_voyage['date_fin']." Nbre de places " .$data_voyage['nbre_place']. " Montant global " .number_format($data_voyage['montant_g'], 2, ',', ' ')." €</B></p>";
					
						$param_sous_Voyage = $bd->query('SELECT id_voyage, id_ligne, tranche, montant_t
							FROM param_sous_voyage WHERE id_voyage ="' . $data_voyage['id']. '" ORDER BY tranche ASC ');
								while ($data_sous_voyage = $param_sous_Voyage->fetch())
									{
								echo "<p><B>Référence id voyage " .$data_sous_voyage['id_voyage'].
									
									" " .$data_sous_voyage['tranche']. " Montant " .number_format($data_sous_voyage['montant_t'], 2, ',', ' ')." €</B></p>";
									}
					?>
					<form method="post" action="select_voyageur.php">
						<p>
							<label for="profil">Veuillez sélectionner un membre...</label>
									<select id="matricule" name="matricule">
										<option selected="selected"></option>				
											<?php 
												$select_membre = $bd->query('SELECT matricule, id, nom, prenom FROM membre ORDER BY nom ASC');		
													while ($liste_membre = $select_membre->fetch())
														{
													echo '<option value="'.$liste_membre["matricule"].'""'.stripslashes(strtoupper($liste_membre["nom"])).'""'.stripslashes($liste_membre["prenom"]).'">'. stripslashes(strtoupper($liste_membre["nom"])).' '. stripslashes($liste_membre["prenom"]).'</option>';
														} 
															session_start();
															$_SESSION['id_mat']=$_POST["matricule"];
											?>
									</select>
								<input type="submit" value="Rechercher" /> 
						</p>
					</form>
											<?php	
												if (isset($_POST['matricule'])) 
												{ 
													echo "<p>Profil sélectionné " . stripslashes($_SESSION['id_mat'])."</p>";
											?>


					<?php	
						$Param_voyageur = $bd->query('SELECT
							membre.id as "id_perso", 
							"Mem" as "type", 
							membre.matricule as "matricule", 
							membre.civilite as "civilite", 
							membre.nom as "nom", 
							membre.nom_j_fille as "nom_j",  
							membre.prenom as "prenom", 
							DATE_FORMAT(membre.date_n, "%d/%m/%Y") as "date_n",
							nationalite_sal  as nationalite,
							"Oui" as "select" 
							
						FROM membre	where membre.matricule="'.$_SESSION['id_mat'].'"
						UNION

						SELECT 
							membre.id as "id_perso", 
							"Conj" as "Type", 
							membre.matricule as "matricule", 
							membre.civilite_conj as "civilite", 
							membre.nom_conj as "nom", 
							membre.jeune_fille_conj as "nom_j", 
							membre.prenom_conj as "prenom", 
							DATE_FORMAT(membre.naissance_conj, "%d/%m/%Y") as "date_n", 
							nationalite_conj  as nationalite,
							"Oui" as "select" 
							
						FROM membre where membre.matricule="'.$_SESSION['id_mat'].'"
						UNION

						SELECT 
							enfant.id as "id_perso", 
							"Enf" as "type", 
							enfant.matricule as "matricule",
							enfant.civilite_enfant as "civilite",  
							enfant.nom_enfant as "nom",
							"" as "nom_j",  
							enfant.prenom_enfant as "prenom",
							DATE_FORMAT(enfant.naissance_enfant, "%d/%m/%Y") as "date_n", 
							nationalite_enf  as nationalite,
							"Oui" as "select"
							
						FROM enfant where enfant.matricule="'.$_SESSION['id_mat'].'" 
						');
							while ($data_voyageur = $Param_voyageur->fetch()) 
							{
								echo '	
								<form name="insertion" action="ex_insert_voyageur.php" method="POST">	
									<table>
									<tr>
										<th>Type</th>
										<th>Civilité</th>
										<th>Nom</th>
										<th>Nom jeune fille</th>
										<th>Prénom</th>
										<th>Né(e) le</th>
										<th>Chambre</th>
										<th>N°</th>
										<th>Tranche</th>
										<th>Info</th>
										<th>Nationalité</th>
										<th>Sexe</th>
										<th>Document</th>
										<th></th>
										</th>
										<tbody>
									</tr>
											<tr>
							<input type="text" id="id_perso" name="id_perso[]" size="4" maxlength="6" value="'.$data_voyageur["id_perso"].$data_voyageur["type"].'" >
							<input type="HIDDEN" id="id_ligne_voyage" name="id_ligne_voyage[]" size="20" maxlength="15" value="'.$data_voyage["id_ligne_voyage"].'" >
							<input type="HIDDEN" id="destination" name="destination[]" size="20" maxlength="15" value="'.$data_voyage["destination"].'" >
							<td><input type="text" id="type" name="type[]" size="4" maxlength="3" value="'.$data_voyageur["type"] .'" ></td>
							<input type="HIDDEN" id="matricule" name="matricule[]" size="6" maxlength="6" value="'.$data_voyageur["matricule"].'" >
													<td><select  style="width:110px;" id="civilite" name="civilite[]" >
															<option selected="selected">'.$data_voyageur["civilite"].'
															<option value="Monsieur" >Monsieur</option >
															<option value="Madame">Madame</option >
													</select></td>
												<td><input type="text" id="nom" name="nom[]" size="20" maxlength="255" value="'.$data_voyageur["nom"].'" ></td>
												<td><input type="text" id="nom_j" name="nom_j[]" size="20" maxlength="255" value="'.$data_voyageur["nom_j"].'" ></td>
												<td><input type="text" id="prenom" name="prenom[]" size="25" maxlength="255" value="'.$data_voyageur["prenom"] .'" ></td>
												<td><input type="date" id="date_n" name="date_n[]" size="8" maxlength="15" value="'.$data_voyageur["date_n"].'" ></td>
												<td><select id="type_chambre" name="type_chambre[]" >
														<option selected="selected"> </option>';
						?>
								<?php include("liste/type_chambre.php"); ?>	
						<?php		
													echo' <td><select id="num_chambre" name="num_chambre[]" >
													<option selected="selected"> </option>';
						?>
								<?php include("liste/num_chambre.php"); ?>	
						<?php
													echo' <td><select id="montant_t" name="montant_t[]" >';
													echo '<option selected="selected"></option>';			
													$param_liste_tranche = $bd->query('SELECT id_voyage, id_ligne, tranche, montant_t
													FROM param_sous_voyage WHERE id_voyage ="' . $data_voyage['id']. '" ORDER BY tranche ASC ');
													while ($lise_Tranche = $param_liste_tranche->fetch())
														{
													echo '<option value="'.$lise_Tranche["montant_t"].'">'. $lise_Tranche["montant_t"].'</option>';
														}
													echo '					
													<td><select id="information" name="information[]" >
																<option selected="selected">Aucune</option>
																<option value="SANS PORC">SANS PORC</option>
																<option value="SANS SEL">SANS SEL</option>
														</select></td>
												<td><input type="text" id="nationalite" name="nationalite[]" size="25" maxlength="15" value="'.$data_voyageur["nationalite"].'" ></td>
												<td><input type="text" id="sexe" name="sexe[]" size="1" maxlength="3" value=""></td>
													<td><select id="piece" name="piece" >
																<option selected="selected">'.$data_voyage["piece"].'</option>
																<option value="PASSEPORT">PASSEPORT</option >
																<option value="CNI">CNI</option >
														</select></td>	
														</tr></tbody></table>
												';
						   }	
													}
													
														else {
															echo "<H3>En attente de sélection d'un profil</H3>";					
															}
	?> 

						   	<input type="submit" value="OK">
												
							</form>
Ensuite la page de validation
<?php
		$req = $bd->prepare('INSERT INTO voyage SET 
    id_perso = :id_perso,
    id_ligne_voyage = :id_ligne_voyage,
    destination= :destination,
    type= :type,
    matricule= :matricule,
    civilite= :civilite,
    nom= :nom,
    nom_j= :nom_j,		
    prenom= :prenom, 
    date_n= STR_TO_DATE(:date_n,"%d/%m/%Y"),
	type_chambre=:type_chambre,
	num_chambre=:num_chambre,
	tarif=:tarif,
	information=:information,
	nationalite=:nationalite,
	sexe=:sexe,
	piece=:piece
    ');
foreach($_POST['id_perso'] as $i => $v) {
 $req->execute(array(
    ':id_perso'=>$v, 
// pour le reste faut utiliser l'index ;)
    ':id_ligne_voyage'=>$_POST['id_ligne_voyage'], 
    ':destination'=>$_POST['destination'],
    ':type'=>$_POST['type'],
    ':matricule'=>$_POST['matricule'],
    ':civilite'=>$_POST['civilite'],
    ':nom'=>$_POST['nom'],
    ':nom_j'=>$_POST['nom_j'],
    ':prenom'=>$_POST['prenom'],
    ':date_n'=>$_POST['date_n'],
	':type_chambre'=>$_POST['type_chambre'],
	':num_chambre'=>$_POST['num_chambre'],
	':tarif'=>$_POST['montant_t'],
	':information'=>$_POST['information'],
	':nationalite'=>$_POST['nationalite'],
	':sexe'=>$_POST['sexe'],
	':piece'=>$_POST['piece']	
    ));	 	
}
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 févr. 2017, 12:30

salut,

ça me rappel quelque chose ;-)

sais tu utiliser un tableau ?
as tu compris comment fonctionne la notation tableau dans le formulaire ?

si tu met <input name="toto[]" /> coté serveur (avec une méthode post) tu auras un tableau dans $_POST['toto'], avec index numérique parce que non précisé.
donc la valeur du champs c'est $_POST['toto'][0]

c'est ce qu'il faut appliquer dans ton cas, car si tu as toujours tout les champs ils auront le même index pour chaque ligne.

pour info je te déconseille la syntaxe d'insertion que tu emplois. c'est spécifique mysql et tu devrais employer la syntaxe standard SQL (insert into () values()).


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 16 Messages

15 févr. 2017, 12:48

Bonjour,
Et oui cela doit vous rappelez quelque chose, et non je n'utilisais pas de tableau et donc je suis dans les ténébres si j'ai bien compris dans name du formulaire je met des croches [] ça c'est bon ensuite dans le code de validation ':id_ligne_voyage'=>$_POST['id_ligne_voyage'][1], ce 1 est la position de la colonne c'est ça ? et donc ensuite j'aurai 2 3 4 5...
Je vais essayer de suite de m'en sortir
Encore merci du temps que vous prenez, je reviens de suite...

Eléphanteau du PHP | 16 Messages

15 févr. 2017, 12:57

Bon avec des [0] partout c'est mieux mais il me met la même personne x fois pourquoi tant de haine ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 févr. 2017, 13:25

il faut commencer par comprendre la notion de tableau.
un tableau, ou collection, contient plusieurs éléments.
pour les retrouver ils ont tous un index différents (numérique, par défaut, ou alpha numérique).
pour une analogie simple c'est comme les boites aux lettres d'un immeuble, sans nom (l'index) le facteur ne sais pas où il doit mettre le courrier (les données.

pour utiliser un tableau on utilise donc l'index. pour avoir son courrier une personne sais qu'elle est sa boite aux lettres. en php on récupère le courrier de Mr dupont avec $boitesAuxLettres['mr dupont']

il est possible de parcourir tout le tableau avec une boucle for ou la structure foreach (littéralement pour chaque, sous entendu ligne du tableau).

une vision plus "a plat" du tableau c'est un tableur (Excel et consort). Imagine un tableau avec une colonne et plein de ligne => tu as la représentation d'un tabelau simple en php.
le tableau lu est un tableau "2 dimensions", un tableau de tableau. Chaque ligne contient un tableau dont les ligne vont correspondre aux colonnes du tableur. L'accès aux données se fait ainsi $tablo[$y][$x] ($x et $y représentent abscisses et ordonnées (a l'inverse d'un repère ortonormé de math le zéro est en haut dans le tableur, un tableau commence toujours à zéro et non 1).

du coup, ont a
- une variable $_POST qui est un tableau
- chaque ligne de $_POST correspond à un champ de formulaire
- les champs nommés avec des [] finaux feront des tableaux (<input name="toto[]" /> donne une tableau dans $_POST['toto']).
- ah ba tient on a u tableau de tableau :)

lorsque php reçois les données du formulaire il crée les tableaux pour chaque champs multiple et incrémente donc l'index.
si tu a un html de ce style
<input type="text" name="nom[]"/> <input type="hidden" name="id[]" value="xxx" />
et que tu as celà 10 fois
tu auras 10 lignes dans $_POST['nom']et 10 dans $_POST['id'].
les index correspondront a ce que tu vois parce qu'il sont affiché à la suite et les données dans le même ordre.

du coup tu parcours l'un des deux tableaux (dans ton cas les id) et a partir de l'index courant (le $i dans mon foreah) tu peux accéder au nom correspondant le formulaire => $_POST['nom'][$i]

et ceci pour tout les champs que tu as affiché en même temps.

Attention si tu as un champs conditionnel c'est foutu il faut forcer l'index pour ne pas avoir de 'trou' (en gros tu risques d'avoir un décalage).
Il faut une chose unique pour tenir ce role l'id est donc tout indiqué
<?php
echo '<input type="texte" name="nom[',$id,']" />'; // idem pour les autres champs et du coup le champs caché id n'est plus utile ;)
voila comment tu peux récupérer les données de ton formulaire pour chaque ligne d'entre elle.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 16 Messages

15 févr. 2017, 14:52

Oui je comprends et c'est très clair un grand merci enfin je vais clôturer ce post.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 févr. 2017, 15:09

de rien

pour info la solution
<?php
$req = $bd->prepare('INSERT INTO voyage SET
      id_perso = :id_perso,
      id_ligne_voyage = :id_ligne_voyage,
      destination= :destination,
      type= :type,
      matricule= :matricule,
      civilite= :civilite,
      nom= :nom,
      nom_j= :nom_j,
      prenom= :prenom,
      date_n= STR_TO_DATE(:date_n,"%d/%m/%Y"),
      type_chambre=:type_chambre,
      num_chambre=:num_chambre,
      tarif=:tarif,
      information=:information,
      nationalite=:nationalite,
      sexe=:sexe,
      piece=:piece
    ');
foreach($_POST['id_perso'] as $i => $v) {
   $req->execute([
      ':id_perso' => $v,
      ':id_ligne_voyage' => $_POST['id_ligne_voyage'][$i],
      ':destination' => $_POST['destination'][$i],
      ':type' => $_POST['type'][$i],
      ':matricule' => $_POST['matricule'][$i],
      ':civilite' => $_POST['civilite'][$i],
      ':nom' => $_POST['nom'][$i],
      ':nom_j' => $_POST['nom_j'][$i],
      ':prenom' => $_POST['prenom'][$i],
      ':date_n' => $_POST['date_n'][$i],
      ':type_chambre' => $_POST['type_chambre'][$i],
      ':num_chambre' => $_POST['num_chambre'][$i],
      ':tarif' => $_POST['montant_t'][$i],
      ':information' => $_POST['information'][$i],
      ':nationalite' => $_POST['nationalite'][$i],
      ':sexe' => $_POST['sexe'][$i],
      ':piece' => $_POST['piece'][$i]
    ]);
}
@+
Il en faut peu pour être heureux ......