lors d'un post precedent,
"utilisation d'eval()"
j'ai cru comprendre que cette fonction n'était pas ideale et qu'il valait
mieux essayer de s'en passer.
Est ce qu'il existe d'autres methodes que cette fonction
Voici le contenu de mon post précedent decrivant mon probleme
A partir d'une requete mysql, je souhaite réaliser un tableau décrivant les
résultats de la requete.
Ce que j'essaie de faire , c'est de préparer la requete et la description du
tableau à l'avance afin que l'affichage soit géré
automatiquement.
exemple:
$query = "select code,nom,prenom from users where validite =1" ;
j'ai donc créé une classe decrivant chaque colonne resultat de la requete
$elt->add("code","Code") ; le premier argument est le nom de la colonne
dans la requete, le second est le titre de la colonne
$elt->add(nom,"Nom") ;
$elt->add(prenom,"Prénom") ;
J'ai aussi ajouté un format (utile pour les nombres)
Et enfin, a la fin de chaque ligne, je souhaite ajouter des liens qui
permettent de valider/devalider, modifier (renvoie vers un formulaire)
^^
Dans le cas des liens, il faut definir pour chaque ligne un lien intégrant
le code de l'enregistrement à valider ou modifier ou autre.
L'appel a la fonction display de cette classe m'affiche mon tableau avec les
liens, les formats, les noms de colonne, etc.
C'est pourquoi j'essaie de mettre en oeuvre eval(), qui pour moi est
actuellement la seule reponse que j'ai trouvée.
lors d'un post precedent,
"utilisation d'eval()"
j'ai cru comprendre que cette fonction n'était pas ideale et qu'il valait
mieux essayer de s'en passer.
Est ce qu'il existe d'autres methodes que cette fonction
Voici le contenu de mon post précedent decrivant mon probleme
A partir d'une requete mysql, je souhaite réaliser un tableau décrivant les
résultats de la requete.
Ce que j'essaie de faire , c'est de préparer la requete et la description du
tableau à l'avance afin que l'affichage soit géré
automatiquement.
exemple:
$query = "select code,nom,prenom from users where validite =1" ;
j'ai donc créé une classe decrivant chaque colonne resultat de la requete
$elt->add("code","Code") ; le premier argument est le nom de la colonne
dans la requete, le second est le titre de la colonne
$elt->add(nom,"Nom") ;
$elt->add(prenom,"Prénom") ;
J'ai aussi ajouté un format (utile pour les nombres)
Et enfin, a la fin de chaque ligne, je souhaite ajouter des liens qui
permettent de valider/devalider, modifier (renvoie vers un formulaire)
^^
Dans le cas des liens, il faut definir pour chaque ligne un lien intégrant
le code de l'enregistrement à valider ou modifier ou autre.
L'appel a la fonction display de cette classe m'affiche mon tableau avec les
liens, les formats, les noms de colonne, etc.
C'est pourquoi j'essaie de mettre en oeuvre eval(), qui pour moi est
actuellement la seule reponse que j'ai trouvée.
lors d'un post precedent,
"utilisation d'eval()"
j'ai cru comprendre que cette fonction n'était pas ideale et qu'il valait
mieux essayer de s'en passer.
Est ce qu'il existe d'autres methodes que cette fonction
Voici le contenu de mon post précedent decrivant mon probleme
A partir d'une requete mysql, je souhaite réaliser un tableau décrivant les
résultats de la requete.
Ce que j'essaie de faire , c'est de préparer la requete et la description du
tableau à l'avance afin que l'affichage soit géré
automatiquement.
exemple:
$query = "select code,nom,prenom from users where validite =1" ;
j'ai donc créé une classe decrivant chaque colonne resultat de la requete
$elt->add("code","Code") ; le premier argument est le nom de la colonne
dans la requete, le second est le titre de la colonne
$elt->add(nom,"Nom") ;
$elt->add(prenom,"Prénom") ;
J'ai aussi ajouté un format (utile pour les nombres)
Et enfin, a la fin de chaque ligne, je souhaite ajouter des liens qui
permettent de valider/devalider, modifier (renvoie vers un formulaire)
^^
Dans le cas des liens, il faut definir pour chaque ligne un lien intégrant
le code de l'enregistrement à valider ou modifier ou autre.
L'appel a la fonction display de cette classe m'affiche mon tableau avec les
liens, les formats, les noms de colonne, etc.
C'est pourquoi j'essaie de mettre en oeuvre eval(), qui pour moi est
actuellement la seule reponse que j'ai trouvée.
Les fonctions les plus utilisées sont:
function AddRef($name,$post,$strclick="",$title="")
{
$str = '<A HREF="'.$post.'" title="'.$title.'"
onClick="'.$strclick.'">'.$name.'</A>' ;
$this->AddCell($str) ;
}
function AddCell($val="",$format="")
{
$str0 = '<td colspan="'.$this->nbcolspan.'"
rowspan="'.$this->nbrowspan.'" class="'.$this->cellclass.'">' ;
$str1 = "</td>n" ;
if ( $format != "" )
{
printf("$str0$format$str1",$val);
}
else
{
if ( $val == "" )
echo "$str0 $str1" ;
else
echo "$str0$val$str1";
}
}
public function addLien($nom,$url,$strClick='')
{
$this->lien[$this->nblien] = new eltLien($nom,$url,$strClick) ;
$this->nblien++;
}
public function createQuery()
{
$this->query = "select " ;
for ( $i = 0 ; $i < $this->nbelt; $i++ )
{
if ( $i > 0 ) $this->query.= ' , ' ;
$this->query .= $this->elt[$i]->getNom() ;
}
[...]
}
foreach ( $result as $val )
{
[...]
for( $i = 0 ; $i < $this->nblien; $i++ )
{
eval($this->lien[$i]->nomLien) ;
eval($this->lien[$i]->urlLien) ;
eval($this->lien[$i]->strClick) ;
$table->AddRef($nomLien,$strLien,$strClick) ;
}
}
$nomLien = '$nomLien = $val->gdeDist==0?"Valider":"Dévalider" ;' ;
Les fonctions les plus utilisées sont:
function AddRef($name,$post,$strclick="",$title="")
{
$str = '<A HREF="'.$post.'" title="'.$title.'"
onClick="'.$strclick.'">'.$name.'</A>' ;
$this->AddCell($str) ;
}
function AddCell($val="",$format="")
{
$str0 = '<td colspan="'.$this->nbcolspan.'"
rowspan="'.$this->nbrowspan.'" class="'.$this->cellclass.'">' ;
$str1 = "</td>n" ;
if ( $format != "" )
{
printf("$str0$format$str1",$val);
}
else
{
if ( $val == "" )
echo "$str0 $str1" ;
else
echo "$str0$val$str1";
}
}
public function addLien($nom,$url,$strClick='')
{
$this->lien[$this->nblien] = new eltLien($nom,$url,$strClick) ;
$this->nblien++;
}
public function createQuery()
{
$this->query = "select " ;
for ( $i = 0 ; $i < $this->nbelt; $i++ )
{
if ( $i > 0 ) $this->query.= ' , ' ;
$this->query .= $this->elt[$i]->getNom() ;
}
[...]
}
foreach ( $result as $val )
{
[...]
for( $i = 0 ; $i < $this->nblien; $i++ )
{
eval($this->lien[$i]->nomLien) ;
eval($this->lien[$i]->urlLien) ;
eval($this->lien[$i]->strClick) ;
$table->AddRef($nomLien,$strLien,$strClick) ;
}
}
$nomLien = '$nomLien = $val->gdeDist==0?"Valider":"Dévalider" ;' ;
Les fonctions les plus utilisées sont:
function AddRef($name,$post,$strclick="",$title="")
{
$str = '<A HREF="'.$post.'" title="'.$title.'"
onClick="'.$strclick.'">'.$name.'</A>' ;
$this->AddCell($str) ;
}
function AddCell($val="",$format="")
{
$str0 = '<td colspan="'.$this->nbcolspan.'"
rowspan="'.$this->nbrowspan.'" class="'.$this->cellclass.'">' ;
$str1 = "</td>n" ;
if ( $format != "" )
{
printf("$str0$format$str1",$val);
}
else
{
if ( $val == "" )
echo "$str0 $str1" ;
else
echo "$str0$val$str1";
}
}
public function addLien($nom,$url,$strClick='')
{
$this->lien[$this->nblien] = new eltLien($nom,$url,$strClick) ;
$this->nblien++;
}
public function createQuery()
{
$this->query = "select " ;
for ( $i = 0 ; $i < $this->nbelt; $i++ )
{
if ( $i > 0 ) $this->query.= ' , ' ;
$this->query .= $this->elt[$i]->getNom() ;
}
[...]
}
foreach ( $result as $val )
{
[...]
for( $i = 0 ; $i < $this->nblien; $i++ )
{
eval($this->lien[$i]->nomLien) ;
eval($this->lien[$i]->urlLien) ;
eval($this->lien[$i]->strClick) ;
$table->AddRef($nomLien,$strLien,$strClick) ;
}
}
$nomLien = '$nomLien = $val->gdeDist==0?"Valider":"Dévalider" ;' ;
public function createQuery()
{
$this->query = "select " ;
for ( $i = 0 ; $i < $this->nbelt; $i++ )
{
if ( $i > 0 ) $this->query.= ' , ' ;
$this->query .= $this->elt[$i]->getNom() ;
}
[...]
}
Voilà justement l'exemple. Au lieu d'utiliser $this->nbelt, on peut
utiliser count($this->elt). Mais il y aurait encore mieux à faire, si en
plus (ou à la place ?) d'un tableau de elt tu avais un tableau de noms,
un tableau de noms de colonnes, un tableau de titres, etc. Je veux dire
que dans la fonction add, si tu avais « $this->noms[] = $nom », tu
pourrais remplacer toute la boucle for()+if() par une seule ligne :
public function createQuery()
{
$this->query = "select " ;
$this->query .= implode(", ", $this->noms);
[...]
}
C'est effectivement une solution, mais cela m'oblige à préparer ma requête
N'est-ce pas Saint-Exupéry qui disait que « la perfection est atteinte
non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus
rien à retirer » ?foreach ( $result as $val )
{
[...]
for( $i = 0 ; $i < $this->nblien; $i++ )
{
eval($this->lien[$i]->nomLien) ;
eval($this->lien[$i]->urlLien) ;
eval($this->lien[$i]->strClick) ;
$table->AddRef($nomLien,$strLien,$strClick) ;
}
}
Ah, nous y voilà enfin. Je recopie aussi la ligne d'initialisation de
machintruc->nomLien :$nomLien = '$nomLien = $val->gdeDist==0?"Valider":"Dévalider" ;'
;
Cette initialisation permet d'afficher soit valider soit invalider en
J'espère que tu es conscient que cette utilisation de '$val' lors de
l'initialisation détruit toute ta belle construction objet ? En effet,
si dans un an tu décides de remplacer '$val' par '$value' dans le
foreach (tout-à-fait valide : c'est une variable locale), ton programme
se cassera la gueule et tu ne sauras pas pourquoi. Idem pour $nomLien.
La solution la plus simple, si l'initialisation de nomLien est toujours
du même type, c'est de remplacer :
eval($this->lien[$i]->nomLien) ;
par :
$nomLien = $val->gdeDist==0 ? "Valider" : "Dévalider";
Suivant les tables, le test se fera sur des noms de variables différentes
Maintenant, si les classes de PHP permettent le polymorphisme, c'est :
$nomLien = $this->obtenirNomLien($val);
... où la méthode obtenirNomLien() fera potentiellement des choses
différentes selon le type de lien (et le paramètre $val bien sûr).
Si dans ma classe toto, je prepare une requete à l'aide d'un objet dbselect,
public function createQuery()
{
$this->query = "select " ;
for ( $i = 0 ; $i < $this->nbelt; $i++ )
{
if ( $i > 0 ) $this->query.= ' , ' ;
$this->query .= $this->elt[$i]->getNom() ;
}
[...]
}
Voilà justement l'exemple. Au lieu d'utiliser $this->nbelt, on peut
utiliser count($this->elt). Mais il y aurait encore mieux à faire, si en
plus (ou à la place ?) d'un tableau de elt tu avais un tableau de noms,
un tableau de noms de colonnes, un tableau de titres, etc. Je veux dire
que dans la fonction add, si tu avais « $this->noms[] = $nom », tu
pourrais remplacer toute la boucle for()+if() par une seule ligne :
public function createQuery()
{
$this->query = "select " ;
$this->query .= implode(", ", $this->noms);
[...]
}
C'est effectivement une solution, mais cela m'oblige à préparer ma requête
N'est-ce pas Saint-Exupéry qui disait que « la perfection est atteinte
non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus
rien à retirer » ?
foreach ( $result as $val )
{
[...]
for( $i = 0 ; $i < $this->nblien; $i++ )
{
eval($this->lien[$i]->nomLien) ;
eval($this->lien[$i]->urlLien) ;
eval($this->lien[$i]->strClick) ;
$table->AddRef($nomLien,$strLien,$strClick) ;
}
}
Ah, nous y voilà enfin. Je recopie aussi la ligne d'initialisation de
machintruc->nomLien :
$nomLien = '$nomLien = $val->gdeDist==0?"Valider":"Dévalider" ;'
;
Cette initialisation permet d'afficher soit valider soit invalider en
J'espère que tu es conscient que cette utilisation de '$val' lors de
l'initialisation détruit toute ta belle construction objet ? En effet,
si dans un an tu décides de remplacer '$val' par '$value' dans le
foreach (tout-à-fait valide : c'est une variable locale), ton programme
se cassera la gueule et tu ne sauras pas pourquoi. Idem pour $nomLien.
La solution la plus simple, si l'initialisation de nomLien est toujours
du même type, c'est de remplacer :
eval($this->lien[$i]->nomLien) ;
par :
$nomLien = $val->gdeDist==0 ? "Valider" : "Dévalider";
Suivant les tables, le test se fera sur des noms de variables différentes
Maintenant, si les classes de PHP permettent le polymorphisme, c'est :
$nomLien = $this->obtenirNomLien($val);
... où la méthode obtenirNomLien() fera potentiellement des choses
différentes selon le type de lien (et le paramètre $val bien sûr).
Si dans ma classe toto, je prepare une requete à l'aide d'un objet dbselect,
public function createQuery()
{
$this->query = "select " ;
for ( $i = 0 ; $i < $this->nbelt; $i++ )
{
if ( $i > 0 ) $this->query.= ' , ' ;
$this->query .= $this->elt[$i]->getNom() ;
}
[...]
}
Voilà justement l'exemple. Au lieu d'utiliser $this->nbelt, on peut
utiliser count($this->elt). Mais il y aurait encore mieux à faire, si en
plus (ou à la place ?) d'un tableau de elt tu avais un tableau de noms,
un tableau de noms de colonnes, un tableau de titres, etc. Je veux dire
que dans la fonction add, si tu avais « $this->noms[] = $nom », tu
pourrais remplacer toute la boucle for()+if() par une seule ligne :
public function createQuery()
{
$this->query = "select " ;
$this->query .= implode(", ", $this->noms);
[...]
}
C'est effectivement une solution, mais cela m'oblige à préparer ma requête
N'est-ce pas Saint-Exupéry qui disait que « la perfection est atteinte
non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus
rien à retirer » ?foreach ( $result as $val )
{
[...]
for( $i = 0 ; $i < $this->nblien; $i++ )
{
eval($this->lien[$i]->nomLien) ;
eval($this->lien[$i]->urlLien) ;
eval($this->lien[$i]->strClick) ;
$table->AddRef($nomLien,$strLien,$strClick) ;
}
}
Ah, nous y voilà enfin. Je recopie aussi la ligne d'initialisation de
machintruc->nomLien :$nomLien = '$nomLien = $val->gdeDist==0?"Valider":"Dévalider" ;'
;
Cette initialisation permet d'afficher soit valider soit invalider en
J'espère que tu es conscient que cette utilisation de '$val' lors de
l'initialisation détruit toute ta belle construction objet ? En effet,
si dans un an tu décides de remplacer '$val' par '$value' dans le
foreach (tout-à-fait valide : c'est une variable locale), ton programme
se cassera la gueule et tu ne sauras pas pourquoi. Idem pour $nomLien.
La solution la plus simple, si l'initialisation de nomLien est toujours
du même type, c'est de remplacer :
eval($this->lien[$i]->nomLien) ;
par :
$nomLien = $val->gdeDist==0 ? "Valider" : "Dévalider";
Suivant les tables, le test se fera sur des noms de variables différentes
Maintenant, si les classes de PHP permettent le polymorphisme, c'est :
$nomLien = $this->obtenirNomLien($val);
... où la méthode obtenirNomLien() fera potentiellement des choses
différentes selon le type de lien (et le paramètre $val bien sûr).
Si dans ma classe toto, je prepare une requete à l'aide d'un objet dbselect,
La solution la plus simple, si l'initialisation de nomLien est toujours
du même type, c'est de remplacer :
eval($this->lien[$i]->nomLien) ;
par :
$nomLien = $val->gdeDist==0 ? "Valider" : "Dévalider";
Suivant les tables, le test se fera sur des noms de variables différentes
(ici gdeDist mais je voulais que cela reste dynamique).
function affichelien($table,$val)
toto::afficheLiens($table,$val) ;
setFctLien("toto::affichelien") ;
call to undefined function toto::afficheliens() in dbselect.php
Est ce normal?
La solution la plus simple, si l'initialisation de nomLien est toujours
du même type, c'est de remplacer :
eval($this->lien[$i]->nomLien) ;
par :
$nomLien = $val->gdeDist==0 ? "Valider" : "Dévalider";
Suivant les tables, le test se fera sur des noms de variables différentes
(ici gdeDist mais je voulais que cela reste dynamique).
function affichelien($table,$val)
toto::afficheLiens($table,$val) ;
setFctLien("toto::affichelien") ;
call to undefined function toto::afficheliens() in dbselect.php
Est ce normal?
La solution la plus simple, si l'initialisation de nomLien est toujours
du même type, c'est de remplacer :
eval($this->lien[$i]->nomLien) ;
par :
$nomLien = $val->gdeDist==0 ? "Valider" : "Dévalider";
Suivant les tables, le test se fera sur des noms de variables différentes
(ici gdeDist mais je voulais que cela reste dynamique).
function affichelien($table,$val)
toto::afficheLiens($table,$val) ;
setFctLien("toto::affichelien") ;
call to undefined function toto::afficheliens() in dbselect.php
Est ce normal?
Bon. Alors plutôt que passer un « nomLien » qui est une instruction
complète, pourquoi ne pas passer simplement le nom de la variable à
tester ?
Je ne suis pas 100 % sûr de la syntaxe, mais un truc comme ça devrait
avoir une chance de marcher :
$testNomLien = $this->lien[$i]->testNomLien;
$nomLien = ${val->$testNomLien) ? "Valider" : "Invalider" ;
Bon. Alors plutôt que passer un « nomLien » qui est une instruction
complète, pourquoi ne pas passer simplement le nom de la variable à
tester ?
Je ne suis pas 100 % sûr de la syntaxe, mais un truc comme ça devrait
avoir une chance de marcher :
$testNomLien = $this->lien[$i]->testNomLien;
$nomLien = ${val->$testNomLien) ? "Valider" : "Invalider" ;
Bon. Alors plutôt que passer un « nomLien » qui est une instruction
complète, pourquoi ne pas passer simplement le nom de la variable à
tester ?
Je ne suis pas 100 % sûr de la syntaxe, mais un truc comme ça devrait
avoir une chance de marcher :
$testNomLien = $this->lien[$i]->testNomLien;
$nomLien = ${val->$testNomLien) ? "Valider" : "Invalider" ;
Hors d'une classe, cela fonctionne (voir les exemples de la doc PHP), mais
pas à l'intérieur
sauf ...
si on utilise eval()
Hors d'une classe, cela fonctionne (voir les exemples de la doc PHP), mais
pas à l'intérieur
sauf ...
si on utilise eval()
Hors d'une classe, cela fonctionne (voir les exemples de la doc PHP), mais
pas à l'intérieur
sauf ...
si on utilise eval()