Formulaire PHP avec boucle foreach et radio bouton

Résolu/Fermé
Signaler
Messages postés
10
Date d'inscription
jeudi 3 décembre 2020
Statut
Membre
Dernière intervention
6 décembre 2020
-
Messages postés
34662
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2022
-
Bonjour,
débutant en langage PHP je ne parviens pas à créer un formulaire demandé pour un exercice. J'ai réussi à faire mon formulaire qui comprend 4 boutons radio et 1 submit mais je n'arrive pas à faire l'affiche des réponses.

Mon fomulaire :
<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>
  Dictionnaire exercice
 </title>
</head>
<body>

<form>

 Que désirez-vous afficher ?</br>
 <input type="radio" name="langue" value="anglais">
 Tous les mots en anglais</br>

 <input type="radio" name="langue" value="espagnol">Tous les mots en espagnol</br>

 <input type="radio" name="langue" value="français">Tous les mots en français</br>

 <input type="radio" name="langue" value= "dictionnaire">Tous le dictionnaire</br>

</br>

 <input type="submit" name="afficher" value="Afficher">

</form>



</body>
</html> 


L'objectif est d'avoir en réponse les différents mots du dictionnaire selon le choix de la langue (anglais, français ou espagnol) ou d'afficher tous les mots si l'on sélectionne "dictionnaire". Cependant, la difficulté est que le lien est entre les termes et non pas les langues. Comme selon le schéma suivant :


Pourriez vous m'aider à réaliser ce devoir je ne sais vraiment pas comment m'y prendre mais j'ai compris qu'il fallait faire un lien avec la boucle foreach et donc potentiellement créer des arrays.

Les langues : anglais, français, espagnol

Les mots:
terme1: dog, perro, chien
terme2: cat, gato, chat
terme3: horse, caballo, cheval
terme4: rabbot, conejo, lapin
terme5: hen, gallina,poule

EDIT : Ajout des balises de code

6 réponses

Messages postés
34662
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2022
3 987
Bonjour,

Déjà, lorsque tu postes du code sur le forum, tu dois utiliser les BALISES DE CODE.
Explications à lire entièrement disponibles ici :


Ensuite, ta balise form n'est pas complète.
Tu dois y ajouter des attributs method et action
<form method="post" action="tonfichier.php">


De là, dans tonfichier.php tu peux récupérer les variables en utilisant la super globale $_POST

Vu qu'il s'agit d'un exercice je ne t'en dirai pas plus.... je t'invite à revenir nous voir avec tes tentatives de code si tu rencontres des soucis.


0
Messages postés
10
Date d'inscription
jeudi 3 décembre 2020
Statut
Membre
Dernière intervention
6 décembre 2020

