8768 sujets

Développement web côté serveur, CMS

Bonjour à vous tous en ce jour de pâques ensoleillé,

Je souhaite poursuivre mon premier devoir de PHP mais je bute sur un problème de syntaxe que je n'arrive pas à résoudre même en révisant mes cours.

Je dois réaliser une application de covoiturage où les internautes devront passer par un formulaire de contact pour la mise en relation avec des conducteurs pour des voyages. L'internaute doit choisir une ville de départ, à partir d'une liste définie, et en fonction de son choix différents itinéraires lui seront proposés.

Voici ma structure HTML :

<!doctype html>
<html lang="fr">
<head>
	<meta charset="UTF-8">
	<title>Devoir 1, développer en PHP</title>
</head>
<body>
	<form action="traitement" method="post">
		<label>Nom : </label>
		<input type="text" name="nom">
		<br>
		<label>Prénom : </label>
		<input type="text" name="prenom">
		<br>
		<label>E-mail :</label>
		<input type="email" name="email">
		<br>
		<label>Téléphone : </label>
		<input type="texte" name="telephone">
		<br>
		<select name="ville">
			<option>--Ville de départ --</option>
			<option value="paris" name="paris">Paris</option>
			<option value="orleans" name="orleans">Orléans</option>
			<option value="dublin" name="dublin">Dublin</option>
			<option value="nice" name="nice">Nice</option>
			<option value="tours" name="tours">Tours</option>
		</select>
		<br>
		<input type="submit" name="validation">
	</form>
</body>
</html>


Voici le résultat à l'écran :
upload/1650259053-62242-capturedancran2022-04-1807171.png

Et voici le script PHP :

$voyages = array(
		['id' => 0, 'depart' => 'Paris', 'destination' => 'Nantes', 'heure_depart' => '11:00', 'heure_arrivee' => '12:34', 'conducteur' => 'Thomas'],
		['id' => 1, 'depart' => 'Orléans', 'destination' => 'Nantes', 'heure_depart' => '05:15', 'heure_arrivee' => '09:32', 'conducteur' => 'Mathieu'],
		['id' => 2, 'depart' => 'Dublin', 'destination' => 'Tours', 'heure_depart' => '07:23', 'heure_arrivee' => '08:50', 'conducteur' => 'Nathanaël'],
		['id' => 3, 'depart' => 'Paris', 'destination' => 'Orléans', 'heure_depart' => '03:00', 'heure_arrivee' => '05:26', 'conducteur' => 'Clément'],
		['id' => 4, 'depart' => 'Paris', 'destination' => 'Nice', 'heure_depart' => '10:00', 'heure_arrivee' => '12:09', 'conducteur' => 'Audrey'],
		['id' => 5, 'depart' => 'Nice', 'destination' => 'Nantes', 'heure_depart' => '10:40', 'heure_arrivee' => '13:00', 'conducteur' => 'Pollux'],
		['id' => 6, 'depart' => 'Nice', 'destination' => 'Tours', 'heure_depart' => '11:00', 'heure_arrivee' => '16:10', 'conducteur' => 'Edouard'],
		['id' => 7, 'depart' => 'Tours', 'destination' => 'Amboise', 'heure_depart' => '16:00', 'heure_arrivee' => '18:40', 'conducteur' => 'Priscilla'],
		['id' => 8, 'depart' => 'Nice', 'destination' => 'Nantes', 'heure_depart' => '12:00', 'heure_arrivee' => '16:00', 'conducteur' => 'Charlotte'],
	);
	
	if($_POST['ville'] == $_POST['paris']){
		echo 'Voyages possibles si ville de départ = ' . $_POST['paris'];
		foreach($voyages as $valeur){
			echo $_POST[0] . '<br>';
			echo $_POST[3] . '<br>';
			echo $_POST[4] . '<br>';
		}
	}else{
		echo 'Choisissez une ville de départ';
	}


Dans mes cours, il n'est pas fait mention d'un exemple de codage avec une liste <select> et <option>, seulement avec des boutons radio. Je pense que l'erreur vient de la condition ($_POST['ville'] == $_POST['paris']) où je cherche à tester que si le choix de l'internaute est Paris alors la boucle foreach lui renvoi les valeurs des clefs 0, 3 et 4 sinon elle demande de choisir une ville.

