Header () [Résolu]

Signaler
Messages postés
5
Date d'inscription
samedi 16 octobre 2010
Statut
Membre
Dernière intervention
13 novembre 2010
-
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
-
Bonjour,

Je commence à m'arracher les cheveux, et personnellement, je préfèrerai les garder

Voici mon problème :

j'ai un formulaire de connexion.
je le teste, je le valide, et je redirige vers une autre page.
ex:

header("Location:index.php?page=filtre");


Avec cela, ca fonctionne, mon $_GET['page'] me renvoie bien "filtre"

Maintenant, j'ai besoin de rajouter d'autres paramètres dans mon adresse.
Par ex :

header("Location:index.php?page=filtre&parametre=toto");


Et la malheureusement, rien ne se passe.
J'ai également tenté de "ruser" en procédant de la sorte :
$url = "index.php?page=filtre&parametre=toto";
header("Location:".$url);


Mais cela ne change rien, mon header ne fonctionne pas, mon adresse ne change pas.

Ai-je raté quelque chose ?
Comment doit-on procéder ?

Merci de m'éclairer.

Ps: j'ai un autre solution qui fonctionne, mais qui n'est pas "propre", c'est à dire
<meta http-equiv="refresh" content="0;URL=index.php?page=filtre&parametre=toto">

13 réponses

Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
Salut,

Pour commencer :
header("Location:index.php?page=filtre&parametre=toto");

=>
header("Location: index.php?page=filtre&parametre=toto");


Note l'espace après les ":"

Cordialement,


Kohntark -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
C'est lequel de header qui ne fonctionne pas ?
Le second j'imagine ?
As tu activé l'affichage des erreurs ?
(voir doc de ini_set() et la directive 'display_errors', ainsi que error_reporting())

Parce que là tu ne testes absolument rien (les requêtes sql, l'écriture dans le fichier).

Tu ne traites pas non plus les données provenant du formulaire (cf mysql_real_escape_string())

Il vaut toujours mieux "sur tester" que l'inverse, surtout lorsque l'on débute.

Mais même avec l'ajout de l'espace, cela ne fonctionne pas plus

Il y a un L majuscule à Location hein

Pour coller au mieux aux normes il faudrait d'ailleurs passer une url absolue :

header("Location: http://".$_SERVER['HTTP_HOST']."/index.php?page=filtre&listenoir_add=ok");


Cordialement,

Kohntark -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
Re Cod57,

ET POURTANT

Et pourtant (bis) :
Et ce n'est pas parce que ça fonctionne chez toi, sur TON serveur, et avec TON navigateur, que ça fonctionnera ailleurs.


Sans entrer dans les détails multiples qui argumenteraient ce que je dis je pense qu'il faut se limiter à cette question :
Pourquoi ne pas écrire correctement ce genre de code alors qu'il est si simple de mettre un L majuscule et un espace après les ":", ainsi qu'une URI absolue ??

et pourtant mon script fonctionne ...

Même réponse que la précédente, et même réponse qu'il me semble (?), je t'ai déjà faite :
ce n'est pas parce qu'un script est fonctionnel qu'il est à suivre.
Je t'avais fait part il y a quelques jours de mon avis (et juste de mon avis) sur le fait que tu participes à la pollution de CS en fournissant du code tout fait à cette multitude de nazes qui hantent ces lieux.
D'ailleurs, et sauf erreur de ma part, l'auteur n'a jamais répondu. Si tu ne penses pas avoir perdu ton temps, crois moi, ça viendra
C'est une remarque, pas une leçon de morale ou dérivé, et j'espère que tu seras encore là lorsqu'un 0 apparaitra à la fin de ton nombre de messages, car un forum comme celui ci en a fortement besoin.
Des intervenants réguliers, .... il n'y en a plus (ou plus exactement ils se comptent sur les doigts d'une seule main)
Inutile de dire que la pollution évoquée ne concerne pas ce thread.
N'empêche que si ta démarche consiste à donner du code, et dans le cas présent, il serait appréciable que tu fournisses du code un minimum correct (cad ne pas se contenter de dire qu'il fonctionne lorsque l'on te démontre le contraire), ce qui n'est pas le cas.

- la syntaxe de header est incorrecte
- "'act ecrit base';" ne sert à rien
- le header ne fonctionnera pas puisque tu envoies du contenu au navigateur avant (ça dépends de la config, mais raison de plus pour être respectueux du protocole HTTP)
- 'mysql_real_escape_string($modif);' ne sert à rien
- pas de contrôle de l'exécution des réquêtes
- "$aj = $_POST['addnoir'];
$maj = $aj . "\n";" ne sert à rien
- etc ... etc ...

Ce n'est en aucun cas une attaque et j'espère que tu le prendras ainsi.


Cordialement,

Kohntark -
Messages postés
5
Date d'inscription
samedi 16 octobre 2010
Statut
Membre
Dernière intervention
13 novembre 2010

le code "complet" ( je précise il fonctionne parfaitement, même si j'imagine qu'il doit être améliorable ) :
<form action='' method='post'>


<label for="addnoir">Site à ajouter</label>













</form>


if (isset ($_POST['addnoir']) && ($_POST['addnoir'] == ""))

{

header("location:index.php?page=filtre&listenoir_add=erreur");

}

if (isset ($_POST['addnoir']) && ($_POST['addnoir'] != ""))

