[RESOLU] Insertion de plusieurs enregistrements

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Insertion de plusieurs enregistrements

Re: Insertion de plusieurs enregistrements

par Cricri » 09 févr. 2017, 12:47

Merci
Je vais refaire tout cela
Ce site est vraiment performant...

Re: Insertion de plusieurs enregistrements

par moogli » 08 févr. 2017, 18:01

ben c'est normal tu as des tableaux dans les index de POST (tu as lu trop vite ce que j'ai mis).

utilise foreach pour boucler sur un des champs de formulaire et avaec l'index tu récupères les données.
seule le query doit être dans la boucle :-)
<?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")
    ');
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'=>strtoupper($_POST['nom']),
    ':nom_j'=>strtoupper($_POST['nom_j']),
    ':prenom'=>$_POST['prenom'],
    ':date_n'=>$_POST['date_n']
    ));	 	
}

@+

Re: Insertion de plusieurs enregistrements

par Cricri » 08 févr. 2017, 17:03

Voilà c'est fait mais je n'ai que des messages d'erreur
Warning: strtoupper() expects parameter 1 to be string, array given in C:\wamp64\www\meridionale\test\ex_insert_voyageur.php on line 34 (pour toutes les lignes)
et aussi pour toutes les lignes
Notice: Array to string conversion in C:\wamp64\www\meridionale\test\ex_insert_voyageur.php on line 43
avec
$_POST["nom"]=Array
et aussi
Warning: PDOStatement::execute(): SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'nom' ne peut être vide (null) in C:\wamp64\www\meridionale\test\ex_insert_voyageur.php on line 37

Que faire ?

Re: Insertion de plusieurs enregistrements

par Cricri » 08 févr. 2017, 16:47

Voilà le code 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")
		');
		
		$req->execute(array(
		':id_perso'=>$_POST['id_perso'], 
		':id_ligne_voyage'=>$_POST['id_ligne_voyage'], 
		':destination'=>$_POST['destination'],
		':type'=>$_POST['type'],
		':matricule'=>$_POST['matricule'],
		':civilite'=>$_POST['civilite'],
		':nom'=>strtoupper($_POST['nom']),
		':nom_j'=>strtoupper($_POST['nom_j']),
		':prenom'=>$_POST['prenom'],
		':date_n'=>$_POST['date_n']
		));	 	
				?>
Merci de ces réponses pour le code de validation je dois faire comment ?

Re: Insertion de plusieurs enregistrements

par moogli » 08 févr. 2017, 16:41

Dans le champ name il faut name="id_perso[]" à la place de name="id_perso" ?
oui

et pour tout les champs ;)

Re: Insertion de plusieurs enregistrements

par Cricri » 08 févr. 2017, 16:33

Bonjour
Le but est d'insérer dans une table les enregitrements sélectionnés et donc voilà la différence entre membre conjoint et enfant est fait par le champ type.
Dans le champ name il faut name="id_perso[]" à la place de name="id_perso" ?

Re: Insertion de plusieurs enregistrements

par moogli » 08 févr. 2017, 16:14

salut,

il n'y a pas le code de validation du coup ce que je vais dire n'est que pure spéculation.
Il me semble un peu dommage de confondre membre et enfant, il faudra faire la différence à la validation et donc deux circuit de traitement différent quoi qu'il arrive.

