Discussion:
config PHP pour images ?
(trop ancien pour répondre)
alainL
2008-10-02 19:58:57 UTC
Permalink
Bonsoir,

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
Sylvain SF
2008-10-02 22:49:25 UTC
Permalink
J'ai installé un script qui fonctionne sur le site distant mais
produit des erreurs en local. Voici la première, je pense que
Notice: Undefined variable: start in
e:\easyphp1-7\www\essais\alcay\index.php on line 89
function
affichimgs(...){
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 ?
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.
Olivier Miakinen
2008-10-02 23:04:43 UTC
Permalink
Post by Sylvain SF
le serveur distant est mal configuré et permissif, votre machine
est plus propre, généralement c'est le contraire.
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 ''.
Post by Sylvain SF
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++.
Post by Sylvain SF
$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.
}
Post by Sylvain SF
le pb est en partie dû à la config. de easyphp, mais surtout
dû à un code invalide.
N'exagérons rien.
Sylvain SF
2008-10-03 13:13:07 UTC
Permalink
Post by Olivier Miakinen
Post by Sylvain SF
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++.
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.
Post by Olivier Miakinen
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.
Post by Olivier Miakinen
N'exagérons rien.
moi, exagérer ?! jamais ... sauf à chaque fois que ;)

Sylvain.
Bruno Desthuilliers
2008-10-03 13:13:07 UTC
Permalink
Post by Sylvain SF
J'ai installé un script qui fonctionne sur le site distant mais
produit des erreurs en local. Voici la première, je pense que
Notice: Undefined variable: start in
e:\easyphp1-7\www\essais\alcay\index.php on line 89
function affichimgs(...){ 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 ?
le serveur distant est mal configuré et permissif,
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...
Post by Sylvain SF
votre machine
est plus propre, généralement c'est le contraire.
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.
Post by Sylvain SF
$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é.
Post by Sylvain SF
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.
Post by Sylvain SF
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.
Post by Sylvain SF
Sylvain.
Sylvain SF
2008-10-04 23:06:13 UTC
Permalink
Post by Bruno Desthuilliers
Post by Sylvain SF
le serveur distant est mal configuré et permissif,
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...
entièrement d'accord; mon point était éronné.
Post by Bruno Desthuilliers
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.
Post by Bruno Desthuilliers
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.
Post by Bruno Desthuilliers
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.
Post by Bruno Desthuilliers
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.
Pascal PONCET
2008-10-05 16:27:14 UTC
Permalink
Post by Sylvain SF
Post by Bruno Desthuilliers
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.
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
Sylvain SF
2008-10-05 21:21:33 UTC
Permalink
Post by Pascal PONCET
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 ?
"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.
Pascal PONCET
2008-10-07 00:22:48 UTC
Permalink
Post by Sylvain SF
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 ?
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.
Post by Sylvain SF
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.
Post by Sylvain SF
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

Olivier Miakinen
2008-10-02 22:49:25 UTC
Permalink
Post by alainL
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
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.
Post by alainL
______________________________________________________________________________________________
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.
Post by alainL
------------------------------------------------------------------------------------------------
<?
function
affichimgs($nblignes,$larimage,$hautimage,$nbcols,$url,$urlancien,$redimvoz,$cadrak,$epaiscadretable,$coulcadretable){
Jusqu'à présent, la variable $start n'est pas encore définie.
Post by alainL
if (isset($_REQUEST['start'])){
$start = $_REQUEST['start'];
Ici, la variable $start est définie, mais *uniquement* si
$_REQUEST['start'] était définie.
Post by alainL
}
Et donc ici, dans le cas où $_REQUEST['start'] n'existe pas, $start
n'existe pas non plus.
Post by alainL
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.
Mihamina Rakotomandimby
2008-10-03 13:13:07 UTC
Permalink
Post by Olivier Miakinen
Au fait, l'erreur était bien celle indiquée : la variable start n'est
pas définie quand tu l'utilises à la ligne 89.
Y a t il des cas ou l'erreur n'est pas celle indiquée?
Olivier Miakinen
2008-10-03 13:28:39 UTC
Permalink
Post by Mihamina Rakotomandimby
Post by Olivier Miakinen
Au fait, l'erreur était bien celle indiquée : la variable start n'est
pas définie quand tu l'utilises à la ligne 89.
Y a t il des cas ou l'erreur n'est pas celle indiquée?
;-)

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.
Bruno Desthuilliers
2008-10-03 18:38:02 UTC
Permalink
Post by Mihamina Rakotomandimby
Post by Olivier Miakinen
Au fait, l'erreur était bien celle indiquée : la variable start n'est
pas définie quand tu l'utilises à la ligne 89.
Y a t il des cas ou l'erreur n'est pas celle indiquée?
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.
Bruno Desthuilliers
2008-10-03 13:13:07 UTC
Permalink
Post by alainL
Bonsoir,
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
______________________________________________________________________________________________
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
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.
Post by alainL
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
Sylvain SF
2008-10-04 23:06:13 UTC
Permalink
Post by Bruno Desthuilliers
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);
}
$start = lire_requete('start', 0);
tu penses quoi de: "toto.php?start=" ?

la valeur numérique zéro serait en tout point interchangeable
avec une chaine vide ?

Sylvain.
BertrandB
2008-10-04 23:06:13 UTC
Permalink
Post by Bruno Desthuilliers
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 ?
Rakotomandimby (R12y) Mihamina
2008-10-04 23:06:13 UTC
Permalink
[...] opération des plus courantes en PHP. Il est donc préférable de
factoriser tout ce boilerplate une bonne fois pour toutes
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);} ?>
Continuer la lecture sur narkive:
Loading...