Discussion:
Problemes avec DEFINE et constantes
(trop ancien pour répondre)
D.St-Sanvain@news.free.fr,
2010-01-09 22:01:51 UTC
Permalink
Bonjour,

j'utilise des constantes (75), définies comme ceci :
define( "URL_MEMBRES_DETAILS" , "mbr_membres_details.php" ) ;
Le but est de personnaliser ou adapter un peu mes pages. Il y a des
numériques, du texte pur, des adresses, répertoires, etc...

Je les utilise classiquement de la même manière depuis toujours. Soit
dans du PHP normal :
if( $num_max_ordre == NB_TYPES )
$plus[] = 0 ;
else
$plus[] = 1 ;

ou dans du PHP inclus dans du HTML :
<img src=<?php echo REP_ICONES ?>supprimer.png title="Supprimer le
membre" border=0>

Et là, paf... surprise, je remarque une différence de fonctionnement
sur les pages en ligne, mais uniquement sur deux constantes : au lieu
de restituer la valeur de la constante, j'ai comme retour le nom de la
constante :
/URL_MEMBRES_DETAILS?mbr_index=2
au lieu de :
/mbr_membres_details.php?mbr_index=2

Il n'y a pas de message d'erreur, ni à l'affichage, ni "caché" dans le
source HTML. La constante est bien définie, elle est visible via
get_defined_constants() ; si je supprime la ligne de définition, j'ai
un message d'erreur, si je la double, j'ai le message signalant la
double definition. Elles ne sont pas des mots clés. L'ordre des lignes
de definition ne change rien.

En local (EasyPhP 5.3.0) tout va bien, en ligne (Free PHP 4.4.3), ça
coince sur deux constantes...

Bref, je sèche... Merci de vos lumières,
--
D(e l'aviation, rien que de l'aviation) 520
Site et chat : http://d520.online.fr
Cocardes du monde : http://cocardes.monde.online.fr
Tagazous :
http://tagazous.free.fr/affichage.php?photographe=D.%20St-Sanvain
Olivier Miakinen
2010-01-09 23:44:05 UTC
Permalink
Bonjour,
Post by D.St-***@news.free.fr,
define( "URL_MEMBRES_DETAILS" , "mbr_membres_details.php" ) ;
[...]
<img src=<?php echo REP_ICONES ?>supprimer.png title="Supprimer le
membre" border=0>
Attention, ta syntaxe ici est incorrecte, même en HTML, puisque
REP_ICONES contient très certainement un « / », et que donc l'attribut
*doit* être entre guillemets. Une bonne habitude consiste d'ailleurs à
toujours les mettre :
<img src="<?php echo REP_ICONES ?>supprimer.png" title="Supprimer le
membre" border=0>
Post by D.St-***@news.free.fr,
Et là, paf... surprise, je remarque une différence de fonctionnement
sur les pages en ligne, mais uniquement sur deux constantes : au lieu
de restituer la valeur de la constante, j'ai comme retour le nom de la
/URL_MEMBRES_DETAILS?mbr_index=2
/mbr_membres_details.php?mbr_index=2
Ç'aurait été bien de donner le code fautif de cet exemple précis, au
lieu de donner un exemple qui fonctionne (à l'erreur de syntaxe près).

Bon, j'ai sorti ma boule de cristal, et si jamais elle fonctionne ça
nous évitera un aller-retour inutile. Si donc j'ai bien deviné, je te
suggère de remplacer :
echo "/URL_MEMBRES_DETAILS?mbr_index=2";
par :
echo "/" . URL_MEMBRES_DETAILS . "?mbr_index=2";
Post by D.St-***@news.free.fr,
En local (EasyPhP 5.3.0) tout va bien, en ligne (Free PHP 4.4.3), ça
coince sur deux constantes...
Ah ? Hum... c'est vraiment le *même* fichier que tu as aux deux
endroits ? Si oui, cf. supra : donne-nous le code exact.
Post by D.St-***@news.free.fr,
Bref, je sèche... Merci de vos lumières,
Aide-nous à t'aider...
--
Olivier Miakinen
D.St-Sanvain@news.free.fr,
2010-01-10 17:10:44 UTC
Permalink
Re,
Post by Olivier Miakinen
Aide-nous à t'aider...
:)
Je détaille le problème :

