8768 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Ma question est peut être toute bête ou le code y correspondant est irréalisable. La voici :
J'ai construit un tableau à double entrée (2 lignes, 3 colonnes : nom, prénom, ville). Je veux extraire, si elle existe la ligne (nom, prénom,ville) d'une personne. Pour cela j'ai créer un formulaire (form _POST) pour demander à l'utilisateur de me donner un nom. Si ce nom existe dans le tableau, l'extraction s'effectue, sinon on envoie un message.
Jusque là tout va bien
Je voudrais que les renseignements extraits ou le message apparaissent sur une nouvelle page. J'ai donc pensé passer par une session.
C'est alors que ça se complique : si ma donnée est du gente $_SESSION ="toto"; c'est parfait ça marche, mais si elle est du genre $_SESSION=$nom; ($nom étant la variable extraite et contenant le nom proposé) ça ne marche pas.
Quelle peut être mon erreur ?
Merci
Bonjour,

leaemile a écrit :

C'est alors que ça se complique : si ma donnée est du gente $_SESSION ="toto"; c'est parfait ça marche, mais si elle est du genre $_SESSION=$nom; ($nom étant la variable extraite et contenant le nom proposé) ça ne marche pas.
Quelle peut être mon erreur ?
Merci
Voyez plutôt la chose comme devant être
<input name="nom" value="bidulle">


$_SESSION = $_POST;// ici pour servir l'exemple

if ($_SESSION['nom'] === 'bidulle') {
echo "Hey, c'est ", $_SESSION['nom'], " !!!";
}



Sinon en nous montrant les tenants et aboutissants de votre code, ce serait plus facile pour nous pour comprendre le contexte Smiley cligne
Greg_Lumiere,

Dans ton exemple cela fonctionne car tu affecte une donnée "bidule" à la $_SESSION['nom].
Mais moi je veux lui affecter une variable contenant le nom donné par l'utilisateur en fonction des cas différents ...
Voici mon code :
1) la page dans laquelle se trouve le tableau et le formulaire
2) La page dans laquelle je désire obtenir les données (nom, prénom, ville)

<?php session_start();?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">


<html> 
	<HEAD>
		<meta charset="utf-8">
		<meta http-equiv="Content-Language" content="fr">
		<title> Tableau  </title>
	</HEAD>
<body>
		<?php
			// construction du tableau
						$poilus=array(array('ARVY','Jean','Augne'), array('BARLET','François','Augne'));
			// test sur l'existence d'une valeur, ici le nom
				if(isset($_POST['$poilus']))
					{
					$nom=$_POST['nom2'];
					$col=0;
					$ligne=0;
					for($ligne=0;$ligne<8;$ligne++)
						{
						for($col=0;$col<3;$col++)
							{
								if(($poilus[$ligne][$col])==$nom)
									{	
										$patronyme=$poilus[$ligne][$col];
									}
							}
						}
					}
		?>
	<div align="center">
         <form method="POST" action="reponse.php">
                     <input type="text" placeholder="Son Nom" id="nom2" name="nom2" value=""/>
                     <br><br><br><br>
                     <input style="width: 150px ; padding: 5px" type="submit" value="Rechercher" />
		</form>
	</div>
</body>
</html>	




<?php session_start(); ?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html> 
<HEAD>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<meta http-equiv="Content-Language" content="fr">
</HEAD>
<body>
<p align="center"><font size="5" color="blue"><b> Résultats de votre recherche</b></font></p>
    <div align="center" style="width: 60%; margin-left: 20%; margin-top: 10%; padding: 20px; border-style:solid;">
	<?php echo $_SESSION=$_POST['patronyme']; // c'est là que le bas blesse me semble-t-il la variable 'patronyme' n'est pas reconnue ?>
</div>
</body>
</html>
Ha ouaiiiiis, je n'y étais pas du tout.

Alors je verrais un truc de ce genre en modèle one-page
<?php session_start();?>
<!DOCTYPE html>
<html> 
	<head>
		<meta charset="utf-8">
		<meta http-equiv="Content-Language" content="fr">
		<title> Tableau  </title>
	</head>