ensuite vue le code il faut que tu utilises la notation tableau pour les noms des champs du formulaire ( name="toto[]"). Tu auras ainsi un tableau coté serveur afin d'avoir les données d'une même personne au même index.
le champs type ne doit pas être affiché c'est ton seul moyen de savoir a qu'elle table il appartient. sinon il faut que tu gardes la valeur d'origine (donc un champs caché) pour comparer les valeurs et en cas de modification supprimer la ligne de la table d'origine et insérer dans la nouvelle (plutôt qu'un update).

perso je n'utiliserais pas d'union et ferais trois requêtes histoire de séparer les choses, c'est plus claire dans le code et dans l’utilisation des données.

@+

Insertion de plusieurs enregistrements

par Cricri » 08 févr. 2017, 15:11

Bonjour à tous,
J'ai évidement un problème je n'arrive pas à insérer tous les enregistrements sélectionnés.
J'ai une requête UNION qui liste le membre, son conjoint et ses enfants ces informations se trouvent dans 2 tables la table membre et la table enfant.
Ensuite j'affiche les informations dans un formulaire, le code génère autant de formulaire que d'enregistrement le bouton SUMIT est sortie de la boucle.
Si je clique dessus un seul enregistrement est insérer, après de nombreuses recherche je pense que les enregistrements s'écrassent et seulement le dernier est inséré dans la base.
J'ai essayé sans succés
<td><input type="text" id="id_perso" [u]name="id_perso[<?php echo $affiche["id_perso"];?>]" [/u]size="4" maxlength="6" value="'.$affiche["id_perso"].'" ></td>
Voici le code de ma page
?>
	
				
					
						<?php	
						$req1 = $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 
						FROM param_voyage WHERE id_ligne_voyage ="' . $_SESSION['id_voy']. '" ');
							$donnees1 = $req1->fetch();
							
						?>		
					<?php	
							
								echo "<p><B>Voyage sélectionné " .$donnees1['destination'].
								" du " .$donnees1['date_debut']. " au " .$donnees1['date_fin']." Nbre de places " .$donnees1['nbre_place']. " Montant global " .$donnees1['montant_g']." €</B></p>";
						?>
				

		<form method="post" action="select_voyageur.php">
				<p>
				<label for="profil">Veuillez...</label>
				<select id="matricule" name="matricule">
				<option selected="selected"></option>				
			<?php 
			
				$req = $bd->query('SELECT matricule, id, nom, prenom FROM membre ORDER BY nom ASC');
						
				while ($liste = $req->fetch())
					{
				echo '<option value="'.$liste["matricule"].'""'.stripslashes(strtoupper($liste["nom"])).'""'.stripslashes($liste["prenom"]).'">'. stripslashes(strtoupper($liste["nom"])).' '. stripslashes($liste["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	
$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", 
"" 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", 
"" 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", 
"" as "select"  
FROM enfant where enfant.matricule="'.$_SESSION['id_mat'].'" 
');

while ($affiche = $voyageur->fetch()) {


			echo '	
			<form name="insertion" action="ex_insert_voyageur.php" onsubmit="return verifForm(this)" method="POST">	
<table width="91%" >
	<tbody>
								


								<td><input type="text" id="id_perso" name="id_perso" size="4" maxlength="6" value="'.$affiche["id_perso"].'" ></td>
								<td><input type="text" id="id_ligne_voyage" name="id_ligne_voyage" size="20" maxlength="15" value="'.$donnees1["id_ligne_voyage"].'" ></td>
								
								<td><input type="text" id="destination" name="destination" size="20" maxlength="15" value="'.$donnees1["destination"].'" ></td>
								
								<td><input type="text" id="type" name="type" size="4" maxlength="3" value="'.$affiche["type"] .'" ></td>
								
								<td><input type="text" id="matricule" name="matricule" size="6" maxlength="6" value="'.$affiche["matricule"].'" ></td>
								
								<td>
								<select  style="width:110px;" id="civilite" name="civilite" >
								<option selected="selected">'.$affiche["civilite"].'</option>
								<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="'.$affiche["nom"].'" ></td>
									
								
								<td><input type="text" id="nom_j" name="nom_j" size="20" maxlength="255" value="'.$affiche["nom_j"].'" ></td>
								
								<td><input type="text" id="prenom" name="prenom" size="25" maxlength="255" value="'.$affiche["prenom"] .'" ></td>
							
								<td><input type="date" id="date_n" name="date_n" size="8" maxlength="15" value="'.$affiche["date_n"].'" ></td>
							
							

 	



     
</tr>
</tbody>
  </table>

';
  	 }
echo '<td size="5"><input type="submit" value="OK"></td>';
echo '</form>';
				
   }
				else {
					echo "<H3>En attente de sélection d'un profil</H3>";

				
					
					}
						?>
Merci de vos réponses.