* Alors, tout d'abord quelques résultats d'essais effectués depuis :
- avec Chrome, Firefox, Sea Monkey, et Explorer, en PHP 4 et 5 : rien
ne change, caches vidés régulièrement.
- j'ai également supprimé quelques DEFINE, pour "libérer de la place",
rien ne change
- toujours sur la piste de l'allocation, modifier l'ordre ne change
rien
- les guillemets, oui, oui, c'est mieux avec pour la syntaxe, mais...
dans le fonctionnement, rien n'a changé :/
- j'ai inversé la position des liens, au cas où l'erreur viendrait de
plus en avant dans la page
- j'ai changé la construction des liens, en ajoutant les variables
avant
- j'ai même renommé la constante... (!?!?) en vain...
- (idem pour la 2ème)

* Les sources :
- dans un constantes.php, la définition des constantes :
define( "URL_MEMBRES_GROUPES" , "mbr_membres_groupes.php" ) ;
define( "URL_MEMBRES_DETAILS" , "mbr_membres_details.php" ) ;

- dans la page en elle-même :
. dans un premier temps :
<a href="<?php echo URL_MEMBRES_DETAILS ?>?mbr_index=<?php echo
$mbr_index ?>">
<img src="<?php echo REP_ICONES ?><?php echo $previsu_ico ?>"
title="Détails du membre" border=0>
</a>

. dans un deuxième temps :
<a href="<?php echo URL_MEMBRES_GROUPES ?>?mbr_index=<?php echo
$mbr_index ?>">
<img src="<?php echo REP_ICONES ?><?php echo $nb_items_ico ?>"
title="Gestion des groupes" border=0>
</a>

* Le résultat en ligne :
- sortie de get_defined_constants :
[REP_ICONES] => ico/
[URL_MEMBRES_GROUPES] => mbr_membres_groupes.php
[URL_MEMBRES_DETAILS] => mbr_membres_details.php

- dans la page :
. pour le 1er cas :
<td class=tab2>
<a href="URL_MEMBRES_DETAILS?mbr_index=2">
<img src="ico/previsu.png" title="Détails du membre" border=0>
</a>
</td>

. pour le 2ème :
<td class=tab2>
<a href="mbr_membres_groupes.php?mbr_index=2">
<img src="ico/gestion.png" title="Gestion des groupes" border=0>
</a>
</td>

Si ça peut aider à m'aider, merci d'avance :)

Pour le moment, je passe certains morceaux "en dur"

A+
--
D(e l'aviation, rien que de l'aviation) 520
Site et chat : http://d520.online.fr
Cocardes du monde : http://cocardes.monde.online.fr
Tagazous :
http://tagazous.free.fr/affichage.php?photographe=D.%20St-Sanvain
Optitech
2010-01-11 00:17:54 UTC
Permalink
Salut,

As-tu essayé la fonction contant() ?
http://fr2.php.net/manual/fr/function.constant.php ?