<body>
  <?php
    // construction du tableau
    $poilus = array(
                    array('ARVY',   'Jean',     'Augne'),
                    array('BARLET', 'François', 'Augne')
                    );
    // test sur l'existence d'une valeur, ici le nom
    $result = false;
    if (!empty($_POST['nom2'])) {
      $needle = $_POST['nom2'];
      foreach ($poilus as $key => $array) {
        if (mb_strtolower($array['0']) === mb_strtolower($needle)) {
          $result['patronyme'] = $array['0'];
          $result['prenom']    = $array['1'];
          $result['ville']     = $array['2'];
        }
      }
    }
    if (empty($result)):?>
	<div align="center">
         <form method="POST" action="<?= $_SERVER['PHP_SELF'];?>">
                     <input type="text" placeholder="Son Nom" id="nom2" name="nom2" value=""/>
                     <br><br><br><br>
                     <input style="width: 150px ; padding: 5px" type="submit" value="Rechercher" />
		</form>
	</div>
<?php else:?>
<p align="center"><font size="5" color="blue"><b> Résultats de votre recherche</b></font></p>
    <div align="center" style="width: 60%; margin-left: 20%; margin-top: 10%; padding: 20px; border-style:solid;">
	<?php echo 'Nom: ', $result['patronyme'], '<br>',
             'Prénom: ', $result['prenom'], '<br>',
             'Ville: ', $result['ville'], '<br>';
  ?>
</div>
<?php endif;?>
</body>
</html>	


Comprenez-vous le principe ?


edit:
Quelques explications sur le code:
- j'initialise une variable $result qui permettra d'une part de contrôler la partie de la page à afficher et d'autre part le résultat de la recherche
- je boucle sur le tableau de donnée en recherchant une correspondance entre 'nom2' et le premier index de chaque sous-tableau
- Si un résultat est trouvé, j'hydrate ma variable $result du contenu dont j'aurais besoin plus tard
- ensuite je teste $result afin de savoir si elle a été hydratée. Si c'est la cas c'est que la recherche a aboutie et j'affiche le résultat sinon j'affiche le formulaire de recherche.
Modifié par Greg_Lumiere (06 Nov 2018 - 18:52)
Bonsoir Greg_Lumiere,

Merci beaucoup d'avoir accepté de vous pencher sur mon code.
Je vais regarder de façon plus approfondie cette proposition un peu plus tard. Toutefois après l'avoir lue rapidement, deux questions (certainement inopportunes, ce que je constaterai après lecture approfondie) :
1) Quand vous dites "en modèle one-page" cela signifie que les résultats apparaîtront sur la même page que celle qui contient le formulaire ?
2) Je suppose que la ligne

if (mb_strtolower($array['0']) === mb_strtolower($needle))

à part de démarrer le test, a pour but également d'éviter les erreurs dues à des différences de case. Si c'est le cas, c'est parfait, car quant à moi, je prévenais l'utilisateur en lui demandant de répondre "en Majuscules", consigne non forcément respectée.

Je vous recontacte demain dans la journée et vous tiendrai au courant de la situation.
Un très grand merci et une bonne soirée.
A demain
re,

1) Oui et non. Plus exactement cela signifie que c'est la même page qui s'occupe du recueille, du traitement et de l'affichage de l'information. Toutefois à l'affichage, en l'état, le formulaire de recherche et la réponse ne cohabitent pas sur le même écran.

