[RESOLU] Récupérer plusieurs valeurs de champs d'un formulaire

Eléphanteau du PHP | 24 Messages

15 nov. 2012, 16:33

Bonjour à tous !

Je me permets de venir vers vous pour obtenir un peu d'aide.
Je souhaite récupérer les valeurs du résultat d'une requête et les envoyer par mail.

Actuellement, j'ai comme code de ma page selection.php :

Code : Tout sélectionner

<!--ET AFFICHER LES RESULTATS--> <table cellspacing="0" class="lisaTable"> <tr class="lisaHead"> <th colspan="2"><span style="font-size: 16px">LES VO A RESERVER</span></th> <th class="bg"><h4>Energie</h4></th> <th class="bg"><h4>Kms</h4></th> <th class="bg"><h4>Année</h4></th> <th class="bg"><h4>Prix</h4></th> <th class="bg"><h4>Action ?</h4></th> </tr> <?php $i = 0; $j = 0; foreach($vehicles as $vehicle) { $url = '/occasions/details.php?nvo='.$vehicle['nvo']; ?> <tr class="row<?php echo $i ?><?=($j == 0 ? ' first' : '')?>"> <td class="lisaTdPhoto"> <?php if($vehicle['photo_1']) {?> <a href="<?php echo $url ?>"><img src="<?php echo getUrlPhoto($vehicle['id_ext'],$vehicle['photo_1'],1); ?>" alt="<?php echo strtoupper($vehicle['marque']).' '.$vehicle['modele']?> occasion" class="prevPhoto" /></a> <?php } ?> </td> <td class="lisaTdMain"> <a href="<?php echo $url ?>"><b><?php echo $vehicle['marque'].' '.$vehicle['modele']?></b></a><br /> <?php echo $vehicle['version']; ?></td> <td class="motor"><?php echo $vehicle['motorisation'] ?></td> <td class="km"><?php echo number_format($vehicle['km'], 0, '', ' ') ?> kms</td> <td class="annee"><?php echo $vehicle['millesime'] ? $vehicle['millesime'] : 'NC' ?></td> <td class="prix"><span><?php echo $vehicle['prix'] ? number_format($vehicle['prix'], 0, '', ' ') : 'NC' ?> €</span></td> <td class="prix"><a style="color:#000;" href="<?=getSelectionUrl('delete', $vehicle['id_voiture'])?>">Retirer de ma réservation</a></td> </tr> <form id="contactForm" method="post" action="../occasions/envoi-selection.php"> <input type="hidden" name="nvo" value="<?php echo $vehicle['nvo'] ;?>"> <input type="hidden" name="description" value="<?php echo $vehicle['marque'].' '.$vehicle['modele']?>"> <input type="hidden" name="prix" value="<?php echo $vehicle['prix'] ;?>"> <input type="submit" value="Reserver ces véhicules"/> </form> <?php ($i == 0) ? $i++ : $i=0; $j++; } ?> <tr class="lisaFoot"> <td colspan="7"> </td> </tr> </table> <?php } ?> <!-- FIN AFFICHAGE DU STOCK -->
Et dans le fichier envoi-selection.php

Code : Tout sélectionner

// On récupère les valeurs cachées $vo = $_POST['nvo']; $sendTo = $_POST['sendTo']; $subject = $_POST['subject']; $description = $_POST['description']; $prix = $_POST['prix']; // Adresse qui va recevoir la réservation //$sendTo = "[email protected]"; // En-têtes $subject = "SUJET DE TEST"; $message = " NUMERO DE VO: $vo \r \n MARQUE/MODELE: $description \r \n PRIX: $prix \r \n "; $headers = ''; // Champs From mail($sendTo, $subject, $message, "From: [email protected]"); // Message de confirmation echo "La demande de réservation a bien été envoyée.";
Comme vous vous en doutez, le mail est bien envoyé mais je ne reçois qu'une annonce même si la sélection en comporte plusieurs.

J'aimerais donc "réunir" toutes les annonces de la sélection dans le mail.

Merci :D

ViPHP
ViPHP | 2577 Messages

15 nov. 2012, 16:53

Si tu veux envoyer toutes les annonces affichées, il faut donc faire un seul formulaire et non pas un par ligne. Et aussi un seul bouton.

Il faut également remplace nvo par nvo[] dans le code html (ainsi que les autres noms du formulaire.

Pour récupérer les valeurs :
<?PHP
foreach($_POST['NVO'] as $i=>$bidon) {
// tu travail alors avec $_POST['nvo'][$i], $_POST['prix'][$i]...
}
?>

Eléphanteau du PHP | 24 Messages

15 nov. 2012, 16:59

"Si tu veux envoyer toutes les annonces affichées, il faut donc faire un seul formulaire et non pas un par ligne. Et aussi un seul bouton."
==> ça oui, c'est ce que je cherche à faire :-)

C'est super sympa de prendre le temps de m'expliquer, mais je t'avoue que je n'ai pas compris où placer les valeurs :oops:

Là j'ai donc mis en dehors de la boucle :

Code : Tout sélectionner

<form id="contactForm" method="post" action="../occasions/envoi-selection.php"> <input type="hidden" name="nvo[]" value="<?php echo $vehicle['nvo'] ;?>"> <input type="hidden" name="description[]" value="<?php echo $vehicle['marque'].' '.$vehicle['modele']?>"> <input type="hidden" name="prix[]" value="<?php echo $vehicle['prix'] ;?>"> <input type="submit" value="Reserver ces véhicules"/> </form>
Et dans envoi-selection.php :

Code : Tout sélectionner

<?php foreach($_POST['nvo'] as $i=>$bidon) { // On récupère les valeurs cachées $vo = $_POST['nvo'][$i]; $description = $_POST['description'][$i]; $prix = $_POST['prix'][$i]; } // Adresse qui va recevoir la réservation $sendTo = "[email protected]"; // En-têtes $subject = "SUJET DE TEST"; $message = " NUMERO DE VO: $vo \r \n MARQUE/MODELE: $description \r \n PRIX: $prix \r \n "; $headers = ''; // Champs From mail($sendTo, $subject, $message, "From: [email protected]"); // Message de confirmation echo "La demande de réservation a bien été envoyée."; ?>
Où ai-je faux ?

Merci encore :D

ViPHP
ViPHP | 2577 Messages

15 nov. 2012, 17:11

La première chose à comprendre, c'est qu'actuellement tu as un formulaire avec un bouton par annonce (regarde le code html de la page dans le navigateur). Donc tu envoies uniquement les données du formulaire dont tu utilise le bouton.

Si tu veux envoyer toutes les annonces, il faut donc créer qu'un seul formulaire : sortir <form...> et </form> de la boucle de construction de la liste des annonces.

Ensuite comme tu ne peux pas avoir plusieurs <input...> avec le même nom dans un formulaire, il faut remplacer le nom en ajoutant [] à la fin. C'est à dire nvo devient nvo[], prix[]...

Dans le script de récupération $_POST['nvo'] devient un tableau avec $_POST['nvo'][0], $_POST['nvo'][1]... à toi d'adapter le script.

Remarque, je n'ai pas regardé le script à fond, mais tu pourrais refaire le select dans le script d'envoi de mail pour récupérer les données et constituer le mail.

Eléphanteau du PHP | 24 Messages

15 nov. 2012, 17:16

La première chose à comprendre, c'est qu'actuellement tu as un formulaire avec un bouton par annonce (regarde le code html de la page dans le navigateur). Donc tu envoies uniquement les données du formulaire dont tu utilise le bouton.

Si tu veux envoyer toutes les annonces, il faut donc créer qu'un seul formulaire : sortir <form...> et </form> de la boucle de construction de la liste des annonces.

Ensuite comme tu ne peux pas avoir plusieurs <input...> avec le même nom dans un formulaire, il faut remplacer le nom en ajoutant [] à la fin. C'est à dire nvo devient nvo[], prix[]...

Dans le script de récupération $_POST['nvo'] devient un tableau avec $_POST['nvo'][0], $_POST['nvo'][1]... à toi d'adapter le script.

Remarque, je n'ai pas regardé le script à fond, mais tu pourrais refaire le select dans le script d'envoi de mail pour récupérer les données et constituer le mail.
Oui, je comprends la démarche, et c'est ce que j'essaye de faire avec le code suivant :

------Formulaire sorti de la boucle------

Code : Tout sélectionner

<form id="contactForm" method="post" action="../occasions/envoi-selection.php"> <input type="hidden" name="nvo[]" value="<?php echo $vehicle['nvo'] ;?>"> <input type="hidden" name="description[]" value="<?php echo $vehicle['marque'].' '.$vehicle['modele']?>"> <input type="hidden" name="prix[]" value="<?php echo $vehicle['prix'] ;?>"> <input type="submit" value="Reserver ces véhicules"/> </form>
-------Et le traitement envoi-selection.php------

Code : Tout sélectionner

<?php foreach($_POST['nvo'] as $i=>$bidon) { // On récupère les valeurs cachées $vo = $_POST['nvo'][$i]; $description = $_POST['description'][$i]; $prix = $_POST['prix'][$i]; } // Adresse qui va recevoir la réservation $sendTo = "[email protected]"; // En-têtes $subject = "SUJET DE TEST"; $message = " NUMERO DE VO: $vo \r \n MARQUE/MODELE: $description \r \n PRIX: $prix \r \n "; $headers = ''; // Champs From mail($sendTo, $subject, $message, "From: [email protected]"); // Message de confirmation echo "La demande de réservation a bien été envoyée."; ?>
Mais ça continue à ne m'envoyer qu'une annonce ... :(

ViPHP
AB
ViPHP | 5818 Messages

15 nov. 2012, 17:28

Les lignes
<input type="hidden" name="nvo[]" value="<?php echo $vehicle['nvo'] ;?>">
<input type="hidden" name="description[]" value="<?php echo $vehicle['marque'].' '.$vehicle['modele']?>">
doivent se trouver dans la boucle, pas à l'extérieur.
L'inconvénient de ton système c'est tu en envoies toutes les valeurs affichée et que le visiteur ne pourra pas faire une sélection dans la liste. C'est bien cela que tu veux ? Sinon tu devras faire un système de panier ou alors si tu n'as qu'une page de sélection tu pourrais implémenter des checkbox dans ton formulaire. Il est important que tu aie bien défini le système avant de coder.

Eléphanteau du PHP | 24 Messages

15 nov. 2012, 17:40

Bah le but du jeu, c'est qu'une fois que le visiteur a fait sa sélection (et que donc les véhicules sont affichés sur la page), il m'envoi cette sélection de véhicules par mail ...

Eléphanteau du PHP | 24 Messages

15 nov. 2012, 17:53

Les lignes
<input type="hidden" name="nvo[]" value="<?php echo $vehicle['nvo'] ;?>">
<input type="hidden" name="description[]" value="<?php echo $vehicle['marque'].' '.$vehicle['modele']?>">
doivent se trouver dans la boucle, pas à l'extérieur.
L'inconvénient de ton système c'est tu en envoies toutes les valeurs affichée et que le visiteur ne pourra pas faire une sélection dans la liste. C'est bien cela que tu veux ? Sinon tu devras faire un système de panier ou alors si tu n'as qu'une page de sélection tu pourrais implémenter des checkbox dans ton formulaire. Il est important que tu aie bien défini le système avant de coder.
Le code que je vous ai communiqué se trouve sur la page qui présente les véhicules déjà sélectionnés par le client, un genre de panier quoi.
Et c'est le contenu de ce panier que je veux récupérer par mail.

ViPHP
AB
ViPHP | 5818 Messages

15 nov. 2012, 20:00

Le code que je vous ai communiqué se trouve sur la page qui présente les véhicules déjà sélectionnés par le client, un genre de panier quoi.
Et c'est le contenu de ce panier que je veux récupérer par mail.
Oui ben alors y'a pas de souci, t'es sur la bonne voix. Montre nous ton nouveau formulaire (en utilisant la balise de code php pour entourer ton code, c'est plus lisible).
Sinon aussi fait attention quand tu récupère ton $_POST. Actuellement dans ta boucle
foreach($_POST['nvo'] as $i=>$bidon) {

// On récupère les valeurs cachées
$vo = $_POST['nvo'][$i];
$description = $_POST['description'][$i];
$prix = $_POST['prix'][$i];
}
les variables $vo, $description et $prix sont écrasées par leur dernière valeur rencontrée dans la boucle. Pas étonnant que tu n'en récupère qu'une :wink:

Eléphanteau du PHP | 24 Messages

16 nov. 2012, 09:57

C'est triste mais je n'y arrive vraiment pas ... :oops:

Actuellement, j'ai :
<?php
			$i = 0;
			$j = 0;
			foreach($vehicles as $vehicle) { 
					$url = '/occasions/details.php?nvo='.$vehicle['nvo'];
					?>
					<tr class="row<?php echo $i ?><?=($j == 0 ? ' first' : '')?>">
						<td class="lisaTdPhoto">
                                                    <?php if($vehicle['photo_1']) {?>
                                                        <a href="<?php echo $url ?>"><img src="<?php echo getUrlPhoto($vehicle['id_ext'],$vehicle['photo_1'],1); ?>" alt="<?php echo strtoupper($vehicle['marque']).' '.$vehicle['modele']?> occasion" class="prevPhoto" /></a>
                                                    <?php } ?>
                      </td>
						<td class="lisaTdMain">
							<a href="<?php echo $url ?>"><b><?php echo $vehicle['marque'].' '.$vehicle['modele']?></b></a><br />
						<?php echo $vehicle['version']; ?></td>
						<td class="motor"><?php echo $vehicle['motorisation'] ?></td>
						<td class="km"><?php echo number_format($vehicle['km'], 0, '', ' ') ?> kms</td>
						<td class="annee"><?php echo $vehicle['millesime'] ? $vehicle['millesime'] : 'NC' ?></td>
						<td class="prix"><span><?php echo $vehicle['prix'] ? number_format($vehicle['prix'], 0, '', ' ') : 'NC' ?> €</span></td>
                        <td class="prix"><a style="color:#000;" href="<?=getSelectionUrl('delete', $vehicle['id_voiture'])?>">Retirer de ma réservation</a></td>
					</tr>
                    
                    <input type="hidden" name="nvo[]" value="<?php echo $vehicle['nvo'] ;?>">
					<input type="hidden" name="description[]" value="<?php echo $vehicle['marque'].' '.$vehicle['modele']?>">
					<input type="hidden" name="prix[]" value="<?php echo $vehicle['prix'] ;?>">        
            <?php
			($i == 0) ? $i++ : $i=0;
			$j++;
			}
			?>
			<tr class="lisaFoot">
				<td colspan="7">
				</td>
			</tr>
	  </table>
<?php
			}
			?>
            
					<form id="contactForm" method="post" action="../occasions/envoi-selection.php">
					<input type="submit" value="Reserver ces véhicules"/>
					</form>  
<!-- FIN AFFICHAGE DU STOCK -->
Et dans la page de traitement :
<?php

foreach($_POST['nvo'] as $i=>$bidon) {
// On récupère les valeurs cachées
$vo = $_POST['nvo'];
$description = $_POST['description'];
$prix = $_POST['prix'];
}



// Adresse qui va recevoir la réservation
$sendTo = "[email protected]";

// En-têtes
$subject = "SUJET DE TEST";
$message = " NUMERO DE VO: $vo \r \n MARQUE/MODELE: $description \r \n PRIX: $prix \r \n ";
$headers = '';

// Champs From
mail($sendTo, $subject, $message, "From: [email protected]");

// Message de confirmation
echo "La demande de réservation a bien été envoyée.";

?>

Eléphanteau du PHP | 24 Messages

16 nov. 2012, 16:49

P'tit up ;-)

ViPHP
AB
ViPHP | 5818 Messages

16 nov. 2012, 18:28

Dans ta page de traitement vérifies ton $_POST cela te permettra de voir si tu reçois les données
<?php
echo '<pre>';
print_r($_POST);
echo '</pre>';

//suite
foreach($_POST['nvo'] as $i=>$bidon) {
//..
?>
Ensuite si c'est ok il faut que tu puisse ajouter des données dans tes variables, plutôt que de les remplacer par un nouveau contenu à chaque fois (qu'as tu fais de ma remarque ?).
Une solution est de concaténer (avec un point)
$chaine = '';
foreach ($toto as $value)
{
$chaine .= $value;
}
echo $chaine;

Eléphanteau du PHP | 24 Messages

19 nov. 2012, 10:55

Avec le print_r, j'ai rien du tout :
Array
(
)

Warning: Invalid argument supplied for foreach() in /homepages/29/d438175483/htdocs/occasions/envoi-selection.php on line 8
La demande de réservation a bien été envoyée.
Je désespère ... :mrgreen:

Avatar du membre
Mammouth du PHP | 1609 Messages

19 nov. 2012, 11:12

La balise <form> doit englober tous tes input car seuls les input dans la balise form sont transmis.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 24 Messages

19 nov. 2012, 11:17

La balise <form> doit englober tous tes input car seuls les input dans la balise form sont transmis.
Bonjour et merci.
J'ai rajouté la balise <form> mais toujours pareil ... :oops: