Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Variable dynamique $_GET['x'] impossible dans fonction

5 réponses
Avatar
Dominique Ottello
Bonjour,

Après tous les essais que j'ai pu effectués et bien que les variables
dynamiques $_GET[x] fonctionnent très bien dans le corps d'un script,
j'en arrive à la conclusion qu'il est impossible d'utiliser les
variables dynamique pour $_GET (ou $_POST) ainsi que pour le résultat de
import_request_variables("PG","rvar_") à l'intérieur d'une fonction.

N'ayant pas trouvé cette conclusion dans la FAQ, ni dans mes recherches,
je m'en remet à votre sagacité car il se pourrait que je fasse des
erreurs dans ma manière de procéder.

Exemple :

<?php

// Essais tableau variables dynamiques dans fonction
function var_dyn($nom,$v='a') {
$var="t".$v;
$ta['type']="Tableau A Type";
$tb['type']="Tableau B Type";
$tc['type']="Tableau C Type";
return ${$var}[$nom];
}

// Essai 1 variable dynamique tableau $_GET[] dans fonction
function www_get_para1($nom,$v='GET') {
$var='_'.$v;
if (isset($$var[$nom])) return $$var[$nom];
else return "GET[$nom] n'existe pas dans la fonction 1 (sans
accolades)";
if (!empty($$var[$nom])) return $$var[$nom];
else return "GET[$nom] est vide dans la fonction 1 (sans accolades)";
}

// Essai 2 variable dynamique tableau $_GET[] dans fonction
function www_get_para2($nom,$v='GET') {
$var='_'.$v;
if (isset(${$var}[$nom])) return ${$var}[$nom];
else return "GET[$nom] n'existe pas dans la fonction 2 (avec accolades
{var})";
if (!empty(${$var}[$nom])) return ${$var}[$nom];
else return "GET[$nom] est vide dans la fonction 2 (avec accolades
{var})";
}

// Essai 3 variable dynamique tableau $_GET[] dans fonction
function www_get_para3($nom,$v='GET') {
$var='_'.$v;
if (isset(${$var[$nom]})) return ${$var[$nom]};
else return "GET[$nom] n'existe pas dans la fonction 3 (avec accolades
{var[]})";
if (!empty(${$var[$nom]})) return ${$var[$nom]};
else return "GET[$nom] est vide dans la fonction 3 (avec accolades
{var[]})";
}

// Essai variable dynamique import_request dans fonction
function www_req_para($nom) {
import_request_variables("PG","rvar_");
$var='rvar_'.$nom;
if (isset(${$var})) return ${$var};
else return "rvar_ dynamique n'existe pas dans la fonction request";
if (!empty(${$var})) return ${$var};
else return "rvar_ dynamique est vide dans la fonction request";
}

// Essai variable import_request dans corps
import_request_variables("PG","rvar_");
if (isset($rvar_type)) $ret_req=$rvar_type;
else $ret_req="Request normal n'existe pas dans le corps";

// Essai variable dynamique import_request dans corps
$nom='type';
$var='rvar_'.$nom;
if (isset(${$var})) $ret_req_dy=${$var};
else $ret_req_dy="Request dynamique n'existe pas dans le corps";

// Essai variable GET dans corps
if (isset($_GET['type'])) $ret_nor=$_GET['type'];
else $ret_nor="GET normal n'existe pas dans le corps";

// Essai variable dynamique GET dans corps
$v='GET';
$var='_'.$v;
if (isset(${$var}[$nom])) {
$ret=${$var}[$nom];
if (!empty(${$var}[$nom])) $ret=${$var}[$nom];
else $ret="GET dynamique est vide dans le corp (avec accolades {var}";
}
else $ret="GET dynamique n'existe pas dans le corp (avec accolades
{var})";

// Essais tableaux variables dynamiques dans fonction
echo "<p>a : ".var_dyn('type')."</p>\n";
echo "<p>b : ".var_dyn('type','b')."</p>\n";
echo "<p>c : ".var_dyn('type','c')."</p>\n";

echo "<p>get normal corps : ".$ret_nor."</p>\n";
echo "<p>request normal corps : ".$ret_req."</p>\n";
echo "<p>get dynamique corps : ".$ret."</p>\n";
echo "<p>request dynamique corps : ".$ret_req_dy."</p>\n";
echo "<p>get dynamique fonction 1 :
".www_get_para1('type')."</p>\n";
echo "<p>get dynamique fonction 2 :
".www_get_para2('type')."</p>\n";
echo "<p>get dynamique fonction 3 :
".www_get_para3('type')."</p>\n";
echo "<p>request dynamique fonction : ".www_req_para('type')."</p>\n";

