Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

config PHP pour images ?

16 réponses
Avatar
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
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

10 réponses

1 2
Avatar
Sylvain SF
alainL a écrit :

J'ai installé un script qui fonctionne sur le site distant 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-7wwwessaisalcayindex.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.
Avatar
Olivier Miakinen
Le 02/10/2008 21:58, alainL a écrit :

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... :



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-7wwwessaisalcayindex.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.
Avatar
Olivier Miakinen
Le 03/10/2008 00:49, Sylvain SF a écrit :

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 ''.

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.
Avatar
Sylvain SF
Olivier Miakinen a écrit :

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.

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.
Avatar
Bruno Desthuilliers
alainL a écrit :
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-7wwwessaisalcayindex.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.

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
Avatar
Bruno Desthuilliers
Sylvain SF a écrit :
alainL a écrit :

J'ai installé un script qui fonctionne sur le site distant 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-7wwwessaisalcayindex.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...

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.


Avatar
Mihamina Rakotomandimby
Olivier Miakinen wrote:
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?
Avatar
Olivier Miakinen
Le 03/10/2008 15:13, Mihamina Rakotomandimby a écrit :

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.
Avatar
Bruno Desthuilliers
Mihamina Rakotomandimby a écrit :
Olivier Miakinen wrote:
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.
Avatar
Sylvain SF
Bruno Desthuilliers a écrit :

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);
}

Après quoi ton code devient beaucoup plus simple:

$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.
1 2