Page 1 sur 4

un "notice" à effacer

Posté : 05 mars 2010, 17:10
par diabless6
Bonjour,

Je suis sur un listing de mon bouquin et en vérifiant mon code je n'ai pas fait d'erreur. En recherchant sur le forum, j'ai trouvé que je pouvais désactiver le error_reporting = E_ALL ^ E_NOTICE, mais c'est pas bien.

J'ai aussi trouvé la solution de mettre des @ là ou ya ça me gène, mais c'est s'en doute pas bien aussi. Mais j'aime bien les choses pas jolie jolie :mrgreen:

Donc, j'ai cette petite erreur :
Notice: Undefined index: fichier in C:\UwAmp\www\Php\2Jean Engels\9formulaires3.php on line 26

Notice: Undefined index: fichier in C:\UwAmp\www\Php\2Jean Engels\9formulaires3.php on line 29
 <form action="<?php $_SERVER['PHP_SELF'] ?>" method="post" enctype="multipart/form-data">
   <fieldset>
    <input type="hidden" name="MAX_FILE_SIZE" value="900000"/>
    <legend>Transfert de fichier</legend>
    <input type="file" name="fichier" accept="image/jpeg" />
    <input type="submit" value="Uploader"/>
    </fieldset>
   </form>
<?php

if (isset($_FILES['fichier']))
{
    echo'Taille max authorisée :'.$_POST['MAX_FILE_SIZE'].' octets<br/>';
    echo'clés & valeurs du tableau: ';
    foreach($_FILES['fichier'] as $cle=>$val)
    {echo '<ul><li>'.$cle.' = '.$val.'</li></ul>';}
  
}
$result=move_uploaded_file($_FILES['fichier']['tmp_name'],'imagephp.jpg');  (erreur ici)
if ($result==true)
{echo '<br/><big>Transfert Ok!</big><br/>';}
else {echo'<br/> Erreur de tranfert ! n°:'.$_FILES['fichier']['error'];}   (erreur ici)

?>
Je pense que ça vient que ma variable $_FILES['fichier'] est vide car quand je réalise l'upload les "notices" s'en vont.

merci

Re: un "notice" à effacer

Posté : 05 mars 2010, 17:20
par Dr@ke
Quand tu affiches la page sans poster, eh bien il n' existe aucune variable $_POST.

Donc, faut les vérifier avec un isset():
(de préférence avant tout autrechose)
if (isset($_POST['MAX_FILE_SIZE']))
De plus ton accolade qui ferme ton premier if (celui avec les isset()) est bien trop haute à mon avis...
Sinon effectivement, tes variables pourront ne pas être définis étant en dehors de ton isset()...

Et ton move_uploaded_file s'exécuter malgré qu'aucun poste ne soit effectué...

Re: un "notice" à effacer

Posté : 05 mars 2010, 17:45
par diabless6
Alors donc c'est une question d'emplacement:
if (isset($_FILES['fichier']))
{
    echo'Taille max authorisée :'.$_POST['MAX_FILE_SIZE'].' octets<br/>';
    echo'clés & valeurs du tableau: ';
    foreach($_FILES['fichier'] as $cle=>$val)
    {echo '<ul><li>'.$cle.' = '.$val.'</li></ul>';}
$result=move_uploaded_file($_FILES['fichier']['tmp_name'],'imagephp.jpg');
if ($result==true)
{echo '<br/><big>Transfert Ok!</big><br/>';}
else {echo'<br/> Erreur de tranfert ! n°:'.$_FILES['fichier']['error'];}
}
?>
Là ça fonctionne bien. Ya aucun message.
Merci bien :wink:

Re: un "notice" à effacer

Posté : 05 mars 2010, 17:57
par Dr@ke
Sauf que tu ne fais aucune vérification isset() sur $_POST['MAX_FILE_SIZE'].

Tu me diras, cela n'est pas grave, car je te conseille vivement de l'enlever de ton formulaire.
Donc enlève ceci:
<input type="hidden" name="MAX_FILE_SIZE" value="900000"/>
Car un utilisateur mal intentionné pourrait facilement modifier cette donnée.

Tu peux par exemple utiliser une constante:
define('MAX_FILE_SIZE' 900000);
De plus tu ne fais aucune vérification de la taille du fichier dans ton script.
Tu devrais donc ensuite comparer la taille du fichier avec la constante MAX_FILE_SIZE.
if ($_FILES['fichier']['size'] <= MAX_FILE_SIZE) // si la taille est inférieur au maximum autorisé

Re: un "notice" à effacer

Posté : 05 mars 2010, 18:01
par Yosh
Et utiliser

ini_set ( "upload_max_filesize", "20M");

C'est pas mieux?

Re: un "notice" à effacer

Posté : 05 mars 2010, 18:04
par Dr@ke
Si aussi, le principal ici, est de ne pas se fier à un champ INPUT pour la taille maximale du fichier.

Puis la modification des php.ini n'est pas toujours possible.

De plus si tu as plusieurs scripts Upload ou plusieurs types de fichiers a uploader suivant une taille définie pour chaque type, au lieu de modifier le php.ini au risque de faire bugguer l'upload d'un autre utilisateur....

Re: un "notice" à effacer

Posté : 05 mars 2010, 18:40
par diabless6
Ha oui effectivement on peut bidouiller le Hidden, c'est marqué dans la suite de mon livre.

Juste que le code n'était pas bien tourné et ça m'a donné ces "notices" alors je me suis affolée.

Donc le Hidden, je le supprime, faut tout le temps se remettre en question, c'est pénible :roll:

