OVH Cloud OVH Cloud

[debutant] urlencode et parametres d'url

14 réponses
Avatar
Lionel
Bonjour,

le sujet a certainement été débatu des millions de fois mais je ne trouve
pas de solution.

je voudrais poster un formulaire vers une page php qui s'occupe de le
valider, faire les traitements, et rediriger vers une autre page PHP en cas
de succes ou vers la page input en cas d'erreur.
donc j'ai un formulaire en POST.
une page php qui récupère les paramètres, et les teste.
si c'est pas ok, je pose un message d'erreur en session et je redirige vers
la page input sans oublier de poser les données du formulaire en parametre,
histoire que ca ne vide pas mon forumaire à chaque retour.

ca donne ca dans checkForm.php:
if(!is_null(erreur)) {
Header("Location: demandeCompte.php?nom=".$nom."&prenom=".$prenom);exit;
}

le formulaire ressemble à ca:
<input type=text name="nom" value="<?=$nom?>">

seul pb, dans mon formulaire, on peut poster des caractères chiants, genre
apostrophe ou &.
et dans ce cas, dans mon input, j'obtiens /// devant mon apostrophe (!!!).
si je rawurlencode($nom) dans mon url et rawurldecode($nom) dans mon form
ca ne change rien pour les apostrophes, mais pour le reste c'est bon.

comment gérer les apostrophes proprement, sans les interdire bien sur ???

rien à voir avec des requetes SQL, donc addslashes() ne m'est d'aucune
utilité.

y a-t-il un autre moyen de faire une redirection en php ou de poser des
paramètres sur une requete http ?

Je vais avoir le meme pb dans bcp de formulaires, et je voudrais éviter de
mettre les données des formulaires en session (ce qui je pense résoudrait
mon pb)

Merci.

10 réponses

1 2
Avatar
Lionel
Lionel wrote:

comment gérer les apostrophes proprement, sans les interdire bien sur
???


bon, j'ai trouvé une solution mais je la trouve bien lourdeà écrire:

il suffit de passer le parametre comme ceci:
htmlentities(rawurlencode(stripslashes($nom)))

et de le récupérer comme cela:
stripslashes($nom)

Avatar
Lionel
Lionel wrote:

bon, j'ai trouvé une solution mais je la trouve bien lourdeà écrire:

il suffit de passer le parametre comme ceci:
htmlentities(rawurlencode(stripslashes($nom)))


hum, j'ai parlé trop vite, voici la solution finale:

rawurlencode(htmlentities(stripslashes($string)));

(ouf!!)

Avatar
john gallet
Header("Location: demandeCompte.php?nom=".$nom."&prenom=".$prenom);exit;


Non : include("demandeCompte.php"); exit;

JG

