$_POST et récupération d'une valeur

$_POST et récupération d'une valeur - PHP - Programmation

Marsh Posté le 10-04-2010 à 10:34:11    

Bonjour,
 
Mieux qu'un long discours :
 
http://imgur.com/X1ybW.jpg
 
Depuis p3.php (s'agissant d'une classe), je parviens bien à récupérer la valeur de $POST['val'] envoyé à partir de p1.php (méthode POST).
Lorsque j'effectue une inclusion de ma classe depuis p4.php, la valeur de $POST['val'] depuis p3.php n'est plus récupérable.
 
Comment puis-je corriger cela sans passer par des variables de session ?
 
Merci pour votre entraide.

Message cité 1 fois
Message édité par edaz51 le 10-04-2010 à 10:34:29
Reply

Marsh Posté le 10-04-2010 à 10:34:11   

Reply

Marsh Posté le 10-04-2010 à 11:55:37    

edaz51 a écrit :

Bonjour,
 
Mieux qu'un long discours :
 
http://imgur.com/X1ybW.jpg
 
Depuis p3.php (s'agissant d'une classe), je parviens bien à récupérer la valeur de $POST['val'] envoyé à partir de p1.php (méthode POST).
Lorsque j'effectue une inclusion de ma classe depuis p4.php, la valeur de $POST['val'] depuis p3.php n'est plus récupérable.
 
Comment puis-je corriger cela sans passer par des variables de session ?
 
Merci pour votre entraide.


Salut,
 
La variable $_POST est renseignée à partir des champs d'un formulaire envoyé avec la méthode "post".
Dans p1.php tu as un formulaire avec un champ "val", que tu postes vers p2.php, donc tu récupères $_POST['val'] dans p2.php
Dans p2.php tu as un formulaire je suppose, mais je ne sais pas ce qu'il contient. C'est dans le formulaire de p2.php qu'il faut éventuellement que tu remettes un champ "val" pour qu'il soit à nouveau posté vers p4.php
 
Maintenant je trouve pas que ça aide beaucoup à la compréhension tous ces p1 p2 p3 p4
Tu veux pas poster du code plutôt ?
 
Bon courage

Reply

Marsh Posté le 10-04-2010 à 14:37:27    

Salut deuspi et merci d'avoir répondu.
 

deuspi a écrit :


La variable $_POST est renseignée à partir des champs d'un formulaire envoyé avec la méthode "post".


C'est exact.
 

deuspi a écrit :

Dans p1.php tu as un formulaire avec un champ "val", que tu postes vers p2.php, donc tu récupères $_POST['val'] dans p2.php


Je récupère "val" dans p3.php et non dans p2.php. "val" correspond au nom d'une base de données. Je suis sous contrainte et je n'ai pas d'autres choix que passer ma valeur avec la méthode post. p3.php est une classe avec un ensemble de fonctions liées au traitement des données (dont la connexion à la base).
 

deuspi a écrit :

Dans p2.php tu as un formulaire je suppose, mais je ne sais pas ce qu'il contient.


p2.php affiche un tableau avec des cases à cocher (checkbox). Les données affichées dans ce tableau sont issues d'un select depuis une BDR (utilisation des fonctions sous p3.php et tout fonctionne)

Code :
  1. $db_name = addslashes($_POST['val']);

--> me retourne bien sous p3.php le nom de ma base de données.
 

deuspi a écrit :

C'est dans le formulaire de p2.php qu'il faut éventuellement que tu remettes un champ "val" pour qu'il soit à nouveau posté vers p4.php


p4.php parse les valeurs "checkées", récupère l'id de l'enregistrement en BD et  effectue un traitement en BD (d'où l'inclusion de p4.php). Et là, le code dans p4.php ne parvient plus à se connecter car mon

Code :
  1. $db_name = addslashes($_POST['val']);

ne me retourne plus rien.

Message cité 1 fois
Message édité par edaz51 le 10-04-2010 à 14:38:08
Reply

Marsh Posté le 10-04-2010 à 17:42:40    

edaz51 a écrit :


Je récupère "val" dans p3.php et non dans p2.php.


Tu fais partir un formulaire contenant un champ "val" vers p2.php, d'après ton schéma. Ensuite depuis p2 tu fais un include de p3, pas de problème.

edaz51 a écrit :


p2.php affiche un tableau avec des cases à cocher (checkbox). Les données affichées dans ce tableau sont issues d'un select depuis une BDR (utilisation des fonctions sous p3.php et tout fonctionne)

Code :
  1. $db_name = addslashes($_POST['val']);

--> me retourne bien sous p3.php le nom de ma base de données.


Après tu génères un 2e formulaire (depuis p2 donc) et ce formulaire tu le fais partir vers p4. Mais ce 2e formulaire ne contient pas le champ "val" donc il ne sera pas posté. Donc, impossible de le récupérer depuis p4 puisqu'il ne fait pas partie des infos postées.
Ce qu'il faut que tu fasses, c'est modifier le 2e formulaire, celui qui se trouve dans p2, pour ajouter un champ caché "val" auquel tu donneras la valeur de POST['val']. De cette manière tu pourras "faire suivre" ta valeur vers le formulaire suivant.
En somme, un truc dans ce style :

Code :
  1. echo '<input type="hidden" name="val" value="' . $_POST['val'] . '"/>';


J'espère que ça t'aidera...
Bon courage

Reply

Marsh Posté le 10-04-2010 à 18:56:38    

Merci deuspi. Tes explications sont claires et précises.
 
Je vais tester cette solution.

Reply

Marsh Posté le 11-04-2010 à 11:08:10    

Super cela fonctionne. Encore merci deuspi

Reply

Marsh Posté le 11-04-2010 à 12:50:15    