J'ai modifié:
define('MAX_FILE_SIZE',90000);//constante taille max upload
if (isset($_FILES['fichier']) && $_FILES['fichier']['size'] <= MAX_FILE_SIZE)
{
    echo'Taille max authorisée :'.$_FILES['fichier']['size'].' octets<br/>';
    echo'clés & valeurs du tableau: ';
    foreach($_FILES['fichier'] as $cle=>$val)
    {echo '<ul><li>'.$cle.' = '.$val.'</li></ul>';}
$result=move_uploaded_file($_FILES['fichier']['tmp_name'],'imagephp.jpg');
if ($result==true)
{echo '<br/><big>Transfert Ok!</big><br/>';}
else {echo'<br/> Erreur de tranfert ! n°:'.$_FILES['fichier']['error'];}
}
J'ai juste un petit hic, si la taille du fichier est >90 000 mon else "erreur $_FILES...[error] ne s'affiche pas. Et si je le met à l'extérieur de mon IF, je vais ravoir mes "notices" #-o

Re: un "notice" à effacer

Posté : 05 mars 2010, 18:48
par Dr@ke
Bon désolé, en fait tu peux le laisser, car la majorité des navigateurs et php sont censés le prendre en compte.
Donc cela peut aider.

La seule chose a savoir, c'est que ce n'est pas une valeur à laquelle il faut te fier.

Donc ensuite:
Si tu peux modifier ton fichier php.ini, et bien fais comme disait Yosh mais en mettant ta propre valeur maximale de taille.

Si tu ne peux pas le modifier, et bien prends exemple sur mon post, pour vérifier la taille dans ton script, mais en utilisant une constante et donc en utilisant pas la valeur du champ hidden..

Re: un "notice" à effacer

Posté : 05 mars 2010, 19:00
par diabless6
Le ini_set ( "upload_max_filesize", "20M");

ça modifie la valeur par defaut du php.ini ?

J'ai essayé : ini_set ( "upload_max_filesize", "5K");

mais ça n'a pas changer dans mon Phpinfo() :
upload_max_filesize 2M 2M

Re: un "notice" à effacer

Posté : 05 mars 2010, 19:13
par diabless6
j'ai essayé comme ça : ( "upload_max_filesize", "90000"); ou ( "upload_max_filesize", "0.9M");

ça fait rien du tout !

Donc c'est inutile de modifier cette directive. Le PHP est plus judicieux.

Re: un "notice" à effacer

Posté : 05 mars 2010, 19:19
par Dr@ke
Oui,
ini_get() pour lire le php.ini
http://php.net/manual/fr/function.ini-get.php

in_set() pour modifier le php.ini
http://php.net/manual/fr/function.ini-set.php

Tu peux tester:
<?php
echo 'Ancienne valeur: ' . ini_get('upload_max_filesize') . '<br>';
ini_set('upload_max_filesize', '20M');
echo 'Nouvelle valeur: ' . ini_get('upload_max_filesize');
?>
PS:
900000 c'est beaucoup beaucoup trop :wink:


http://www.manuelphp.com/php/ini.upload ... lesize.php
En octets, donc à moins que je me montre mais 90000 = 90M
Et donc: 900000 = 900M

Re: un "notice" à effacer

Posté : 05 mars 2010, 19:45
par diabless6
oui mais chez moi, ça ne marche pas.
Je crois que ça vient de ça : http://www.php.net/manual/fr/configuration.changes.php
Soit le PHP est executer via Apache avec un module ou en CGI ,j'espère que jdit pas de conneries :roll:

Re: un "notice" à effacer

Posté : 05 mars 2010, 19:49
par Dr@ke
Non :wink:

Donc , tu pourrais peut-être utiliser le fichier htaccess mais bon, autant ne pas se compliquer la vie.
Fais ta vérification en php comme j'expliquais dans mes premiers posts, ensuite il faut toujours tester, tu mets un petit maximum et tu essayes d'envoyer plus gros, dans un premier temps sans la balise hidden.
Quand tout fonctionne bien, tu remets la balise hidden avec la même valeur que ta vérification en php :wink:

[EDIT]
Désolé je corrige:
Tu laisses la balise hidden mais pour bien tester ta vérification en php, tu mets une plus grosse valeur dans la balise hidden.
Ensuite t'essayes d'uploader un fichier plus gros que ta vérification php mais plus petit que ton hidden.
Quand tout fonctionne, remets la même valeur dans la balise hidden.

Re: un "notice" à effacer

Posté : 05 mars 2010, 20:04
par diabless6
oui, je vais pas trop me compliquée la vie sinon j'avancerai jamais :mrgreen:

Merci bien, je prends note :wink:

Re: un "notice" à effacer

Posté : 05 mars 2010, 20:54
par Dr@ke
Tout en gardant à l'esprit que si tu désires permettre l'upload de fichiers avec des tailles plus importantes que celle définit dans ton fichier php.ini, tu seras obligé dans ce cas de modifier le php.ini pour que cela fonctionne.

Le plus simple à mon avis serait de demander au support de ton hébergeur si cela est possible et comment...

Mais dans la majorité des cas, cela n'est pas nécessaire et pas forcément une bonne idée.
En général, cela ce limite plutôt a diminuer cette valeur en fonction des fichiers qui sont censés être uploadés.
Et donc dans ce cas, la méthode que je te montrais plus haut, fonctionnera :wink:

PS:
Sinon je n'avais pas vue mais il y a un tutoriel intéressant ici:
faq-tutoriels/upload-fichiers-par-http-t545.html