Merci à vous pour votre aide.
Modifié par ObiJuanKenobi (18 Apr 2022 - 07:25)
Bonjour,

Ton champ select a pour nom "ville", et la valeur postée est la valeur de l'option sélectionnée par l'utilisateur, que tu peux récupérer avec $_POST['ville'].

$_POST['paris'] n'existe pas, puisqu'il n'y a aucun champ nommé "paris"

D'autre part, dans ton tableau $voyages, comme les villes sont dans un sous-tableau tu es obligé de parcourir avec une boucle pour trouver la bonne ville.

Si tu crées à la place un tableau associatif indexé sur les villes de départ tu n'as plus besoin de cette boucle. Ce qui est bien utile s'il y a des milliers de villes enregistrées.

Voici comment j'écrirais tout ça:


$voyages = array(
    'Paris' => [
        ['id' => 0, 'destination' => 'Nantes', 'heure_depart' => '11:00', 'heure_arrivee' => '12:34', 'conducteur' => 'Thomas'],
        ['id' => 3, 'destination' => 'Orléans', 'heure_depart' => '03:00', 'heure_arrivee' => '05:26', 'conducteur' => 'Clément'],
		['id' => 4, 'destination' => 'Nice', 'heure_depart' => '10:00', 'heure_arrivee' => '12:09', 'conducteur' => 'Audrey'],
    ],
    'Orléans' => [
        ['id' => 1, 'destination' => 'Nantes', 'heure_depart' => '05:15', 'heure_arrivee' => '09:32', 'conducteur' => 'Mathieu']
    ],
    'Dublin' => [
        ['id' => 2, 'destination' => 'Tours', 'heure_depart' => '07:23', 'heure_arrivee' => '08:50', 'conducteur' => 'Nathanaël']
    ],
    'Nice' => [
        ['id' => 5, 'destination' => 'Nantes', 'heure_depart' => '10:40', 'heure_arrivee' => '13:00', 'conducteur' => 'Pollux'],
        ['id' => 5, 'destination' => 'Nantes', 'heure_depart' => '10:40', 'heure_arrivee' => '13:00', 'conducteur' => 'Pollux'],
		['id' => 6, 'destination' => 'Tours', 'heure_depart' => '11:00', 'heure_arrivee' => '16:10', 'conducteur' => 'Edouard'],
        ['id' => 8, 'destination' => 'Nantes', 'heure_depart' => '12:00', 'heure_arrivee' => '16:00', 'conducteur' => 'Charlotte']
    ],
    'Tours' => [
        ['id' => 7, 'destination' => 'Amboise', 'heure_depart' => '16:00', 'heure_arrivee' => '18:40', 'conducteur' => 'Priscilla']
    ]
);

if (isset($_POST['ville'] && array_key_exists($_POST['ville'], $voyages)) {
    $ville = $_POST['ville'];
    $enregistrements = $voyages[$ville];

    echo '<h4>Départs de ' . $ville . '</h4>';
    foreach ($enregistrements as $values) {
        echo '<p>' . $values['conducteur'] . ' va à ' . $values['destination'] . ' et part à ' . $values['heure_depart'] . '.</p>';
    }
}


Important: dans ton code HTML il faudra remplacer les valeurs des options par les noms des villes avec majuscule et accents. Par exemple:

<-- ton ancien code -->
<option value="paris" name="paris">Paris</option>

<-- à remplacer par -->
<option value="Paris" name="paris">Paris</option>


Un dernier conseil: ne vas surtout pas à Nantes avec Mathieu, il conduit trop mal.
Merci Migli pour ta solution. Je vais l'étudier en détail mais j'ai peur qu'elle soit complexe pour moi. Si je ne comprends pas, si je n'arrive pas à décortiquer ligne par ligne, je reviendrai demander de l'aide.

J'ai bien enregistré que je ne dois pas aller à Nantes avec Mathieu parce qu'il conduit comme un cochon.
Modifié par ObiJuanKenobi (18 Apr 2022 - 10:42)
J'ai une question pour les développeurs PHP qui fréquentent Alsacreation. Au bout de combien d'années êtes-vous devenu développeurs ? Vous a-t-il fallu plusieurs années ou bien seulement quelques mois pour être capables de développer aisément ? Parce que moi, je me demande si je suis capable de m'orienter dans ce domaine (je suis chef de rang dans la restauration de luxe). Je ne sais pas si c'est du défaitisme ou un comportement normal, sachant que j'ai commencé l'initiation du PHP il y a un peu plus de 2 semaines. Le HTML et le CSS je l'ai compris plus facilement mais je ne le maîtrise pas pour le moment. Cependant, le PHP, j'avoue que c'est un peu plus compliqué même si j'arrive à suivre pour le moment.
Modifié par ObiJuanKenobi (18 Apr 2022 - 10:43)
Salut,

Pour répondre à ta dernière question, l’informatique n’a jamais été aussi accessible au vu des ressources disponible sur internet, mais ça n’en fait pas un métier facile pour autant. Être développeur ça veux dire quoi pour toi ? C’est très vaste comme domaine et y’a beaucoup de spécialisations différentes.

D’une manière générale, tes deux semaines de formations ne sont pas du tout représentatives du métier. Pour devenir ingénieur (ça aussi c’est un grand mot qui veut parfois rien dire) j’ai étudié pendant des années. Et même quand tu sors de tes études, l’expérience sur le terrain t’apporte souvent encore plus, parce que la réalité est souvent différente de la théorie.

Si le PHP te paraît un peu plus difficile, c’est parce que que tu commences à faire du développement à proprement parler. L’HTML et le CSS n’en sont pas. D’ailleurs, je connais pas du tout tes objectifs, mais suivant quoi, penser à voir plus loin que le web ça peut être intéressant (mais sans doute plus difficile).

Garde le cap pour l’instant, c’est le début mais tu as l’air motivé et structuré. C’est l’important Smiley smile
Modifié par Anymah (18 Apr 2022 - 17:30)
@ObiJuanKenobi

Comme le dit @Anymah, chacun a son parcours, ses compétences, et les langage et outils sont maintenant tellement nombreux et variés que chacun a ses orientations et propres compétences.

Pour essayer de t'orienter un peu, je dirais que :
- HTML/CSS sont une base absolument indispensable. Ils concernent le rendu et la mise en forme envoyés au navigateur
- Tu as ensuite besoin d'un langage "logique". PHP par exemple. Il faut savoir que tous les langage logiques utilisent les mêmes structures de base, c'est à dire des variables, tableaux, objets, et les mêmes structures logiques, par exemple les boucles et les conditions (if ...else).
En apprenant PHP tu t'habitues à les utiliser, si un jour tu t'intéresse à un autre langage tu retrouveras toujours cette logique.
- Tu devras ensuite apprendre l'organisation des données (MySQL avec phpMyAdmin probablement)

Si tu deviens familier avec tout ça c'est déjà une base solide.

Javascript est aussi fondamental. Il permet d'interagir avec le navigateur, mais c'erst aussi comme PHP un langage logique. Si par la suite tu développes des applis pour smartphone elles doivent être programmées en Javascript.

Pour finir : si tu aimes ce que tu fais tu auras besoin de temps pour asdsimiler tout ça mais ça n'est pas un problème, il faut avoir confiance et être patient.

L'essentiel est à mon sens d'aimer apprendre et comprendre, résoudre des difficultés, créer et avoir de la satisfaction lorsqu'on parvient à un certain résultat.
Migli, j'ai testé ton code mais il ne fonctionne pas. Rien ne s'affiche après avoir sélectionné une ville. En testant le code, j'ai d'abord eu une notice et j'ai corrigé une petite erreur. Il manquait une ")" à la fin de :
isset($_POST['ville'])

J'ai réussit à comprendre le code de la structure conditionnelle sauf la fonction array_key_exists que je n'ai pas encore abordée. Pour tester si une variable d'un tableau n'est pas vide, on devait utiliser :
!isset

Et merci pour vos détails concernant le métier de développeur. Je dois donc consacrer plusieurs années avant d'être à l'aise avec un langage logique. Il se trouve que j'aime la programmation. J'ai voulu m'orienter vers ce domaine mais je n'attendais plus grand chose de l'école. Elle m'ennuyait et je l'ai quittée après le Bac pour m'intégrer tout de suite dans le marché du travail. Je suis chef de rang dans la restauration de luxe et la pandémie m'a mis au chômage partiel. J'en ai profité pour commencer à toucher à la création de sites web en suivant des tutoriels sur le HTML et le CSS. Mais j'ai vite été confronté à des problèmes de compréhension et aujourd'hui je reprends les cours en e-learning dans une école payante.
Modifié par ObiJuanKenobi (19 Apr 2022 - 07:14)
Je viens de tester:

- Il manquait effectivement une parenthèse de fermeture:
if (isset($_POST['ville']) && array_key_exists($_POST['ville'], $voyages)) {


- J'ai ajouté les majuscules & accents aux valeurs des options, peut-être as-tu oublié ça car un fois fait ça fonctionne bien.

- A propos de array_key_exists:
Dans ton code original:
ton tableau est indexé numériquement. ça veut dire que c'est un tableau clés => valeurs, dans lequel les clés sont 0, 1, 2, ...
Si tu recherches la ville postée, tu es obligé de parcourir toutes les clés avec une boucle.

Dans ma solution:
c'est un tableau associatif. Les clés ne sont plus des numéros, mais des villes.
Donc pour trouver les valeurs correspondant à ville postée, il suffit d'appeler $voyages['Paris'] par exemple. ça évite de faire une boucle.
if (array_key_exists($_POST['ville'], $voyages)) {

en Français, on dirait: "Si la clé $_POST['ville'] existe dans le tableau $voyages"
https://www.php.net/manual/fr/function.array-key-exists.php

Bonne chance pour la suite
Merci Migli, ça fonctionne maintenant.

Il ne me reste plus qu'à placer cette structure conditionnelle, contenant la boucle foreach, dans une autre structure conditionnelle testant si le bouton "Envoyer" a été cliqué. Si oui, elle testera une autre structure conditionnelle vérifiant que tous les champs ont été remplis et qu'une ville de départ a été choisie. Si ce n'est pas le cas, elle renverra l'alerte "Remplissez tous les champs et choisissez une ville de départ". Sinon, elle exécutera la structure conditionnelle contenant le foreach et affichera le résultat. Pour finir, j'embellirai un peu la page HTML avec du CSS.

Je suis a peu près sûr que le formateur ne va pas aimer que la fonction array_key_exists ait été utilisée parce qu'elle n'a pas été abordée dans les cours d'initiation au PHP. Mais peut importe pour moi, ce qui compte c'est que je comprenne à quoi elle sert et comment l'utiliser. Même si j'ai un 0, ma formation ne se soldera pas par l'obtention d'un diplôme.
Modifié par ObiJuanKenobi (19 Apr 2022 - 11:10)
Voici mon code définitif :

$voyages = array(
'Paris' => [
        ['id' => 0, 'destination' => 'Nantes', 'heure_depart' => '11:00', 'heure_arrivee' => '12:34', 'conducteur' => 'Thomas'],
        ['id' => 3, 'destination' => 'Orléans', 'heure_depart' => '03:00', 'heure_arrivee' => '05:26', 'conducteur' => 'Clément'],
		['id' => 4, 'destination' => 'Nice', 'heure_depart' => '10:00', 'heure_arrivee' => '12:09', 'conducteur' => 'Audrey'],
    ],
    'Orléans' => [
        ['id' => 1, 'destination' => 'Nantes', 'heure_depart' => '05:15', 'heure_arrivee' => '09:32', 'conducteur' => 'Mathieu']
    ],
    'Dublin' => [
        ['id' => 2, 'destination' => 'Tours', 'heure_depart' => '07:23', 'heure_arrivee' => '08:50', 'conducteur' => 'Nathanaël']
    ],
    'Nice' => [
        ['id' => 5, 'destination' => 'Nantes', 'heure_depart' => '10:40', 'heure_arrivee' => '13:00', 'conducteur' => 'Pollux'],
        ['id' => 5, 'destination' => 'Nantes', 'heure_depart' => '10:40', 'heure_arrivee' => '13:00', 'conducteur' => 'Pollux'],
		['id' => 6, 'destination' => 'Tours', 'heure_depart' => '11:00', 'heure_arrivee' => '16:10', 'conducteur' => 'Edouard'],
        ['id' => 8, 'destination' => 'Nantes', 'heure_depart' => '12:00', 'heure_arrivee' => '16:00', 'conducteur' => 'Charlotte']
    ],
    'Tours' => [
        ['id' => 7, 'destination' => 'Amboise', 'heure_depart' => '16:00', 'heure_arrivee' => '18:40', 'conducteur' => 'Priscilla']
    ]
);

if(isset($_POST['validation'])){
	if
	(
	empty($_POST['nom']) OR
	empty($_POST['prenom']) OR
	empty($_POST['email']) OR
	empty($_POST['telephone']) OR
	!isset($_POST['ville'])
	)
	{
		echo 'Remplissez tous les champs du formulaire et choisissez une ville de départ.';
	}else{
		if (isset($_POST['ville']) && array_key_exists($_POST['ville'], $voyages)) {
		$ville = $_POST['ville'];
		$enregistrements = $voyages[$ville];
		echo '<h4>Départs de ' . $ville . '</h4>';
		foreach ($enregistrements as $values) {
			echo '<p>' . $values['conducteur'] . ' va à ' . $values['destination'] . ' et part à ' . $values['heure_depart'] . '.</p>';
		}
		}
	}
}

Il fonctionne partiellement parce qu'il a un défaut. Quand je teste :
- tous les champs sont remplis et une ville de départ est choisie => OK
- tous les champs ne sont pas remplis mais une ville de départ est choisie => OK
- aucun champ n'est rempli ni aucune ville de départ n'est choisie => OK
- tous les champs sont remplis mais aucune ville de départ n'est choisie => PAS OK
Pour les trois premiers, j'ai un message m'indiquant de remplir les champs et de choisir la ville de départ. Mais le dernier ne me renvoi rien

Je pense que le souci se trouve dans les if() imbriqués. Pourtant, j'ai placé la boucle if avec le foreach avant et après et j'ai toujours le défaut. Pourtant, je teste si la variable "ville" est vide (!isset($_POST['ville']).

Vous voyez où se trouve le défaut ?
Modifié par ObiJuanKenobi (20 Apr 2022 - 07:06)
Modérateur
Bonjour,

Pour 'ville', c'est 'empty' qu'il te faut tester. En envoyant ton formulaire, le champ ville est forcément là, mais vide Smiley cligne ou pas selon que tu l'ai rempli ou non.

Cdt
Modifié par gcyrillus (20 Apr 2022 - 08:34)
Merci gcyrillus, tu m'as mis sur la bonne voie. Ce n'est pas effectivement !isset que je devais tester mais !empty.

Je pensais que les champs <select> et <option> se comportaient comme pour les <input> de type radio. C'est-à-dire que lorsqu'on ne choisi aucune option, non seulement il n'y a pas de valeur mais la variable n'existe pas non plus. Donc, je m'étais orienté vers le !isset pour tester l'existence de la variable. Mais ça marche maintenant avec !empty.
Si ton formateur n'est pas content que tu utilises une fonction que vous n'avez pas vue ensemble, il faut qu'il retourne lui-même se former à l'enseignement.

N'hésite pas à lui transmettre ce message de ma part si ça se produit. Mais bon je suis convaincu que ça n'arrivera pas.
Je ne vise pas un diplôme. Je veux juste apprendre et pratiquer. Donc, peu m'importe que j'ai une mauvaise note. J'ai compris comment utiliser une structure conditionnelle, une boucle foreach et comment construire une variable de type tableau. J'ai payé la formation, je ne pense pas qu'il va me passer un savon pour avoir utilisé une fonction non abordée. S'il me pose la question, je répondrai que je me suis fait aider par un forum. Et s'il n'est pas content, c'est le même tarif.