Il y a toutefois quelque chose que je ne comprends pas.
J'étudie un code source et dans plusieurs pages, le code fait appel à une variable globale.  
 
Exemple : $GLOBALS['InstallPath']
 
Je me dis que c'est certainement la solution. Par contre je ne parviens pas à déterminer la déclaration de cette variable dans ce code source.
 
Lorsque je la déclare en p1.php

Code :
  1. $InstallPath = 'path/';

.
 
Je ne la retrouve en p4.php avec un print_r($GLOBALS);


Message édité par edaz51 le 11-04-2010 à 12:51:38
Reply

Marsh Posté le 11-04-2010 à 16:13:57    

Tu dois inclure le fichier où tu la déclares.
À part ça, se baser lourdement sur des variables est un signe d'un design mal conçu..
Plus tu t'appuies dessus, plus tu vas obtenir des effets de bord difficilement traçables.
C'est vraiment quelque chose à utiliser dans les cas extrêmement.


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 11-04-2010 à 16:24:28    

Merci esox_ch, mais quand le fichier php commence par :
 
include_once $GLOBALS['InstallPath'].'utilit/incl.php';
 
Ici,  la variable InstallPath contenant le path est certes déclarée dans un fichier mais celui-ci n'est pas inclu. Pourtant, incl.php est bien lu.


Message édité par edaz51 le 11-04-2010 à 16:25:21
Reply

Marsh Posté le 11-04-2010 à 16:37:27    

Tu sais que ce que tu veux faire, se fait généralement en utilisant __FILE__ ?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 11-04-2010 à 16:37:27   

Reply

Marsh Posté le 11-04-2010 à 17:21:35    

Oui effectivement. Je vais essayer de travailler avec le répertoire courant dirname(__FILE__)
J'essayais juste de comprendre comment était utilisé $GLOBALS

Message cité 1 fois
Message édité par edaz51 le 11-04-2010 à 19:57:31
Reply

Marsh Posté le 11-04-2010 à 23:20:01    

edaz51 a écrit :

J'essayais juste de comprendre comment était utilisé $GLOBALS


Salut,
 
Le mieux est de se référer à la doc, voir ici : http://fr2.php.net/manual/fr/reser [...] lobals.php
Il y est expliqué qu'une variable déclarée à l'extérieur d'une fonction sera considérée comme globale, et de ce fait sera remontée dans le tableau $GLOBALS.
L'utilisation de $GLOBALS['InstallPath'] revient dans la plupart des cas à écrire $InstallPath directement.
 
Dans ton exemple, tu nous expliques que le code fait appel à cette variable pour inclure un autre fichier (incl.php)
Je pense que les fichiers qui font appel à cette variable ne peuvent pas être appelés directement par le navigateur. Ils doivent d'abord être eux-mêmes inclus par un autre fichier, en amont, qui lui par contre doit connaître cette fameuse variable.
 
Maintenant comme le dit esox_ch, l'utilisation de variables globales est une pratique déconseillée. Et il me semble que tu es tombé pile dans l'un des travers de cette technique : tu ne retrouves plus l'endroit où a été déclaré la variable, ou la façon dont tel ou tel fichier peut la connaître.
 
A part ça j'ai l'impression en te lisant que tu fais une petite confusion entre ce qui se passe côté client, côté serveur, et le flux d'exécution du code PHP : tu dis que tu déclares ta variable dans p1 mais que tu ne la retrouves pas dans p4, mais si je me réfère à ton schéma initial, le script p4 ne fait pas d'include du script p1. Le script p4 est exécuté directement par le serveur et donc ne connaît pas ce qui a pu être déclaré en p1.
 
Bon courage

Reply

Marsh Posté le 12-04-2010 à 09:50:03    

Merci deuspi pour toutes ces précisions et d'avoir pris du temps pour répondre.
Si j'ai bien compris, la variable $InstallPath est bien déclarée quelque part et avec des includes successifs, on parvient à retrouver son contenu.
Et esox_ch souligne cet effet de bord en terme de lisibilité du code.

Reply

Marsh Posté le 12-04-2010 à 16:18:21    

si  $GLOBALS['InstallPath'] vaux rien == ''
PHP va inclure 'utilit/incl.php'
 
donc la variable n'a peut-être pas besoin d'être déclaré.
 
il faut aussi chercher du côté de configuration de PHP ;)


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 12-04-2010 à 20:31:13    

Pourquoi ne pas alors travailler en relatif et écrire './utilit/incl.php' ?

Reply

Marsh Posté le 12-04-2010 à 23:15:26    

edaz51 a écrit :

Pourquoi ne pas alors travailler en relatif et écrire './utilit/incl.php' ?


Ben en fait comme le proposait déjà esox_ch, il vaut même mieux utiliser carrément la constante __FILE__
Voici le lien vers la doc qui explique ceci : http://fr.php.net/manual/fr/langua [...] efined.php
En gros la constante __FILE__ te renvoie le chemin complet du fichier courant. Donc la technique c'est :

Code :
  1. include dirname(__FILE__) . '/utilit/incl.php';


En relatif tu risques d'avoir des problèmes car tu ne sais pas forcément à quoi correspond le répertoire "." : ce ne sera pas le répertoire du fichier courant mais le répertoire du fichier qui a été appelé par le navigateur. Si t'as des fichiers qui peuvent être appelés à différents niveaux de l'arborescence ça devient carrément ingérable.

Reply

Marsh Posté le 13-04-2010 à 17:17:29    

edaz51 a écrit :

Pourquoi ne pas alors travailler en relatif et écrire './utilit/incl.php' ?


 
il faut demander ça au gars qui l'a fait ;)


---------------
Tout à commencé par un rêve...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed