J'ai EasyPHP 1.7 et PHP 4.3.3 avec l'extension gd.
J'ai install� un script qui fonctionne sur le site distant(
http://autourdalos.fr/alcay/index.php ) mais produit des erreurs en
local. Voici la premi�re, je pense que les autres sont la cons�quence de
celle-ci... :
______________________________________________________________________________________________
Notice: Undefined variable: start in
e:\easyphp1-7\www\essais\alcay\index.php on line 89
------------------------------------------------------------------------------------------------
<?
function
affichimgs($nblignes,$larimage,$hautimage,$nbcols,$url,$urlancien,$redimvoz,$cadrak,$epaiscadretable,$coulcadretable){
if (isset($_REQUEST['start'])){
$start = $_REQUEST['start'];
}
if(is_null($start)){ ## <----- ligne 89
$start = 0;
}
___________________________________________________________________________________________________
Comment configurer mon EasyPHP ou que modifier dans le script pour
pouvoir bricoler sans avoir recours au site distant ?
Merci
--
Alain L
Mon village en Haute Soule : http://autourdalos.fr
Carnet de voyages: http://jarailet.club.fr/Randobal
le serveur distant est mal configur� et permissif, votre machine
est plus propre, g�n�ralement c'est le contraire.
dans:
if (isset($_REQUEST['start'])){
$start = $_REQUEST['start'];
}
il y a une accolade ouvrante et une fermante, $start est d�fini
dans ce bloc et donc n'existe plus � la sortie de ce bloc.
un code (plus) correct est simplement:
$start = 0
if (isset($_REQUEST['start']))
$start = $_REQUEST['start'];
le pb est en parti du � la config. de easyphp, mais surtout
du � un code invalide.
Sylvain.
C'est bien d'avoir su rᅵduire le code ᅵ si peu de lignes, mais je suis
ᅵtonnᅵ que, du coup, tu ne sache pas corriger toi-mᅵme. D'autant que,
mᅵme sans ᅵtre trᅵs douᅵ en anglais, l'erreur est trᅵs explicite.
> ______________________________________________________________________________________________
>
> Notice: Undefined variable: start in
> e:\easyphp1-7\www\essais\alcay\index.php on line 89
Traduction :
Variable non dᅵfinie : start ᅵ la ligne 89.
> ------------------------------------------------------------------------------------------------
> <?
> function
> affichimgs($nblignes,$larimage,$hautimage,$nbcols,$url,$urlancien,$redimvoz,$cadrak,$epaiscadretable,$coulcadretable){
Jusqu'ᅵ prᅵsent, la variable $start n'est pas encore dᅵfinie.
> if (isset($_REQUEST['start'])){
> $start = $_REQUEST['start'];
Ici, la variable $start est dᅵfinie, mais *uniquement* si
$_REQUEST['start'] ᅵtait dᅵfinie.
> }
Et donc ici, dans le cas oᅵ $_REQUEST['start'] n'existe pas, $start
n'existe pas non plus.
> if(is_null($start)){ ## <----- ligne 89
is_null() n'est pas isset()
Tant que tu n'as pas vᅵrifiᅵ par isset() que la variable existe,
utiliser une telle variable non initialisᅵe provoque un E_NOTICE.
Au fait, l'erreur ᅵtait bien celle indiquᅵe : la variable start n'est
pas dᅵfinie quand tu l'utilises ᅵ la ligne 89.
C'est un peu exagᅵrᅵ ᅵ mon avis. La configuration par dᅵfaut du
error_reporting, c'est 'E_ALL ^ E_NOTICE', ce qui me semble assez
raisonnable. Alors oui, on peut metre E_ALL en local pour traquer
les variables non initialisᅵes, mais ce n'est pas forcᅵment la fin
du monde si on oublie une initialisation ᅵ 0 ou ᅵ '' et que la valeur
ᅵ non dᅵfinie ᅵ se transtype automatiquement en cette valeur 0 ou ''.
> dans:
>
> if (isset($_REQUEST['start'])){
> $start = $_REQUEST['start'];
> }
>
> il y a une accolade ouvrante et une fermante, $start est dᅵfini
> dans ce bloc et donc n'existe plus ᅵ la sortie de ce bloc.
Ah non, lᅵ tu confonds avec le C ou le C++.
> un code (plus) correct est simplement:
>
> $start = 0
> if (isset($_REQUEST['start']))
> $start = $_REQUEST['start'];
Oui, mais le code suivant serait correct aussi en PHP, bien que $start
ne soit dᅵfinie que dans des blocs d'accolades :
if (isset($_REQUEST['start'])){
$start = $_REQUEST['start'];
} else {
$start = 0;
}
if (is_null($start)) {
// etc.
}
> le pb est en partie dᅵ ᅵ la config. de easyphp, mais surtout
> dᅵ ᅵ un code invalide.
N'exagᅵrons rien.
Y a t il des cas ou l'erreur n'est pas celle indiquᅵe?
S'il t'affiche les erreurs, c'est qu'il est bien configur� pour du dev,
o� tu veux avoir le maximum d'alertes. Et si �a n'apparait pas sur le
serveur de prod, c'est que celui-ci est bien configur� pour la prod, o�
tu ne veux pas afficher de tels messages aux visiteurs de ton site.
> ou que modifier dans le script
Olivier t'a expliqu� o� �tait le probl�me. D'une mani�re g�n�rale, la
suite d'op�ration consistant �
- v�rifier si une cl� existe dans un tableau associatif
- si oui, r�cup�rer la valeur associ�e dans une variable locale
- si non, affecter une valeur par d�faut � cette variable locale
est une op�ration des plus courantes en PHP. Il est donc pr�f�rable de
factoriser tout ce boilerplate une bonne fois pour toutes:
function lire_tableau($tableau, $cle, $defaut) {
if (isset($tableau[$cle])) {
return $tableau[$cle];
}
return $defaut;
}
function lire_requete($cle, $defaut=NULL) {
return lire_tableau($_REQUEST, $cle, $defaut);
}
function lire_get($cle, $defaut=NULL) {
return lire_tableau($_GET, $cle, $defaut);
}
function lire_post($cle, $defaut=NULL) {
return lire_tableau($_POST, $cle, $defaut);
}
function lire_cookie($cle, $defaut=NULL) {
return lire_tableau($_COOKIES, $cle, $defaut);
}
function lire_globale($cle, $defaut=NULL) {
return lire_tableau($GLOBALS, $cle, $defaut);
}
Apr�s quoi ton code devient beaucoup plus simple:
$start = lire_requete('start', 0);
Voili voil�... Une ligne, pas de tests, pas d'erreur, pas de pollution.
HTH
oui et non, je repose sur une confusion pour qui ne commetrait
pas l'erreur - ᅵ savoir ᅵcrirait quelque chose comme:
if (isset($_REQUEST['start']))
$start = $_REQUEST['start'];
if (!isset($start) || is_null($start))
$start = 0;
cela ne semblait pas le cas du PO, j'ai donc prᅵfᅵrᅵ une version
plus simple mais si dᅵcrite comme plus contrainte, elle ᅵvite au
final les erreurs.
> le code suivant serait correct aussi en PHP, bien que $start
> ne soit dᅵfinie que dans des blocs d'accolades [code]
certe, autre ᅵcriture possible mais non spontanᅵe pour le PO.
> N'exagᅵrons rien.
moi, exagᅵrer ?! jamais ... sauf ᅵ chaque fois que ;)
Sylvain.
Non. Il est normal que sur un serveur de prod, les notices
n'apparaissent pas � l'utilisateur. Par contre il est clair que sur un
serveur de dev, au contraire...
> votre machine
> est plus propre, g�n�ralement c'est le contraire.
> dans:
>
> if (isset($_REQUEST['start'])){
> $start = $_REQUEST['start'];
> }
>
> il y a une accolade ouvrante et une fermante, $start est d�fini
> dans ce bloc et donc n'existe plus � la sortie de ce bloc.
Pardon ??? C'est du PHP, pas du C.
> un code (plus) correct est simplement:
>
> $start = 0
> if (isset($_REQUEST['start']))
> $start = $_REQUEST['start'];
Mettre ou enlever les accolades ne change rien au probl�me - et il est
pr�f�rable de les mettre syst�matiquement, pour �viter des erreurs
lorsqu'on ajoute une autre instruction dans la branche.
Quant � d�finir d'abord une valeur par d�faut *puis* a essayer de
r�cup�rer la vraie valeur, c'est une instruction potientiellement
inutile, et �a n'aide pas la lisibilit�.
> le pb est en parti du � la config. de easyphp,
Si easyphp lui affiche les notices, alors c'est la bonne config pour un
poste de dev.
> mais surtout
> du � un code invalide.
Sauf que tu es pass� � c�t� de ce qui �tait invalide, � savoir tester
une variable non d�finie.
> Sylvain.
;-)
Disons qu'il y a des erreurs plus faciles ᅵ comprendre que d'autres. Par
exemple, ᅵ unexpected T_PAAMAYIM_NEKUDOTAYIM ᅵ pourrait laisser songeur
quelqu'un qui ne s'y attendrait pas. Mais aussi, l'interprᅵteur pourrait
signaler une erreur ᅵ la ligne 1000 alors qu'il manque un point-virgule
ᅵ la ligne 970, les lignes intermᅵdiaires contenant des commentaires.
Dans certains cas, la cause (ce qui provoque l'erreur) et l'effet (lᅵ oᅵ
l'erreur est dᅵtectᅵe, et donc ce qui est rapportᅵ dans le message
d'erreur) peuvent effectivement ᅵtre assez distincts. Par exemple, une
accolade manquante au dᅵbut d'un fichier peut n'ᅵtre dᅵtectᅵe qu'ᅵ la
fin dudit fichier.
tu penses quoi de: "toto.php?start=" ?
la valeur numérique zéro serait en tout point interchangeable
avec une chaine vide ?
Sylvain.
entièrement d'accord; mon point était éronné.
> Mettre ou enlever les accolades ne change rien au problème
les premiers problèmes semblent être:
- une analyse partielle du cas par le PO - qui traite le cas
où "start" est posté ou transmis (utiliser $_REQUEST est une
source de confusion supplémentaire) et le cas où il n'est pas
transmis,
- le fait de penser (ou de laisser penser) qu'il n'a pas compris
comment une variable est créée (à partir de quand elle existe).
un rappel sur le fonctionnement des variables dans tous les langages
de script aurait été plus complet que mon raccourci, je suis d'accord;
au dela, j'ai menti, certes, mais juste pour inciter à mieux déclarer
les variables.
> et il est préférable de les mettre systématiquement, pour éviter
> des erreurs lorsqu'on ajoute une autre instruction dans la branche.
hein ? non, si on n'est pas capable de comprendre ce qu'est un bloc
d'instructions, des accolades partout ne soigneront pas cette lacune
au pire cela irait dans le même sens que l'incompréhension initiale
sur la déclaration de la variable.
> Quant à définir d'abord une valeur par défaut *puis* a essayer de
> récupérer la vraie valeur, c'est une instruction potientiellement
> inutile, et ça n'aide pas la lisibilité.
l'argument est trop subjectif pour mériter d'être débattu.
> Sauf que tu es passé à côté de ce qui était invalide, à savoir tester
> une variable non définie.
c'est ce que j'ai indiqué dans mon premier post, tu as du passer
à coté de cette info, ou ?...
Sylvain.
> function lire_get($cle, $defaut=NULL) {
> return lire_tableau($_GET, $cle, $defaut);
> }
>
effectivement mais doit on prendre comme nom lire_get ou charger_get ?
ou plus simplement get_get
de même qu'est il recomandé sur les noms de fonctions ?
get_get ou getGet ou ?
Attention on parle à un "débutant", et il peut ne pas forcément
comprendre ça comme tu le comprendrais.
Il y a des cas _tres_ courants (Les formulaires qui remercient) eux
aussi ou la non initialisation de $_REQUEST est significative (porte une
information).
Genre (rapide, sale et pas testé):
<? if(!isset($_REQUEST)) { ?>
<form>
...
</form>
<? } else { ?>
<p>Merci</p>
<? foo($_REQUEST);} ?>
Si, si, d'ailleurs la plupart des éditeurs de code PHP (et autres Java,
Javascript, etc.) les proposent automatiquement après les déclarations
de test, de boucle, de classe et de fonction.
C'est d'ailleurs, à ma connaissance, le seul moyen de gérer un "folding"
(pliage/dépliage) correct à la lecture d'un source, ce qui est quand
même très pratique (et même essentiel pour les classes).
Pas d'accord ?
Slts, Pascal
"d'accord" sur quel point ?
le fait que le folding soit "essentiel" à l'écriture propre de classes?
et donc que, pendant les dizaines d'années où cela n'existait pas, le
codage était nécessairement non propre et/ou non pratique ?
le folding existe aujourd'hui entre autres sur UEdit 12+, Eclipse,
VS2005+, trois éditeurs que j'utilise et pour lesquel ce folding
ne fonctionne pas correctement, je ne l'utilise donc nul part,
comme je n'ai pas non plus l'habitude de taper des parenthèses
inutiles.
prétendre qu'"il est préférable de les mettre systématiquement"
est juste une ineptie ou une affirmation gratuite; savoir si
d'aucun préfère ou non en mettre systématiquement ne regarde que
lui et son style d'écriture (en supposant que le code n'est ni
élaboré, ni maintenu en équipe), en discuter à dès lors peu
d'intérêt.
Sylvain.
Pas propre, je ne sais pas, ça dépend trop de la puissance de l'éditeur
et de la taille des scripts.
Par contre, moins pratique, je le crois sincèrement, mais on ne va pas
se bouffer le nez là-dessus.
> le folding existe aujourd'hui entre autres sur UEdit 12+, Eclipse,
> VS2005+, trois éditeurs que j'utilise et pour lesquel ce folding
> ne fonctionne pas correctement, je ne l'utilise donc nul part,
> comme je n'ai pas non plus l'habitude de taper des parenthèses
> inutiles.
J'utilise couramment Eclipse, et aussi Notepad++ en appoint.
Les deux gèrent très bien le folding, mais pour Eclipse ça dépend quels
modules sont installés. Après être passé par PHPEclipse, qui le gérait
déjà, j'utilise maintenant Eclipse-PDT qui est suffisamment au point, et
le folding ne pose pas de problème.
Ensuite je ne "tape" pas les accolades, elles se mettent toutes seules,
alors je ne vais pas jusqu'à les enlever par plaisir ou par principe,
quand même.
> prétendre qu'"il est préférable de les mettre systématiquement"
> est juste une ineptie ou une affirmation gratuite; savoir si
> d'aucun préfère ou non en mettre systématiquement ne regarde que
> lui et son style d'écriture (en supposant que le code n'est ni
> élaboré, ni maintenu en équipe), en discuter à dès lors peu
> d'intérêt.
Par contre, le folding est surement sensible au style d'écriture.
Je ne parle pas de qualité, mais seulement de "formats" utilisés.
Par exemple, la place des accolades est déterminante, il vaudra mieux
écrire :
if( ...test... ) {
...code...;
}
que :
if( ...test... )
{
...code...;
}
et, sans accolades, ni :
if( ...test... )
...code...;
pas plus que :
if( ...test... ) ...code...;
ne permettrons un folding correct.
C'est encore plus vrai lorsqu'on utilise un outil de documentation,
comme PHPDocumentor ou Doxygen par exemple, qui fera n'importe quoi si
on ne respecte pas certaines contraintes de formes.
Voilà, ce sont des arguments auxquels on adhère ou pas, mais ils
existent. D'ailleurs Zend encourage ces pratiques.
Mais, personnellement, si je n'ai pas à reprendre le code derrière, je
me tape aussi complètement de savoir comment fait untel ou tel autre
avec ses blocs ! ;-)
Cordialement,
Pascal