Bonjour,
je ne connais pas encore le fonctionnement du site, je pensais que la mise en forme sous balise se faisait automatiquement (dans votre message je ne vois pas le lien vers l'explication). Pour mes précédentes tentatives voici ce que j'ai fait. Tout d'abord tenter de mettre les données dans des arrays pour ensuite les faire rentrer automatiquement dans mon formulaire avec la boucle foreach. J'ai fait 2 présentations. La première:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>
		Dictionnaire exercice
	</title>
</head>
<body>
<?php
$dictionnaire_liste = 
array(
	array("anglais"=>"dog",
		"espagnol"=>"perro",
		"français"=>"chien"),
	array("anglais"=>"cat",
		"espagnol"=>"gato",
		"français"=>"chat"),
	array("anglais"=>"horse",
		"espagnol"=>"caballo",
		"français"=>"cheval"),
	array("anglais"=>"rabbit",
		"espagnol"=>"conejo",
		"français"=>"lapin"),
	array("anglais"=>"hen",
		"espagnol"=>"gallina",
		"français"=>"poule"));

?>	

<form method="post" action="dictionnaire.php">
	Que désirez-vous afficher ?</br>
	<input type="radio" name="langue" value="anglais">
	Tous les mots en anglais</br>

	<input type="radio" name="langue" value="espagnol">Tous les mots en espagnol</br>

	<input type="radio" name="langue" value="français">Tous les mots en français</br>

	<input type="radio" name="langue" value= "dictionnaire">Tous le dictionnaire</br>

</br>

	<input type="submit" name="afficher" value="afficher">


</form>
</body>
</html>


La seconde:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>
		Dictionnaire exercice
	</title>
</head>
<body>
<?php 
$terme0() = array ();
$terme0['anglais'] ='dog';
$terme0['français'] ='chien';
$terme0['espagnol'] = 'perro';

$terme1()= array ();
$terme0['anglais'] ='cat';
$terme0['français'] ='chat';
$terme0['espagnol'] ='gato';

$terme2()= array ();
$terme0['anglais'] ='horse';
$terme0['français'] ='cheval';
$terme0['espagnol'] ='caballo';

$terme3()= array ();
$terme0['anglais'] ='rabbit';
$terme0['français'] ='lapin';
$terme0['espagnol'] ='conejo';

$terme4()= array ();
$terme0['anglais'] ='hen';
$terme0['français'] ='poule';
$terme0['espagnol'] ='gallina';


$dictionnaire_liste=array($terme0,$terme1,$terme2,$terme3,$terme4);

?>

<form>

	Que désirez-vous afficher ?</br>
	<input type="radio" name="langue" value="anglais">
	Tous les mots en anglais</br>

	<input type="radio" name="langue" value="espagnol">Tous les mots en espagnol</br>

	<input type="radio" name="langue" value="français">Tous les mots en français</br>

	<input type="radio" name="langue" value= "dictionnaire">Tous le dictionnaire</br>

</br>

	<input type="submit" name="afficher" value="Afficher">

</form>

</body>
</html>	


Mais je ne sais pas où mettre la boucle foreach j'ai essayé
<?php
if(isset($_POST['langue'])){

	$langue =$_POST ['langue'];
	
	print "Vous avez selectionné les termes $langue";
}

foreach ($listemot as $key =>$value) {
print "Vous avez selectionné tout les termes du dictionnaire $value";
}

?>
0
Messages postés
34662
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2022
3 987
Oui j'ai oublié de coller le lien... mais visiblement tu as trouvé comment faire.

Je t'invite, au passage, à prendre quelques bonnes habitudes
https://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code

Et pour ce qui est de où mettre ta boucle.. comme tu sembles travailler dans un seul fichier ( ton formulaire et le code php de traitement étant dans le même..) dans ce cas, dans le "action" de ton form, tu peux le mettre à vide
<form method="post" action="">


Ensuite, pour ta liste de mots, la première présentation sera certainement la plus simple pour boucler dessus

ça devrait donner un truc du genre :
<?php

//Affichage des erreurs PHP:
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

//on défini le dictionnaire
$dictionnaire_liste = 
array(
	array("anglais"=>"dog",
		"espagnol"=>"perro",
		"français"=>"chien"),
	array("anglais"=>"cat",
		"espagnol"=>"gato",
		"français"=>"chat"),
	array("anglais"=>"horse",
		"espagnol"=>"caballo",
		"français"=>"cheval"),
	array("anglais"=>"rabbit",
		"espagnol"=>"conejo",
		"français"=>"lapin"),
	array("anglais"=>"hen",
		"espagnol"=>"gallina",
		"français"=>"poule"));

//récupération PROPRE de la variable AVANT de l'utiliser ( via l'écriture TERNAIRE )
  $langue =!empty($_POST ['langue']) ? $_POST ['langue'] : 'TOUTES';
  print "<br>Vous avez selectionné les termes $langue";
  
//Boucle sur les mots du dictionnaire
  foreach ($dictionnaire_liste as $numTerm =>$traductions) {
       echo "<br>Mot N° " . $numTerm +1;
     //boucle sur les langues de chaque terme
       foreach ($traductions as $lng =>$motTraduit ){
           //Si la langue correspond à celle choisi ou qu'on veut toutes les afficher
            if($langue == $lng || $langue =='TOUTES' ){
               echo "<br>".$langue . " -> " . $motTraduit;
            }
        }
    }


?>	
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>
		Dictionnaire exercice
	</title>
</head>
<body>

<form method="post" action="dictionnaire.php">
	Que désirez-vous afficher ?</br>
	<input type="radio" name="langue" value="anglais">
	Tous les mots en anglais</br>

	<input type="radio" name="langue" value="espagnol">Tous les mots en espagnol</br>

	<input type="radio" name="langue" value="français">Tous les mots en français</br>

	<input type="radio" name="langue" value= "dictionnaire">Tous le dictionnaire</br>

</br>

	<input type="submit" name="afficher" value="afficher">


</form>
</body>
</html>
0
Messages postés
10
Date d'inscription
jeudi 3 décembre 2020
Statut
Membre
Dernière intervention
6 décembre 2020
>
Messages postés
34662
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2022

Merci pour votre réponse elle m'est d'une grande aide ! J'ai quelques questions par rapport à ce codage, pourquoi nous n'utilisons pas le 'print' pour afficher les données inscrites et pourquoi avoir donné comme clé $numTerm. Je ne sais pas si cela a un rapport mais j'ai une erreur qui s'affiche dans mon codage sur cette ligne.
0
Messages postés
34662
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2022
3 987 >
Messages postés
34662
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2022

<?php

//Affichage des erreurs PHP:
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

//on défini le dictionnaire
$dictionnaire_liste = 
array(
	array("anglais"=>"dog",
		"espagnol"=>"perro",
		"français"=>"chien"),
	array("anglais"=>"cat",
		"espagnol"=>"gato",
		"français"=>"chat"),
	array("anglais"=>"horse",
		"espagnol"=>"caballo",
		"français"=>"cheval"),
	array("anglais"=>"rabbit",
		"espagnol"=>"conejo",
		"français"=>"lapin"),
	array("anglais"=>"hen",
		"espagnol"=>"gallina",
		"français"=>"poule"));

//récupération PROPRE de la variable AVANT de l'utiliser ( via l'écriture TERNAIRE )
  $langue =!empty($_POST ['langue']) ? $_POST ['langue'] : 'TOUTES';
  print "<br>Vous avez selectionné les termes $langue";
  
//Boucle sur les mots du dictionnaire
  foreach ($dictionnaire_liste as $numTerm =>$traductions) {
       echo "<br>Mot N° " . intval($numTerm +1 );
     //boucle sur les langues de chaque terme
       foreach ($traductions as $lng =>$motTraduit ){
           //Si la langue correspond à celle choisi ou qu'on veut toutes les afficher
            if($langue == $lng || $langue =='TOUTES' ){
               echo "<br>".$langue . " -> " . $motTraduit;
            }
        }
    }


?>	
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>
		Dictionnaire exercice
	</title>
</head>
<body>

<form method="post" action="">
	Que désirez-vous afficher ?</br>
	<input type="radio" name="langue" value="anglais">
	Tous les mots en anglais</br>

	<input type="radio" name="langue" value="espagnol">Tous les mots en espagnol</br>

	<input type="radio" name="langue" value="français">Tous les mots en français</br>

	<input type="radio" name="langue" value= "dictionnaire">Tous le dictionnaire</br>

</br>

	<input type="submit" name="afficher" value="afficher">


</form>
</body>
</html>
0
Messages postés
10
Date d'inscription
jeudi 3 décembre 2020
Statut
Membre
Dernière intervention
6 décembre 2020
>
Messages postés
34662
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2022

Merci beaucoup, j'ai oublié de dire l'erreur. Les termes s'affichent dans la page du formulaire mais je voudrais qu'ils n'apparaissent que lorsque je clique sur le radio bouton qui correspond.
Exemple

Selection : Tous les mots en espagnol
Résultat :
Vous avez choisi d'afficher les mots espagnol </br>
Espagnol</br>
perro</br>
gato</br>
caballo</br>
conejo</br>
gallina</br>
0
Messages postés
34662
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2022
3 987 >
Messages postés
10
Date d'inscription
jeudi 3 décembre 2020
Statut
Membre
Dernière intervention
6 décembre 2020

if(isset($_POST ['langue'])){
//récupération PROPRE de la variable AVANT de l'utiliser ( via l'écriture TERNAIRE )
  $langue =!empty($_POST ['langue']) ? $_POST ['langue'] : 'TOUTES';
  print "<br>Vous avez selectionné les termes $langue";
  
//Boucle sur les mots du dictionnaire
  foreach ($dictionnaire_liste as $numTerm =>$traductions) {
       echo "<br>Mot N° " . intval($numTerm +1 );
     //boucle sur les langues de chaque terme
       foreach ($traductions as $lng =>$motTraduit ){
           //Si la langue correspond à celle choisi ou qu'on veut toutes les afficher
            if($langue == $lng || $langue =='dictionnaire' ){
               echo "<br>".$langue . " -> " . $motTraduit;
            }
        }
    }
 }

0
Messages postés
10
Date d'inscription
jeudi 3 décembre 2020
Statut
Membre
Dernière intervention
6 décembre 2020

D'accord ça fonctionne merci beacoup !! Dernière question pour l'affichage des mots du dictionnaire, lorsque l'on selectionne l'option "afficher tout le dictionnaire" est-ce possible d'afficher les mots selon l'odre suivant : anglais - espagnol - français ?

Exemple : dog - perro - chien
0
Messages postés
34662
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2022
3 987
Renseignes toi sur les fonctions de tri des array
0
Messages postés
10
Date d'inscription
jeudi 3 décembre 2020
Statut
Membre
Dernière intervention
6 décembre 2020
>
Messages postés
34662
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2022

Bonsoir,
j'ai fait mes recherches et je pense avoir trouvé une solution mais je n'arrive pas à l'appliquer. J'ai pu comprendre que la fonction "implode" permet de faire des chaînes depuis des données de tableaux.

J'ai tenté différentes approche mais je ne sais pas comment faire pour que ça fonctionne.

Ma tentative :
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php

//TEST
if(!isset($_POST["afficher"]))
{
?>	
<!--FORMULAIRE-->
<form method="post" action="">
	Que désirez-vous afficher ?</br>
	<input type="radio" name="langue" value="anglais">
	Tous les mots en anglais</br>

	<input type="radio" name="langue" value="espagnol">Tous les mots en espagnol</br>

	<input type="radio" name="langue" value="français">Tous les mots en français</br>

	<input type="radio" name="langue" value= "dictionnaire">Tous le dictionnaire</br>

</br>

	<input type="submit" name="afficher" value="Afficher">


</form>
<?php
	exit();
}
//TESTS
$erreur=0;
if(!isset($_POST["langue"]))
{
	print "Veuillez choisir une langue.";
	$erreur=1;
}

if($erreur==1)
{
	print "</body></html>";
	exit();
}

//ÉTAT DU MONDE
$choix=$_POST["langue"];
$soum=$_POST["afficher"];



//on défini le dictionnaire
$dictionnaire_liste = 
array(
	array("anglais"=>"dog",
		"espagnol"=>"perro",
		"français"=>"chien"),
	array("anglais"=>"cat",
		"espagnol"=>"gato",
		"français"=>"chat"),
	array("anglais"=>"horse",
		"espagnol"=>"caballo",
		"français"=>"cheval"),
	array("anglais"=>"rabbit",
		"espagnol"=>"conejo",
		"français"=>"lapin"),
	array("anglais"=>"hen",
		"espagnol"=>"gallina",
		"français"=>"poule"));

if(isset($_POST ['langue'])){

//PROGRAMME
  $langue =!empty($_POST ['langue']) ? $_POST ['langue'] : 'TOUTES';
  print "<br>Vous avez selectionné les termes $langue";
  

  foreach ($dictionnaire_liste as $numTerm =>$traductions) {

       foreach ($traductions as $lng =>$motTraduit ){
           //Si la langue correspond à celle choisi ou qu'on veut toutes les afficher
            if($langue == $lng){
               echo "<br>" . " - " . $motTraduit;
            }

            if ($langue ==$langue){   
               $separateur =implode("-", $traductions);
               echo "$separateur";

            }
        }
    }
 }

?>
</body>
</html>



Cependant, mon problème est que les termes du dictionnaire apparaissent 3 fois et je n'arrive pas à insérer un </br> pour ne pas mettre les élement en dessous de la phrase d'introduction.
0
Messages postés
34662
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2022
3 987 >
Messages postés
10
Date d'inscription
jeudi 3 décembre 2020
Statut
Membre
Dernière intervention
6 décembre 2020

comment, en cherchant les fonctions qui permettent de faire des tri sur des tableaux, tu as pu arriver sur la fonction implode ?
Connais-tu le mot anglais qui traduit le verbe trier ?
0
Messages postés
10
Date d'inscription
jeudi 3 décembre 2020
Statut
Membre
Dernière intervention
6 décembre 2020
>
Messages postés
34662
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2022

Je ne comprends pas comment je peux faire un affichage en ligne à l'aide du tri. J'arrive à modifier l'ordre d'affichage mais pas la forme (colonne vers ligne) de plus, j'ai des répétitions dans l'affichage du dictionnaire en antier ... je ne m'en sors pas :(
0
Messages postés
10
Date d'inscription
jeudi 3 décembre 2020
Statut
Membre
Dernière intervention
6 décembre 2020

J'ai réussi a avoir un résultat avec implode donc j'ai continué avec. Oui je connais l'équivalent qui est "sort" mais depuis le site d'aide PHP https://www.php.net/manual/fr/intro-whatis.php la fonction qui avait l'explication la plus pertinente était implode. Je vais tenter avec sort.
0
Messages postés
34662
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2022
3 987
En repartant du code que je t'ai donné, il te suffit de retirer les <br> pour que ça s'affiche sur une seule ligne
 if(isset($_POST ['langue'])){ 
//Boucle sur les mots du dictionnaire
  foreach ($dictionnaire_liste as $numTerm =>$traductions) {
       echo "<br>Mot N° " . intval($numTerm +1 );
     //On tri le tableau  qui contient les traductions du mot
  
     //boucle sur les langues de chaque terme
       foreach ($traductions as $lng =>$motTraduit ){
           //Si la langue correspond à celle choisi ou qu'on veut toutes les afficher
            if($langue == $lng || $langue =='dictionnaire' ){
               echo " ". $lng . " -> " . $motTraduit;
            }
        }
    }
 }



Cordialement,
Jordane
0
Messages postés
10
Date d'inscription
jeudi 3 décembre 2020
Statut
Membre
Dernière intervention
6 décembre 2020

Bonsoir j'ai compris ce point mais je n'arrive pas à faire une ligne avec
terme 1 anglais - espagnol - français </br>
terme 2 anglais - espagnol - français </br>
terme 3 anglais - espagnol - français </br>
terme 4 anglais - espagnol - français </br>
...

Je ne sais pas si c'est clair.
0
Messages postés
34662
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2022
3 987
Tu as testé le code que je viens de te donner ?
0