Au revoir
--
Optitech - EPITA 2012
Olivier Miakinen
2010-01-11 00:17:54 UTC
Permalink
Bonjour,
Post by D.St-***@news.free.fr,
- avec Chrome, Firefox, Sea Monkey, et Explorer, en PHP 4 et 5 : rien
ne change, caches vidés régulièrement.
Normal, tout se passe du côté serveur, les navigateurs ne peuvent rien y
changer.
Post by D.St-***@news.free.fr,
- j'ai également supprimé quelques DEFINE, pour "libérer de la place",
rien ne change
- toujours sur la piste de l'allocation, modifier l'ordre ne change
rien
Ok.
Post by D.St-***@news.free.fr,
- les guillemets, oui, oui, c'est mieux avec pour la syntaxe, mais...
dans le fonctionnement, rien n'a changé :/
Oui, je ne m'attendais pas à ce que ça résolve ton problème, c'était
juste une remarque en passant.
Post by D.St-***@news.free.fr,
- j'ai inversé la position des liens, au cas où l'erreur viendrait de
plus en avant dans la page
- j'ai changé la construction des liens, en ajoutant les variables
avant
Ok.
Post by D.St-***@news.free.fr,
- j'ai même renommé la constante... (!?!?) en vain...
Excellent test, dommage que ça n'ait rien donné.
Post by D.St-***@news.free.fr,
- (idem pour la 2ème)
define( "URL_MEMBRES_GROUPES" , "mbr_membres_groupes.php" ) ;
define( "URL_MEMBRES_DETAILS" , "mbr_membres_details.php" ) ;
REP_ICONES et URL_MEMBRES_DETAILS sont définies au même endroit ? Dans
un seul fichier, et pas dans un code conditionnel ?
Post by D.St-***@news.free.fr,
<a href="<?php echo URL_MEMBRES_DETAILS ?>?mbr_index=<?php echo
$mbr_index ?>">
<img src="<?php echo REP_ICONES ?><?php echo $previsu_ico ?>"
title="Détails du membre" border=0>
</a>
<a href="<?php echo URL_MEMBRES_GROUPES ?>?mbr_index=<?php echo
$mbr_index ?>">
<img src="<?php echo REP_ICONES ?><?php echo $nb_items_ico ?>"
title="Gestion des groupes" border=0>
</a>
J'ai cru un moment que l'absence de point-virgule après chaque
instruction pouvait être un problème, mais apparemment la doc l'autorise.
Post by D.St-***@news.free.fr,
[REP_ICONES] => ico/
[URL_MEMBRES_GROUPES] => mbr_membres_groupes.php
[URL_MEMBRES_DETAILS] => mbr_membres_details.php
<td class=tab2>
<a href="URL_MEMBRES_DETAILS?mbr_index=2">
<img src="ico/previsu.png" title="Détails du membre" border=0>
</a>
</td>
<td class=tab2>
<a href="mbr_membres_groupes.php?mbr_index=2">
<img src="ico/gestion.png" title="Gestion des groupes" border=0>
</a>
</td>
Si ça peut aider à m'aider, merci d'avance :)
Oui, c'est très détaillé.
Post by D.St-***@news.free.fr,
Pour le moment, je passe certains morceaux "en dur"
Quelques suggestions supplémentaires :
1) error_reporting(E_ALL) au début du script
2) <?php $truc = URL_MEMBRES_GROUPES; echo $truc; ?>
3) vérifier (avec un éditeur hexa) tous les caractères de la constante,
aussi bien lors de sa définition que de son utilisation, y compris les
deux espaces avant et après
4) effacer tout le code sauf la définition et l'utilisation, puis...
5) ... faire un rapport de bug à PHP.
--
Olivier Miakinen
Olivier Miakinen
2010-01-11 10:19:44 UTC
Permalink
Post by Olivier Miakinen
3) vérifier (avec un éditeur hexa) tous les caractères de la constante,
aussi bien lors de sa définition que de son utilisation, y compris les
deux espaces avant et après
Je voulais dire tous les caractères du *nom* de la constante, pas de son
contenu.

Par exemple, si tu as défini "URL_MEMBRES_DETAILS" mais que tu utilises
"URL_MEMBRES_<espace_sans_chasse_et_donc_invisible>DETAILS" ou bien
"URL_MEMBRES_DETAILS<espace_insécable>", cela pourrait expliquer le
problème. Note que ceci peut arriver si tes fichiers sont en UTF-8 mais
pas s'ils sont en ISO-8859-1 ou ISO-8859-15.

P.-S. : tes deux adresse dans le champ From, dont une que je soupçonne
d'être incorrecte, ont vraiment un aspect bizarre. Tu n'aurais pas un
problème de configuration, par exemple une virgule dans le nom que
MesNews interpréterait à tort comme une séparation entre deux adresses ?
--
Olivier Miakinen
D.St-Sanvain@news.free.fr,
2010-01-11 17:23:46 UTC
Permalink
Re,
Post by Olivier Miakinen
Post by D.St-***@news.free.fr,
define( "URL_MEMBRES_GROUPES" , "mbr_membres_groupes.php" ) ;
define( "URL_MEMBRES_DETAILS" , "mbr_membres_details.php" ) ;
REP_ICONES et URL_MEMBRES_DETAILS sont définies au même endroit ? Dans
un seul fichier, et pas dans un code conditionnel ?
Oui, un seul fichier définit toutes les constantes, appelé une seule
fois depuis un seul endroit (la bibliothèque de fonctions).
Post by Olivier Miakinen
1) error_reporting(E_ALL) au début du scrip
Merci du tuyau :

