[RESOLU] Problème de redirection de page

Pasil2
Invité n'ayant pas de compte PHPfrance

02 déc. 2021, 16:18

Bonjour à tout(e)s. Après plusieurs jours de recherches infructueuses, je viens vous demander de l'aide pour un problème avec le code, que je veux utiliser pour rediriger vers une page et le lien correspondant au mot saisi dans le formulaire de recherche.
Le code vérifie bien l'existence du mot, dans le tableau crée dans le fichier "recherche.php" et s'il existe, redirige vers la page où se trouvent la définition de tous les mots commençant par cette lettre mais, et c'est là le problème, il redirige toujours vers le lien du premier mot de la liste, (du tableau), quel que soit le mot saisi.
Par exemple, pour les mots commençant par "a", je voudrais qu'il redirige vers le lien correspondant au mot saisi, c'est-à-dire, au lieu d'ouvrir le lien (***.php#4), qu'il ouvre dans le bon (***.php#xx).
Je n'arrive pas à trouver la solution. Il manque ou il y a une erreur quelque part dans le code. Merci d'avance pour votre aide.
Ci-joint le code du formulaire et du fichier de contrôle.

Code : Tout sélectionner

<!-- Le code du formulaire est dans la page de saisie--> <form action="" method="post" name="Rechercher" id="Rechercher"> <?php if($erreur){ ?> <fieldset style="margin-top: 15px; margin-bottom: 10px;"> <ul><? echo $erreur ?></ul> </fieldset> <?php } ?> <fieldset style="text-align: left; margin-top: 20px; margin-bottom: 0px;"> <label for="Recherche" style="font color: #0000FF; margin-top: 0px; margin-bottom: 12px; padding-top: 0px;">Rechercher:</label><br/> <input type='text' onKeyUp="this.value=this.value.toLowerCase()" name='Recherche' id='Recherche' autofocus="autofocus" placeholder='&#x270D;&#xA0;Tapez le mot &#xE0; rechercher&#x2026;' style='width: 240px; height:25px; <?if($msgerreur==1){print("; background-color: ".$color_form_warn."; color: ".$color_font_warn."; border: ".$color_border_warn);}?>' value=''> <input name="Submit" type="submit" style="float: none; line-height: 0px; width: 50px; height: 24px; font-size: 0.8rem; text-align: center; margin-left: 10px; padding: 0px 3px 0px 2px;" value="&#xA0;Valider&#xA0;"> </fieldset> <?php unset($Recherche);?> </form> <!-- Ce code est dans le fichier de contrôle recherche.php --> <?php //\\ Démarrage de la session //\\ session_start(); //\\ Couleur du texte des champs si erreur saisie utilisateur //\\ $color_font_warn="#FF0000"; //\\ Couleur de fond des champs si erreur saisie utilisateur //\\ $color_form_warn="#FDF4F4"; //\\ Couleur de contour des champs si erreur saisie utilisateur //\\ $color_border_warn="1px solid #FF0000"; //\\ Pages web du site à rediriger //\\ $site_a6="https://www.xxxxxxxxxxx/dicoinformatique_a.php#6"; $site_a8="https://www.xxxxxxxxxxx/dicoinformatique_a.php#8"; $site_a10="https://www.xxxxxxxxxxx/dicoinformatique_a.php#10"; $site_a12="https://www.xxxxxxxxxxx/dicoinformatique_a.php#12"; $site_b20="https://www.xxxxxxxxxxx/dicoinformatique_b.php#20"; $site_b22="https://www.xxxxxxxxxxx/dicoinformatique_b.php#22"; //\\ Protéger le formulaire //\\ $Recherche = trim(stripslashes(htmlspecialchars(htmlentities($_POST['Recherche'])))); //\\ Vérifier si le bouton submit a été validé //\\ if(isset($_POST['Submit'])){ //\\ Définir le mot et la valeur associée dans le tableau //\\ $mots_a = array('afficher' => $site_a6, 'aligner' => $site_a8, 'annuler' => $site_a10, 'antivirus' => $site_a12); $mots_b = array('backup' => $site_b20, 'barre de défilement' => $site_b22); $erreur=""; //\\ Vérifier saisie du mot //\\ $Recherche = isset($_POST['Recherche']) ? $_POST['Recherche'] : ''; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ //\\ Vérifier l'existence du mot (mots commençant par a) dans le tableau //\\ if (isset($mots_a[$Recherche]) == $mots_a){ foreach($mots_a as $cle => $valeur){ //\\ Succès: les variables son correctes et on va rediriger vers la page web //\\ $_SESSION['Recherche']=$cle[$Recherche]; header("location: ".$valeur); unset($_POST['Recherche']); exit; } } //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ //\\ Vérifier l'existence du mot (mots commençant par b) dans le tableau //\\ if (isset($mots_b[$Recherche]) == $mots_b){ foreach($mots_b as $cle2 => $valeur2){ //\\ Succès: les variables son correctes et on va rediriger vers la page web //\\ $_SESSION['Recherche']=$cle2[$Recherche]; header("location: ".$valeur2); unset($_POST['Recherche']); exit; } } else { //\\ Tentative infructueuse: définir un message d'erreur //\\ $erreur.="<li style='margin-left: 4px; text-align: left; color: #FF0000;'><span style=' font-size: 0.9rem; color: #FF0000;' class='texterror'>&#x95;&#xA0;&#xA0;Mot inexistant dans ce petit dictionnaire&#x2026;!</span></li>"; $msgerreur=1; } } ?>
Merci d'avance

Mammouth du PHP | 2703 Messages

02 déc. 2021, 18:55

il faut ajouter du code pour debuguer, savoir où cela passe, le contenu des variables.
par exemple :
var_dump(isset($mots_a[$Recherche]), $mots_a);
if (isset($mots_a[$Recherche]) == $mots_a){

Pasil2
Invité n'ayant pas de compte PHPfrance

02 déc. 2021, 23:27

Merci pour votre réponse or 1. Je viens d'ajouter la ligne de code de votre suggestion, mais je ne sais pas comment consulter le débogage.

Avatar du membre
Mammouth du PHP | 1564 Messages

03 déc. 2021, 00:44

Sympa la déco :
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
:lol:

session_start() doit être déclaré tout en haut du fichier, si ta pas d'erreur à l'écran, tu na pas les erreurs d'activées, active les pour qu'elles s'affichent à l'écran, ça te permettra de deboguer ton code.

Tu dois avoir cette erreur si les erreurs sont activées:
Warning: session_start(): Cannot start session when headers already sent in ...
-----------------

Pour débuguer, utiliser var_dump

isset n'est pas pour mettre une condition à l'intérieur, c'est pour vérifier si c'est bien ce qu'on veut mais pas une condition, donc ceci n'est pas bon :
if (isset($mots_a[$Recherche]) == $mots_a){

//produit cette erreur chez moi:
//Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) 
Ton header location, pas après du HTML, les header, toujours avant n'importe quel code HTML:
header("location: ".$valeur);
Commence par activer les erreurs, ty verra plus clair ;)

Pasil2
Invité n'ayant pas de compte PHPfrance

03 déc. 2021, 09:45

Bonjour two 3d,
Merci d'avoir pris le temps pour me donner une suggestion. Peut-être que j'ai oublié de dire que le formulaire se trouve dans un fichier (html) lequel appelle avec un include, le code de contrôle php se trouvant dans un autre séparé. Le session_start() est bien placé au début du code.

Peut-être que c'est du au fait d'avoir ce fichier séparé que, même en ayant activé les erreurs, je ne reçois aucun erreur.
Par contre, si j'enlève la ligne if(isset... etc., le résultat c'est une page blanche. Avec le isset j'ai toujours un résultat, quel que soit le mot saisi, suaf que c'est la redirection vers le premier de la liste dans le tableau, par exemple le (xxxx.php#6).

Avatar du membre
Mammouth du PHP | 1564 Messages

03 déc. 2021, 12:44

c'est la page finale qui te dit si tu as du HTML avant, donc si tu include un fichier avant session_start() qui contient du HTML, ta page finale contiendra du HTML avant session_start().

Par ailleurs : tu dis faire un include dans une page HTML = impossible ! include est un langage PHP qui s’exécute seulement dans une page .php

En revanche l'include d'un fichier html est possible.
le résultat c'est une page blanche
Active tes erreurs, ya une page blanche car les erreurs s'affichent pas, c'est fort possible !

Tu travail sur quoi ? local wamp ?

Pasil2
Invité n'ayant pas de compte PHPfrance

03 déc. 2021, 13:02

L'include est juste au début de la page html, l'extension se termine en php. Comme je ne peut pas mettre le lien direct vers la page, je le mets en deux parties: (paulo/lu/francais/) et la suite est (dicoinformatique_essai.php).

Toute à l'heure j'ai eu la page blanche parce que j'ai oublié tout bêtement d'effacer un crochet. Avec ou sans cette ligne, le résultat est le même, c-à-d, redirection sur le premier de la liste du tableau.

Moi j'utilise notepad+ et je teste directement en envoyant les fichiers sur le serveur de l'hébergeur.

Code : Tout sélectionner

<?php include ("../php/recherche.php"); ?> <!DOCTYPE html>

Avatar du membre
Mammouth du PHP | 1564 Messages

03 déc. 2021, 14:24

OK, notepad++ c'est bien pour avoir une coloration syntaxique, ça aide.

Pour faire une vérification d'un tableau on utilise in_array, si tu as un tableau avec clé + valeur on utilise array_key_exist

https://www.php.net/manual/fr/function.in-array.php
https://www.php.net/manual/fr/function. ... exists.php

As tu les erreurs d'activées sur ton hébergement ? ça t'aidera dans ton développement, même si je conseil de développer en local, tu peux quand même développer sur l"hébergement directement mais c'est pas adapté, tu peux avoir un cache d'activé qui va t'empêcher de voir les modifications tout de suite et c'est plutôt frustrant.

Tu as WAMP ou LAMP sur linux pour développer en local, c'est le plus connu.

https://www.wampserver.com/

Pasil2
Invité n'ayant pas de compte PHPfrance

03 déc. 2021, 16:01

Je te remercie pour le temps que t'as dédie pour résoudre ce problème.

À force d'essayer différentes options, je viens de trouver la solution, sans bien comprendre le comment et le pourquoi ça a marché.

J'ai remplacé la variable $valeur dans le header;

Avant:

Code : Tout sélectionner

header("location: ".$valeur);
Maintenant:

Code : Tout sélectionner

header("location: ".$mots_a[$Recherche]);
Et voilá que ça me redirige vers le bon lien dans la page

En touts cas, merci pour tout