{

mysql_select_db($database_dbprotect, $dbprotect);

$user = $_SESSION['login'];

$quand = date("Y-m-d H:i:s");

$modif = "Ajout de l adresse ".$_POST['addnoir']." à la liste NOIRE";

$sql = "INSERT INTO historique (id_historique, user, quand, modification)

VALUES ('', '$user', '$quand', '$modif')";

mysql_query($sql);

$aj = $_POST['addnoir'];

$maj = $aj."\n";

$nom_fichier='dans/bannedsitelist';

file_put_contents($nom_fichier, $maj, FILE_APPEND);

header("location:index.php?page=filtre&listenoir_add=ok");

}
Messages postés
5
Date d'inscription
samedi 16 octobre 2010
Statut
Membre
Dernière intervention
13 novembre 2010

Merci de ton attention kohntark
Un cours instant, tu m'as fait rêver :)
Mais même avec l'ajout de l'espace, cela ne fonctionne pas plus.
Chaque ligne de mon code est bien exécutée, mais pas mon header.
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
16
BONJOUR
je te propose je l'ai testé il marche mais je crois que c'est pas header() le problème tu fais deux test identiques il me semble !

ma correction

envoi.php
<form action="recu.php" method="post">


<label for="addnoir">Site à ajouter</label>













</form>

recu.php
<?php
if (isset ($_POST['addnoir']) && !empty($_POST['addnoir'])) {
echo  $_POST['addnoir'] ;  'act ecrit base';
mysql_select_db($database_dbprotect, $dbprotect);

$user = mysql_real_escape_string($_SESSION['login']);

$quand = date("Y-m-d H:i:s");

$modif = "Ajout de l adresse ".$_POST['addnoir']." à la liste NOIRE";

mysql_real_escape_string($modif);

$sql = "INSERT INTO historique (id_historique, user, quand, modification)

VALUES ('', '$user', '$quand', '$modif')";

mysql_query($sql);

$aj = $_POST['addnoir'];

$maj = $aj."\n";

$nom_fichier='dans/bannedsitelist';

file_put_contents($nom_fichier, $maj, FILE_APPEND);

header("location:index.php?page=filtre&listenoir_add=ok");

} else {
//echo "rien ne marche !"; 
header("location:index.php?page=filtre&listenoir_add=erreur");exit;
}
?>

index.php
<?php
echo $_GET['page'].'
';
echo $_GET['listenoir_add'].'
'; 
?>
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
16
header("location:index.php?page=filtre&listenoir_add=ok");
exit;

c'est mieux j'ai oublié le exit; (sécurité) a++
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
Je dois écrire à l'encre invisible ...
Il y a un L majuscule à Location hein

header("Location: index.php?page=filtre¶metre=toto");
Note l'espace après les ":"


Un header location s'écrit :
header("Location: [...]

Avec la majuscule, l'espace qui va bien, etc ...
Et ce n'est pas parce que ça fonctionne chez toi, sur TON serveur, et avec TON navigateur, que ça fonctionnera ailleurs.

le problème tu fais deux test identiques il me semble !

Les tests ils sont là :
if (isset ($_POST['addnoir']) && ($_POST['addnoir'] == ""))
if (isset ($_POST['addnoir']) && ($_POST['addnoir'] != ""))

Et ils n'ont rien d'identiques.
Bon, c'est clair que l'on pourrait mieux faire, comme utiliser empty() et ne pas répéter le isset() (entre autres)

Cordialement,

Kohntark -
Messages postés
5
Date d'inscription
samedi 16 octobre 2010
Statut
Membre
Dernière intervention
13 novembre 2010

Merci de votre intérêt à tous !

Je confesse ne pas connaître suffisamment le php pour tout tester.
J'essaie juste de faciliter l'utilisation d'un service dansguardian ( squid ) pour les utilisateurs finaux ( c'est à dire non informaticien ) via une interface web.
Mon code ( Version 1 )fonctionnait bien avec mes bidouilles html :

<meta http-equiv="refresh" content="0;URL=index.php?page=filtre&parametre=toto">


J'ai découvert par la suite la fonction header, et en voulant l'améliorer, je me suis rendu compte que lorsque j'utilisais header avec un seul paramètre cela fonctionnait bien, mais dès que je rajoutais un second paramètre ( ¶metre=toto ) plus rien ne fonctionnait.

En tout cas, je vais tester vos conseils et vous ferez retour dès que cela fonctionnera.

Merci pour tout.
Messages postés
5
Date d'inscription
samedi 16 octobre 2010
Statut
Membre
Dernière intervention
13 novembre 2010

Ps: Mon premier test servait uniquement à signaler aux utilisateurs une erreur si il s'amusait à cliquer sur ajouter sans avoir rempli le champ "site à ajouter" :)
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
16
bonjour
@kohntark
et pourtant mon script fonctionne ...
L majuscule dans la doc PHP OUI !!!! ET POURTANT
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Salut,

C'est pas juste L majuscule dans la doc, c'est L majuscule dans les spécifications du standard HTTP 1.1
Certains navigateurs peuvent très bein ne pas tenir compte des majuscules des entêtes, ni des espaces. Il n'empêche que respecter les spécifications des standards permet de s'assurer que cela fonctionne TOUJOURS et que si ça ne fonctionne pas, c'est parce que c'est mal implémenté par le client, ce qui dégage donc la responsabilité du développeur.

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Désolé pour le double post, j'ai oublié de dire que quand on donne des conseils, qu'on apporte de l'aide, on essaie autant que possible d'être rigoureux.
Chez moi, avec un L minuscule et sans espace, ça ne fonctionne pas.

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)