Comment passer un NOM de variable en paramètre

tiris Messages postés 6 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 12 octobre 2005 - 10 oct. 2005 à 20:07
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 - 12 oct. 2005 à 19:11
Bonjour


Je finit mon année d'étude bientôt et suis en stage. Je découvre php sur mon sujet de stage :(


J'ai une classe de stats qui me construit des tableaux. Pour l'instant, 3 tableaux y sont calculés pour construire au final le tableau à afficher.
Pour l'instancier, je passe des bouts de requêtes. Deux fonctionnent bien mais la troisième est imbriquée dans une boucle avec une variable qui bouge sur chaque tour. Mon problème est de savoir comment passer un nom de variable en paramètre (et non la valeur).


Par exemple:$monArray array( monChamp , maTable , Year $annee AND month = $moisDepart)
$monTableau = new newStat( $monArray );


Bien sur ce code ne marche pas, php cherche à interpréter $annee et $moisDepart à l'appel.


Si quelqu'un à une idée, il est le bienvenu

14 réponses

davwart Messages postés 855 Date d'inscription mardi 19 novembre 2002 Statut Membre Dernière intervention 28 juillet 2009 1
10 oct. 2005 à 21:00
$a : variable nommée "a"

$$a : ton nom de variable devient la valeur de $a.

-------------------------------------
Les ordinateurs, plus on s'en sert moins, moins ça a de chance de mal marcher. [Les Shadoks]
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
10 oct. 2005 à 23:16
"$monArray = array( monChamp , maTable , Year = $annee AND month = $moisDepart)"

Normal, lorsque tu déclares ton tableau, tes variables sont converties dans leurs valeurs respectives.

Tu ne peux pas passer un nom de variable... du moins j'ai jamais essayé, mais je crois pas que c'est faisable.



En même temps, ton tableau est mal écrit. Le "Year $annee AND month $moisDepart", ca sort d'ou ca ?
0
tiris Messages postés 6 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 12 octobre 2005
11 oct. 2005 à 01:48
Tu dois avoir raison la faisabilité du truc.
Le "Year...." est une partie de la clause WHERE qui doit être reconstitué dans la classe (en requête complète donc).
C'est bien sur interprété avant l'appel et part en string dans ma requête.
Ce que je voudrais c'est des requêtes interprétées (dans la classe) comme ça:
for ($i=0;$i<$periode;$i++){
$sql="SELECT monchamp
FROM matable
WHERE year = $annee";
$mysql -> execute($sql);
bla bla...;
$annee++;
}
ou comme ça
for ($i=0;$i<$countMontype;$i++){
$sql="SELECT monchamp
FROM matable
WHERE type =".$montype[$i];
$mysql -> execute($sql);
bla bla...;
}


il me faut donc des variables dans ces boucles.
A part tout écrire en dur, je vois pas trop..
du coup ça fait pas très classe..
En tout cas merci à tous les deux d'avoir répondu
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
11 oct. 2005 à 09:27
J'a rien compris...!

Mais alors, rien! Lol.



Ou alors je ne vois pas le problème...

Tu peux vien avoir un tableau comme propriété de ta classe, dans lequel
tu stockes tes valeurs, et boucler sur ce tableau. Un peu comme ton 2d
exemple.

Tu peux aussi utiliser des trucs façon func_num_args () pour récupérer
les arguments d'appels d'une méthode. Enfin chais pas, je suis un peu
dans le flou, perso, sur ton problème. Je ne l'ai vraiment pas
franchement saisi ;-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
11 oct. 2005 à 11:26
class x {



public function __construct($champ, $table, $where) {



for ($i=0;$i<$periode;$i++){

$sql="SELECT $champ FROM $table WHERE $where"

$mysql -> execute($sql);

bla bla...;

}



}



}





Autrement, pour faire passer un nom de variable, il te faut faire un tableau :

$champ = 'monchamp';

$table = 'matable';

$year = '1990';

$array = ('champ','table','year');

echo $$array[0]; // Affichera : 'monchamp'

echo $$array[1]; // Affichera : 'matable'

echo $$array[2]; // Affichera : '1990'



Je vois pas mieux comment te décrire ca :)
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
11 oct. 2005 à 11:51
Je ne vois pas l'intérêt, lol.

(je vois rarement l'intérêt des variables variables, de toutes façons ;-) je suis plutôt braqué contre lol).
0
tiris Messages postés 6 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 12 octobre 2005
11 oct. 2005 à 11:57
ben oui mais non
c'est peut-être pratique les variables dynamiques (tu m'as fait découvrir ça hier, merci), mais pas adaptées à mon cas.

ton $$array[2] , fonctionnera sur une itération de boucle, et ne bougera pas sur $periode, puisque c'est string.

MA CLASSE (trés simplifiée)

class newStat{

private $tabEntete;
private $tabIndice;
private $tabDonnee;

//constructeur
public function newStat($tabRequetEntete,$tabRequetIndice,$tabRequetDonnee ){
$this -> constructTabEntete($RequetEntete);
$this -> constructTabIndice($tabRequetIndice);
$this -> constructTabDonnee($tabRequetDonnee);
}

public function constructTabDonnee(){
for ($t=0 ; $t < $periode ; $t++){
$sql = "SELECT ".$tabRequetDonnee[0].
"FROM ".$tabRequetDonnee[1].
"WHERE ".$tabRequetDonnee[2];
$mysql -> execute($sql);
bla bla...;
}
}


EXEMPLE D'APPEL
$tabRequetIndice[0] = "un string "
.....
$tabRequetDonnee[0] = "mon champ";
$tabRequetDonnee[1] = "ma table";
$tabRequetDonnee[2] = "year = ".$annee;

L'idée (idiote) première, était d'avoir une requête dynamique dans la classe. Pour être dynamique il faut impérativement que des NOMS de variables apparaissent pour y être intéprétées à chaque tour. Hors à l'appel,
sur $tabRequetDonnee[2], $moisDepart sera automatiquement intéprété, et arrive string dans la classe.
Ce que j'aurais voulu, c'était trouver un moyen de reconstituer des requêtes qui soient interprétées par php dans MA CLASSE comme dans les exemples de mon 2eme post.

Pour l'instant, j'utilise un switch case qui trie mes requêtes en dur.
0
tiris Messages postés 6 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 12 octobre 2005
11 oct. 2005 à 12:01
oups
constructTabDonnee prend $tabRequetDonnee en paramètre bien sur
public function constructTabDonnee($tabRequetDonnee ){
}
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
11 oct. 2005 à 12:06
Je ne comprends toujours pas lol.

Pourquoi tu n'utilises pas un tableau à plusieurs dimensions...??



$tab = array (

0 => array (

'champ' => 'bla',

'table' => 'bli',

'year' => '2778'

)

1 => array (


'champ' => 'blu',


'table' => 'blo',


'year' => '5987'


)

)

Et tu peux itérer sur les index, puis prendre le champ, la table, et l'année de cet index ?
0
tiris Messages postés 6 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 12 octobre 2005
11 oct. 2005 à 14:00
argh!!!

ton tableau reconstitué dans la classe donne une requête en string

for ($t=0 ; $t < $periode ; $t++){
$sql = "SELECT bla
FROM bli
WHERE year=2778 "; <------------au tour suivant ça ne peut bouger(sauf si $annee)
$mysql -> execute($sql);
bla bla...;
$ANNEE++; <----------- incremente mon annee sur boucle
}

Ce qu'il me faut c'est ça:

for ($t=0 ; $t < $periode ; $t++){
$sql = "SELECT bla
FROM bli
WHERE year= $ANNEE
$mysql -> execute($sql);
bla bla...;
$ANNEE++;
}

je ne peux pas renseigner toutes les valeurs que peut prendre le champ year à l'appel.
De plus, j'ai 90 graphiques, donc 90 requêtes différentes, et il me faut des variables qui puissent bouger dynamiquement dans cette requête.

comment expliquer quelque chose qui n'est pas possible
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
11 oct. 2005 à 14:45
Ok ok....j'y vois plus clair :

$tabRequetDonnee[2] = "year = ".$annee;

et

$sql = "SELECT ".$tabRequetDonnee[0].

"FROM ".$tabRequetDonnee[1].

"WHERE ".$tabRequetDonnee[2];



Mais je ne pige tjrs pas très bien, pour être honnête...

Si je m'en tiens juste à ça, incrémenter ton année n'est pas super compliqué :

on explose $tabRequetDonnee[2] sur le '='

on incrémente la 2ème entrée du tableau obtenu (l'année quoi)

on reconstruit $tabRequetDonnee[2] (en implosant le tableau précédemment obtenu sur un '=').
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
11 oct. 2005 à 15:14
C'est un peu l'anarchie ton code je trouve dans ta classe :)



public function constructTabDonnee($tabRequetDonnee){

for ($t=0 ; $t < $periode ; $t++){

$sql = "SELECT ".$tabRequetDonnee[0].

"FROM ".$tabRequetDonnee[1].

"WHERE ".$tabRequetDonnee[2];

$mysql -> execute($sql);

bla bla...;

}

}

C'est ta fonction tel quel. Hors :

$tabRequetDonnee provient de l'appel de fonction via le constructeur.
(variable $tabRequetDonnee) qui provient elle même d'un appel de
classe. Hors, quand on sait que $tabRequetDonnee, au final, vaut :
'Year $annee AND month $moisDepart', je comprend pas pourquoi tout
à coup $tabRequetDonnee devient un tableau !



Ce que je comprend encore moins, c'est comment avec un seul argument
dans ton instanciation de classe, tu arrives à avoir 3 arguments au
final ?

Le véritable appel de classe aurait dû etre :

$ma_class new newStat( 'monChamp' , 'maTable' , 'Year $annee AND month = $moisDepart' );



Ensuite, comme je l'ai dit plus haut, y'a des passages de variables d'une methode à une autre qui sont bizarre...

De toute facon, tu as des trucs qui ne changent pas j'imagine. Style
les variables à vérifier dans ta base SQL : Year - Month etc... Ca, ca
doit resté en dur sur ta requète, et laisser les variables en fonction
de ce que tu veux réelement changer.



Parce que moi perso, j'ai un peu de mal à m'y retrouver :)



Ps: Le constructeur d'une classe s'appèle ainsi :

function __construct () {

}



:)
0
tiris Messages postés 6 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 12 octobre 2005
12 oct. 2005 à 17:36
ça y est problème résolu.
J'ai réécrit ma classe en séparant mes requêtes de mes traitements sur les tableaux.
Pour le constructeur j'ai lu quelque part qu'il y avait deux écritures possibles, et j'ai donc continué à faire comme j'ai l'habitude en java.
En tout cas merci à ceux qui m'ont aidés, sympa ;)
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
12 oct. 2005 à 19:11
"Pour le constructeur j'ai lu quelque part qu'il y avait deux écritures possibles" Pour 2 versions de PHP différentes, oui.

Hors, si tu utilises les mots clefs "public" - "private" - "protected",
c'est que tu utilises PHP5. Hors, le constructeur dans PHP5 se nomme
bien __construct().



Il faut savoir que soit tu programmes pour une version donnée de PHP, soit pour une autre, mais en aucun cas un mix des 2.
0
Rejoignez-nous