echo "<a href='essais_var.php?type=TYPE_PAR_GET_DANS_APPEL'>Essais
Get</a>\n";
?>

La page est là :

http://aviatechno.free.fr/essais_var.php?type=TYPE_PAR_GET_DANS_APPEL
--
Un ordinateur résout des problèmes que nous n'aurions pas sans lui
Technique aéronautique : http://aviatechno.free.fr
Concorde dans la presse de 1965 à 2003 : http://le.pointu.free.fr

5 réponses

Avatar
Olivier Miakinen

Après tous les essais que j'ai pu effectués et bien que les variables
dynamiques $_GET[x] fonctionnent très bien dans le corps d'un script,
j'en arrive à la conclusion qu'il est impossible d'utiliser les
variables dynamique pour $_GET (ou $_POST) ainsi que pour le résultat de
import_request_variables("PG","rvar_") à l'intérieur d'une fonction.

N'ayant pas trouvé cette conclusion dans la FAQ, ni dans mes recherches,
je m'en remet à votre sagacité car il se pourrait que je fasse des
erreurs dans ma manière de procéder.


Je n'ai pas fait le test, mais il peut être utile de noter que la
variable $_REQUEST permet justement de s'affranchir des problèmes liés
à l'utilisation de $_GET au lieu de $_POST et réciproquement.

Ainsi donc, si on veut une fonction qui fonctionne aussi bien pour
$_GET que pour $_POST, autant tout remplacer par $_REQUEST, en dur
dans le code.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
patrice
"Dominique Ottello" a écrit dans le message de
news:
Bonjour,

Après tous les essais que j'ai pu effectués et bien que les variables
dynamiques $_GET[x] fonctionnent très bien dans le corps d'un script,
j'en arrive à la conclusion qu'il est impossible d'utiliser les
variables dynamique pour $_GET (ou $_POST) ainsi que pour le résultat de
import_request_variables("PG","rvar_") à l'intérieur d'une fonction.



il faut les déclarer en global

function mafonction()
{
global $_GET;
....
}

http://fr2.php.net/global

Avatar
Olivier Miakinen

il faut les déclarer en global

function mafonction()
{
global $_GET;
....
}


Mais non, $_GET est déjà une variable superglobale.

http://fr2.php.net/global


http://fr2.php.net/manual/fr/language.variables.predefined.php

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
Dominique Ottello
Olivier Miakinen <om+ écrivait :

Mais non, $_GET est déjà une variable superglobale.


Je récapitule le « problème » et la solution prise :

Problème :
Dans une fonction, $_GET ou $_POST ne peuvent pas être utilisés en tant
que variable dynamique :

function retourne_para($nom,$defaut,$type='GET') {
$var='_'.$type;
if (isset(${$var}[$nom])) return ${$var}[$nom];
else return $defaut;
}

Solution, comme préconisé par Olivier, utiliser $_REQUEST :

function retourne_para($nom,$defaut) {
if (isset($_REQUEST[$nom])) return $_REQUEST[$nom];
else return $defaut;
}

Comme dans $_REQUEST, l'ordre prioritaire pour les noms de variables
est, par défaut EGPCS (Environment, GET, POST, Cookie, Server) et est
défini par l'option de configuration "variable_order".

On peut définir un autre ordre et même ignorer certaines variables.

Si on défini cette option à "GP" par exemple, PHP ignorera complètement
les variables d'environnement, cookies et serveur et effacera toutes les
variables passées en GET avec les variables de mêmes noms passées en
méthode POST. ("GP" = POST prioritaire sur GET).
--
Un ordinateur résout des problèmes que nous n'aurions pas sans lui
Technique aéronautique : http://aviatechno.free.fr
Concorde dans la presse de 1965 à 2003 : http://le.pointu.free.fr

Avatar
John GALLET
Bonjour,

Dans une fonction, $_GET ou $_POST ne peuvent pas être utilisés en tant
que variable dynamique :


Oui, tout à fait, cf le manuel.

http://fr2.php.net/manual/en/language.variables.variable.php

WARNING, encadré.

Please note that variable variables cannot be used with PHP's
Superglobal arrays within functions or class methods.


De la même manière dans les trucs tordus, on ne peut pas utiliser les
"langage constructs" dans les fonctions dynamiques. Exemple (de mémoire,
non retesté):

$toto="echo";
$toto("coucou"); // ne marchera pas.
function mafonc($a){echo $a;}
$toto="mafonc";
$toto("coucou"); // coucou

a++;
JG