2) Tout à fait ! On passe tout en minuscule comme ça on n'a pas à se soucier de la saisie de l'utilisateur. Le préfixe "mb_" sert à traiter les caractère multi-bytes comme n'étant qu'un seul caractère (une habitude que j'ai pris).


Ce que je vous ait mis n'est ni plus ni moins qu'un draft afin d'exposer le mode de fonctionnement.
Il vous revient de le compléter en:
* sécurisant les données de saisie,
* mettant en forme ces mêmes données (suppression des espaces superflux, standardisation des valeurs etc)
* prévoyant un retour à l'utilisateur en cas de saisi non fructueuse.

Je ne connais pas votre liste de "poilus" mais peut-être faille-t-il aussi prévoir le cas de l'homonymie...

Et sur le même principe, pourquoi ne pas proposer aussi une recherche par ville ?


Voili, voilou. Si vous vous avez d'autres questions qui vous viennent, vous savez où me trouver Smiley cligne
Bonjour,
J'ai étudié plus précisément votre code.
1) en ce qui concerne l'utilisation de la page j'ai bien compris ce que vous m'expliquez ce matin, et comme vous me le conseillez il me faudra ajouter et un bouton "retour" en cas de saisie infructueuse et de plus.
2) il est vrai que mon tableau est énorme, plus de 1000 personnes, donc j'ai des homonymie. J'ai ajouté une ligne de code pour essayer de faire apparaître toutes les lignes contenant les homonymes. Petit problème, seul le dernier apparaît alors que le balayage du tableau me les donne tous ?

				if (mb_strtolower($array[0]) === mb_strtolower($needle))
					{
				  $result['patronyme'] = $array['0'];
				  $result['prenom']    = $array['1'];
				  $result['ville']     = $array['2'];
				  $message = $result['patronyme']. "   ".$result['prenom']. " habitant : ".$result['ville'] ;
				  echo $message;


me donne tous les homonymes, mais


<?php else:?>
	<p align="center"><font size="5" color="blue"><b> Résultats de votre recherche</b></font></p>
   <div align="center" style="width: 60%; margin-left: 20%; margin-top: 10%; padding: 20px; border-style:solid;">
	<?php
		  echo $message;
	?>


qui ne donne que le dernier
petite remarque : j'ai posé la condition sur "si $_POST['nom2']" n'est pas vide

3) Votre suggestion est pertinente, pourquoi ne pas faire une recherche par ville, mais dans ce cas les réponses risquent d'être nombreuses, à voir.
4) Enfin, vous me proposez de sécuriser les données de saisie, qu'entendez vous par là ?

Un grand merci pour tout.
Je vais continuer à travailler ce code afin de le peaufiner.
Au plaisir de vous lire.
1) Bonne idée, oui.

2) Normal, à cause de cette ligne
$message = $result['patronyme']. "   ".$result['prenom']. " habitant : ".$result['ville'] ;
A chaque résultat vous remplacez $message par le dernier résultat probant trouvé.
Si vous souhaitez obtenir une chaine en guise de résultat (pas la best idea) il vous faut rajouter un point devant le égale pour dire de concaténer le nouveau résultat avec le précédent ; soit
$message .= $result['patronyme']. "   ".$result['prenom']. " habitant : ".$result['ville'] ;

L'idéal étant de passer par un tableau
$message[] = $result['patronyme']. "   ".$result['prenom']. " habitant : ".$result['ville'] ;

Du côté de la réponse vous aurez alors:

<p align="center"><font size="5" color="blue"><b> Résultats de votre recherche</b></font></p>
<?php foreach ($message as $index => $result):?>
   <div align="center" style="width: 60%; margin-left: 20%; margin-top: 10%; padding: 20px; border-style:solid;">
	<?= $result;?>
</div>
<?php endforeach;?>


3) Probablement, ça c'est à vous de voir Smiley smile

4) Une règle fondamentale régie les données de formulaire:
ne jamais faire confiance aux données utilisateur
Il existe nombre de sujet et de fonctions php qui permettent de mettre un frein aux agissements malicieux des utilisateurs. L'idée est d'empêcher l'injection de code (entre-autre) en nettoyant les entrée et de vérifier que la saisie corresponde aux attentes (par exemple, si vous attendez un chiffre entre 1 et 3 il faut éjecter les types strings, booléens [..] ainsi que les nombre > à 3 et < à 1). Dans votre cas, votre attente est un string de x caractères sans code etc etc.
Le forum fourmille de "petites astuces" à ce propos et Google offre l'accès à une multitude de documentation.
Ha oui, j'oubliais, le fameux trim (voir php.net) qui a plus que jamais toute son utilité.
Meilleure solution
Ha, et aussi j'y pense...

Le cas des noms composés ; probable que vous en ayez.

Si c'est le cas, penchez-vous sur la question qui consiste à rechercher "truc-muche":
- si l'utilisateur saisi "truc muche", il y a t'il correspondance ?

Et aussi les fôtes d'ortograf:
- s'il saisi "truc much" ?

Hé oui, ça complique la vie du développeur mais facilite celle de l'utilisateur Smiley langue

Comme quoi la conception d'un moteur de recherche n'est pas si aisée qu'elle semble l'être de prime abord Smiley biggrin
Modifié par Greg_Lumiere (07 Nov 2018 - 11:21)
Tout à fait d'accord avec votre dernière intervention.

Je crois que je vais abuser un peu de votre gentillesse : où dois-je intégrer mon message "pas de réponse" dans le cas où la condition if(empty($result)) n'est pas remplie ?
Depuis un certain temps je tourne en rond certainement bêtement.
Leaemile, de la même façon que vous initialisez une variable pour contenir le résultat, vous pouvez en initialiser une pour la gestion des messages d'erreur.
Ensuite, c'est là que ça devient plus pointu car maintenant vous obtenez 3 cas de figure :
- initialisation de la recherche: $erreur et $result sont vides donc affiche le formulaire
- terme introuvable: $erreur est hydratée mais $result est vide => on affiche le formulaire de recherche ET le message d'erreur
- terme trouvé: $erreur est vide et $result est hydratée => on affiche le résultat.

On pourrait même pousser le vice en affichant à la fois le résultat de la recherche ET le formulaire de recherche pour que l'utilisateur puisse enchaîner sur une nouvelle recherche.

Peut-être que cette réponse vous plonge au plus profond des abimes et que vous avez la sensation de ne plus savoir comment refaire surface. Si vous le souhaitez, re-publiez donc vos travaux à leur état actuel et nous verrons comment tout ceci peut s'articuler.
Modifié par Greg_Lumiere (07 Nov 2018 - 15:50)
Je reviens vers vous,

"Ensuite, c'est là que ça devient plus pointu car maintenant vous obtenez 3 cas de figure :
- initialisation de la recherche: $erreur et $result sont vides donc affiche le formulaire
- terme introuvable: $erreur est hydratée mais $result est vide => on affiche le formulaire de recherche ET le message d'erreur
- terme trouvé: $erreur est vide et $result est hydratée => on affiche le résultat"

C'est tout à fait ce que cherche à faire

Quant à
"On pourrait même pousser le vice en affichant à la fois le résultat de la recherche ET le formulaire de recherche pour que l'utilisateur puisse enchaîner sur une nouvelle recherche."
je préférerais plutôt construire un bouton "nouvelle recherche" qui lui permettrait de relancer une nouvelle recherche, ainsi qu'un bouton "retour" pour sortir du processus. Mais je verrai cela un peu plus tard.

Voici mon code à l'état actuel :

<?php session_start();?>
<!DOCTYPE html>
<html> 
	<head>
		<meta charset="utf-8">
		<meta http-equiv="Content-Language" content="fr">
		<title> Tableau  </title>
	</head>
<body>
  <?php

		$poilus = array(
						array('ARVY',   'Jean',     'Augne'),
						array('ARVY',   'Louis',     'Beaumont'),
						array('BARLET', 'François', 'Augne')
						);
						
  
		$result = false;
		$message = false;
		if (!empty($_POST['nom2'])) {
		  $needle = $_POST['nom2'];
		  foreach ($poilus as $key => $array) {
			if (mb_strtolower($array['0']) === mb_strtolower($needle)) {
			  $result['patronyme'] = $array['0'];
			  $result['prenom']    = $array['1'];
			  $result['ville']     = $array['2'];
			  $message[] = $result['patronyme']. "   ".$result['prenom']. " habitant : ".$result['ville'] ;
			}
		  }
		}
		
	
		if (empty($result)):?>
		

		<div align="center">
			 <form method="POST" action="<?= $_SERVER['PHP_SELF'];?>">
						 <input type="text" placeholder="Son Nom" id="nom2" name="nom2" value=""/>
						 <br><br><br><br>
						 <input style="width: 150px ; padding: 5px" type="submit" value="Rechercher" />
			</form>
		</div>
		
			<?php else:?>
			
			
<p align="center"><font size="5" color="blue"><b> Résultats de votre recherche</b></font></p>
<?php foreach ($message as $index => $result):?>
   <div align="center" style="width: 60%; margin-left: 20%; margin-top: 1%; padding: 20px; border-style:solid;">
		<?= $result;?>
	</div>
<?php endforeach;?>
</div>
<?php endif;?>
</body>
</html>