* Les tests :
Ci-dessous la sortie du petit test suivant :
<?php
echo "ini_get( 'error_reporting' ) : ".ini_get( 'error_reporting' ) ;
error_reporting(E_ALL);
echo "<br>error_reporting(E_ALL) : ".ini_get( 'error_reporting' ) ;
?>

Donne :
ini_get( 'error_reporting' ) : 2039
error_reporting(E_ALL) : 2047

Selon get_defined_constants, la différence de 8 correspond à :
[E_NOTICE] => 8

* Ajout de error_reporting(E_ALL) en début des pages et apparition dans
le source ou à l'écran, selon le cas, des messages de ce genre :

Notice: Use of undefined constant URL_MEMBRES_DETAILS - assumed
'URL_MEMBRES_DETAILS' in (etc...)

Tiens, un Notice... étonnant, non ?
(idem pour les autres..........)
Là, je m'interroge... j'ai déjà vu ce message d'erreur avant, et je
n'ai absolument pas touché à error_reporting (que je découvre).

Je comprend un peu plus le comportement, mais toujours pas l'erreur...

Si je teste - defined() - la définition de la constante, elle ne l'est
pas, et si j'enchaîne par une définition, pas de doublon, puis c'est
bon...

* Copie de l'intégralité sur un autre serveur (espace dédié de chez
Online) tout va bien...
Post by Olivier Miakinen
2) <?php $truc = URL_MEMBRES_GROUPES; echo $truc; ?>
Ne change rien...
Post by Olivier Miakinen
3) vérifier (avec un éditeur hexa) tous les caractères de la constante,
aussi bien lors de sa définition que de son utilisation, y compris les
deux espaces avant et après
4) effacer tout le code sauf la définition et l'utilisation, puis...
5) ... faire un rapport de bug à PHP.
Je continue à creuser... Merci du coup de main :)
--
D(e l'aviation, rien que de l'aviation) 520
Site et chat : http://d520.online.fr
Cocardes du monde : http://cocardes.monde.online.fr
Tagazous :
http://tagazous.free.fr/affichage.php?photographe=D.%20St-Sanvain
Pascal
2010-01-11 17:23:46 UTC
Permalink
Post by D.St-***@news.free.fr,
<a href="URL_MEMBRES_DETAILS?mbr_index=2">
Bonjour,

C'est très pifométrique, mais le code présenté est-il le résultat d'un
strict copié-collé de l'éditeur ?
Est-ce que, à tout hasard, un correcteur orthographique intégré n'aurait
pas mis un "E" accentué à "DETAILS" ?
Conseil basique : faire un copié-collé du nom de la constante qui pose
problème, de là où elle est définie vers où elle est utilisée.

Bonne chance,
Pascal
D.St-Sanvain@news.free.fr,
2010-01-13 12:25:54 UTC
Permalink
Bonsoir,

Bon... après quelques séances de remue-méninges, j'y vois enfin clair.

Le problème venait de la présence en double, dans deux répertoires
différents, du fichier qui définit les constantes...

Configuration :
- racine/ :
. page.php
- racine/include/ :
. fonctions.php
. constantes.php

En racine, les pages.php contiennent :
include( "inclusions/fonctions.php" ) ;

Dans include, fonctions.php contenait en première ligne :
include( "constantes.php" ) ;

Mais... dans racine/ , il y avait aussi un "constantes.php" plus vieux
de quelques jours... (loupé de transfert...)
Celui-ci n'étant pas mis à jour, contrairement à celui mis dans
inclusions/, les "nouvelles" constantes posaient problème.

Un fois supprimé, plus de problèmes. Ce fichier en racine "prenait la
main" sur celui du répertoire.
Ce que je ne comprends pas bien, c'est qu'une fois que le fichier en
doublon est supprimé (il était bien appelé, la preuve), il n'y a pas de
message d'erreur. Je n'ai pas défini d'include_path, que je découvre.

Au bilan, je vais revoir la position de l'appel à constantes, pas très
propre en l'état.

Et pour conclure, la tournée est pour moi !

Merci, A+
--
D(e l'aviation, rien que de l'aviation) 520
Site et chat : http://d520.online.fr
Cocardes du monde : http://cocardes.monde.online.fr
Tagazous :
http://tagazous.free.fr/affichage.php?photographe=D.%20St-Sanvain
Continuer la lecture sur narkive:
Loading...