Avatar
Lionel
john gallet wrote:
Header("Location:
demandeCompte.php?nom=".$nom."&prenom=".$prenom);exit;


Non : include("demandeCompte.php"); exit;


certes, je suis d'accord sur le principe, c'est exactement ce que je voulais
faire. j'ai utilisé header car je n'avais pas pensé à un include et ca
ressemblait à mon request.forward java
cependant ceci apporte bcp de soucis:

- cela ne résout en rien mon pb de paramètre d'url. il faut les nettoyer
avant de les réafficher. ($nom=htmlentities(stripslashes($string))) je n'ai
pas essayé mais logiquement je devrais économiser le rawurlencode.
- ma page formulaire ne se trouve pas dans le meme répertoire que la page
qui valide le formulaire.
donc lors de l'entrée, le chemin "." n'est pas le meme qu'en retour (apres
validation), donc je suis obligé de tout mettre en absolu depuis la racine
du serveur (images, action du form....). ca ne me plait pas du tout (pas
cool niveau portabilité: je ne déploie actuellement pas à la racine du
serveur, et le rép d'install pourrait un jour changer pour un autre client)
mais bon, j'ai pas le choix... je sens que pour les includes ca va etre plus
compliqué, je vais devoir changer le php.ini pour pointer la racine de mon
appli.
- il faut revoir tous les includes de fonctions dans toutes les pages: si
j'ai besoin d'une meme fonction à la fois dans ma page html et dans ma page
de validation, comment faire (si je mets un include dans chacun, il me dit
que je redefinis ma fonction, mais sinon il ne peut pas la connaitre...)
- mes parametres de session n'ont plus l'air d'etre accessible: je récupère
null à chaque fois (mais le param est bien registered).
exemple:
dans ma page form.php: je récupère $_SESSION['errors'] et je l'affiche.
lors du 1er passage, il est null. normal.
je valide le form, mon checkform.php fait:
$errors[0] = "il y a une erreur";
session_register("errors");
include(form.php)
et la NULL s'affiche au lieu de "il y a une erreur".
ou est l'erreur ?

j'ai l'impression de passer à coté de choses qui me paraissent simples...


Avatar
Lionel
Lionel wrote:
john gallet wrote:
Header("Location:
demandeCompte.php?nom=".$nom."&prenom=".$prenom);exit;


Non : include("demandeCompte.php"); exit;



je corrige mon message précédent:

- cela ne résout en rien mon pb de paramètre d'url. il faut les
nettoyer avant de les réafficher.
($nom=htmlentities(stripslashes($string))) je n'ai pas essayé mais
logiquement je devrais économiser le rawurlencode.


ceci est vrai. rawurlencode est inutile, et le stripslahes dans mon form
également.
voilà qui est propre.

- ma page
formulaire ne se trouve pas dans le meme répertoire que la page qui
valide le formulaire.
donc lors de l'entrée, le chemin "." n'est pas le meme qu'en retour
(apres validation), donc je suis obligé de tout mettre en absolu
depuis la racine du serveur (images, action du form....).


ceci est également vrai. pas encore de solution "propre" et indépendante du
répertoire dans lequel mon appli est déployée
je suis ouvert à toute suggestion

- il faut revoir tous les includes de fonctions dans toutes les
pages: si j'ai besoin d'une meme fonction à la fois dans ma page html
et dans ma page de validation, comment faire (si je mets un include
dans chacun, il me dit que je redefinis ma fonction, mais sinon il ne
peut pas la connaitre...)


je n'avais pas vu include_once(). donc pas de souci

- mes parametres de session n'ont plus
l'air d'etre accessible: je récupère null à chaque fois (mais le
param est bien registered).


j'ai un peu revu et nettoyé mon code.
j'avais viré un session_start dans la manip.
tout marche nickel

merci beaucoup du conseil pour les include !



Avatar
Lionel
Lionel wrote:

merci beaucoup du conseil pour les include !


encore une question, mais je pense qu'elle va rester sans réponse:

je valide un formulaire en POST, qui en cas d'erreur me renvoie sur le meme
formulaire via un include.
si je click sur précédent, puis sur suivant, j'atterris sur la page
indiquant Avertissement : expiration du délai pour cette page .....
avec des header, je n'ai évidemment pas ce pb.
Peut on y remédier ? je trouve ca extrèmement désagréable quand on navigue.
merci

Avatar
John Gallet
Re,

- cela ne résout en rien mon pb de paramètre d'url.
Si si, car dans les fichier inclus, les variables SONT LES MEMES...


- ma page formulaire ne se trouve pas dans le meme répertoire que la page
qui valide le formulaire.
Aucune importance.


j'ai l'impression de passer à coté de choses qui me paraissent simples...
C'est pourtant de l'algorithmique de base :


Récupérer les variables obligatoires, faire les tests de cohérence.
Si KO : include("generer_formulaire.php"); exit();
(sinon inutile)
Traiter normalement les données reçues.

Plus simple, je ne vois pas.

a++
JG

Avatar
John Gallet
si je click sur précédent, puis sur suivant, j'atterris sur la page
indiquant Avertissement : expiration du délai pour cette page .....


Et si tu cliques sur la croix en haut à droite (sous unix) eou ) gauche
(sous windows) tu fermes le navigateur.

Ce qu'il faut prévoir comme comportement crétin de l'internaute, c'est
ce qui te pourrit ta base de données. Il est impossible de prévoir
*toutes* les conneries qu'il va faire (1).

a++
JG
(1) parce que je t'assure que je suis TRES inventif quand je 'joue' avec
un site.

Avatar
Lionel
John Gallet wrote:
Re,

- cela ne résout en rien mon pb de paramètre d'url.
Si si, car dans les fichier inclus, les variables SONT LES MEMES...



je suis bien d'accord, mais pour pouvoir les réafficher dans le formulaire
je suis obligé de les stripslasher( selon magic_quotes) et de le
htmlentitiser. ce qui est normal et logique.

- ma page formulaire ne se trouve pas dans le meme répertoire que la
page qui valide le formulaire.
Aucune importance.



si, ca oblige à mettre tous les chemins en absolu. car le répertoire courant
change selon qu'on est en entrée de form ou en retour.

Plus simple, je ne vois pas.


moi non plus.


Avatar
john gallet
Re,
je suis bien d'accord, mais pour pouvoir les réafficher dans le formulaire
je suis obligé de les stripslasher( selon magic_quotes) et de le
htmlentitiser. ce qui est normal et logique.


Ah, je commence à voir le soucis, ok. Oui, ça dépende de ta config en
entrée.

- ma page formulaire ne se trouve pas dans le meme répertoire que la
page qui valide le formulaire.
si, ca oblige à mettre tous les chemins en absolu. car le répertoire courant


change selon qu'on est en entrée de form ou en retour.
Là en revanche je ne comprends toujours pas où est le problème. C'est le

**même** script qui gère tout, l'arrivée initiale sur le formulaire
n'étant jamais que le cas particulier où aucun des champs obligatoires
n'est renseigné (où la variable $bidule non présente dans le cas extrême
où aucun champ ne serait obligatoire).

Donc si on s'adresse à traite_form.php, celui-ci peut bien faire des
include/require de tous les script gen_form_html.php du disque dur où
qu'ils se trouvent sur le file system local, ça ne changera rien à
l'adresse de retour qui est dans tous les cas traite_form.php

a++
JG



1 2