IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Contrôle de la balise "file" non tenue en compte avec d'autre données sur un formulaire PHP


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    visiteur
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : visiteur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Par défaut Contrôle de la balise "file" non tenue en compte avec d'autre données sur un formulaire PHP
    Bonjour à tous me revoilà pour une question et pour comprendre le fonctionnement de mon script qui n'est pas au point...

    voici mon souci...

    Actuellement je suis sur la création d'un site, qui contient une galerie photos.
    J'ai une page de gestion qui me permet d'uploader multiples images en une seule requête dans une BDD. (mais le contrôle des fichiers ne travail pas correctement...)
    Nom : for-l1.PNG
Affichages : 408
Taille : 4,6 Ko

    ici le script de contrôle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    else if($choix == 'newgal'){
             if(isset($_POST['nomdos'], $_FILES['photo']) && !empty($_POST['nomdos']) && !empty($_FILES['photo'])){
    		require('galeries-ctrl.php');
    		if($_SESSION['erreurs_albums'] == 0){
    			$nomdos = "".ucfirst(preg_replace('/\s/ ', '-', $_POST['nomdos']))."";
    			$dossier = 'mes-albums/';
    			$taille_maxi = 500000000;
    			$extensions = array('jpeg','png','gif','jpg');
    			if(!is_dir($dossier.$nomdos)){
    				mkdir($dossier.$nomdos);
    				require('../includes/PDO.php');
    				$req = "INSERT INTO `galeries` (`dossier`, `imgs`) VALUES (?,?)";
    				$sql = $pdo->prepare($req);
    				for($i=0; $i < count($_FILES['photo']['name']); $i++){
    					$image = basename($_FILES['photo']['name'][$i]);
    					$img_tmp = $_FILES['photo']['tmp_name'][$i];
    					$taille = filesize($_FILES['photo']['tmp_name'][$i]);
    					$extension = strtolower(substr(strrchr($_FILES['photo']['name'][$i],'.'),1));
    
    					if($taille == ''){ $image = ''; $erreur = 'Image '.$i.' manquante !';}
    
    					if(!in_array($extension, $extensions)) $erreur = 'Votre image '.$i.' n\'a pas l\'extention<br>TYPE: png, gif, jpg, jpeg !';  
                                            //* Si j'envois le formulaire avec la balise file vide, c'est ce message qui apparaît ! Alors que ca devrai être le contrôle au dessus...
    
    					if($taille>$taille_maxi) $erreur = 'Votre image '.$i.' est trop lourde !';
    
    					if($img_tmp > 1) $erreur = 'Maximum 1 photos par dossier !';
                                            //* Si j'envois le formulaire avec la balise file avec plusieurs photos, ce message qui n'apparaît pas !
    					if(!isset($erreur)){
    						$image = strtr($image,'ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËéèêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ','AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn');
    						$image = preg_replace("/[^a-z0-9\_\-\.]+$/","",strtolower($image));
    						$send = move_uploaded_file($img_tmp, $dossier.$nomdos.'/'.$image);
    						$sql->execute(array($nomdos, $image));
    					}
    					else{
    						$informations = Array(
    										true,
    										'Oupss !',
    										'Oupss !<br><br>'.$erreur.'',
    										'',
    										ROOTPATH.'/galeries/gestion-galeries.php?cat=galeries&choix=newgal',
    										3
    										);
    						require_once('../info-bulle.php');
    						exit();
    					}
    					if(!$send){
    						$informations = Array(
    										true,
    										'Oupss !',
    										'Oupss !<br><br>Téléchargement des images échoué !',
    										'',
    										ROOTPATH.'/galeries/gestion-galeries.php?cat=galeries&choix=newgal',
    										3
    										);
    						require_once('../info-bulle.php');
    						exit();
    					}
    				}
    Idem sur une autre page de contrôle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if($img_tmp > 3) $erreur = 'Maximum 3 photos par articles !';
    a l'inverse que si je selectionne 1-3 images le message d'erreur du nombres s'affiche... et que j'en selectionne 4 ou + aucun message s'affiche...

    voilà une petite idée de mon problème ?

    pour précision le formulaire et le contrôle se passe sur la même page en POST (et GET autres donnees)...

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Le problème c'est que ta succession de ifs dans ta boucle for devrait être un if (cond1) ... elseif (cond2) ... elseif(cond3). De cette manière lorsqu'une condition est satisfaite (donc quand il y a une erreur), les autres conditions ne sont pas testées et on reste sur l'erreur initiale.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    Un coup d'oeil rapide à ce code montre déjà un truc qui va pas:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $img_tmp = $_FILES['photo']['tmp_name'][$i];
    Ici on récupère donc un string, qui correspond au nom d'un fichier temporaire. Jusque-là pas de problème.

    Mais alors ce genre de truc n'a pas de sens, vous ne pouvez pas traiter un string comme un nombre et faire ce genre de comparaison:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    if($img_tmp > 1) $erreur = 'Maximum 1 photos par dossier !';

    Pour compter le nombre de fichiers envoyés, vous devriez pouvoir simplement faire un truc comme ça (à tester):

    Il y a quand même beaucoup de choses à améliorer dans ce script, comme vérifier le retour de la fonction move_uploaded_file.

    Vu que l'upload de fichier est une opération sensible qui peut poser un risque de sécurité si c'est mal implémenté, je vous conseillerais plutôt d'utiliser une librairie third party éprouvée, voir par exemple mon post pour ne pas me répéter: https://www.developpez.net/forums/d2.../#post11943840.
    C'est quand même beaucoup de travail pour réinventer la roue, donc la valeur ajoutée est limitée à part la valeur éducative. A condition que ça marche, que ce soit fiable, et que ça ne crée pas une faille de sécurité.

  4. #4
    Membre averti
    Homme Profil pro
    visiteur
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : visiteur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Par défaut
    Bonsoir et désolé du retard pour ma réponse...

    Merci à vous @binarygirl et @CosmoKnacki de vos réponses.

    @binarygirl :
    Petites précision pour ces scripts ce sera que l'administrateur du site qui aura droits à l'accès de ces pages. Donc pas besoins de grosses sécuritées pour les uploads.
    (plutôt dans le sens que l'admin ne crée pas du n'importe quoi...(dossiers, doublures images, et surcharger la base de données).

    Je n'ai pas tout mis le script mais j'ai aussi un contrôle du move_uploaded_file() idem pour l'insertion dans la base de données.

    @CosmoKnacki
    Alors j'ai testé votre raisonnement des conditions mais celà ne marche toujours pas...
    En tenant compte d'y inséré un count($_FILES) en extérieur de la boucle for mais ils m'affiche quand même les erreurs interne de ma boucle for...
    photo:
    Nom : scr-s1.PNG
Affichages : 385
Taille : 57,8 Ko

    Puis j'ai juste essayé ce petit code pour voir juste le retour... ben c'est un peu la cak...
    Nom : scr-s2.PNG
Affichages : 380
Taille : 15,6 Ko

    Voilà le résultat alors que je n'ai pas envoyé de fichier...
    Nom : result-test.PNG
Affichages : 371
Taille : 3,9 Ko

    Du coup je me demandais si le faite que je $_POST le formulaire sur la même page poserai des soucis avec le type files ?? Ou requête avant ??

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Alors merci de ne pas poster de copies d'écran, ce qui prend au moins deux fois plus de place que du texte et qui n'est pas éditable, mais bien du code entre les balises idoines.

    Ton code contient pas mal d'erreurs, mais avant tout attache toi à simplifier la structure pour éviter les cascades d'imbrications de if. Tu pourrais utiliser les exceptions avec un gestionnaire.

    ps: ton strtr ne marchera jamais, tu ne peux pas associer un caractère sur deux octets comme À avec un caractère sur un octet comme A, sauf si tu utilises l'autre syntaxe de strtr avec un tableau associatif.

  6. #6
    Membre averti
    Homme Profil pro
    visiteur
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : visiteur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Par défaut Enfin fonctionnel !
    Bonjour,

    Après quelques jours de bourrage de crâne (j'ai quelques cheveux blanc en plus !)...

    Mon script n'est pas au top... mais fonctionnel en tant qu'admin d'un site. (Sécurisation plus poussé à développer si pour le publique !)

    Je m'était basé sur le tuto de https://antoine-herault.developpez.c...ls/php/upload/.

    Mon script formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <form action="" method="post" enctype="multipart/form-data">
              <div align="left">
                    <label for="img" class="text-formulaire">Images (max. 3 photos)</label><br>
    		<input type="hidden" name="MAX_FILE_SIZE" value="500000000"/>
    		<input type="file" id="img[]" name="img[]" class="but-files-hidden" multiple style="padding-left:0.5vw;"/>
              </div>
              <div class="pad-1v" align="center">
                    <input type="submit" class="brd-radius pad-05v" value="Enregister"/>
              </div>
    </form>
    Mon script control et upload :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    $allouer = [
           "jpg" => "image/jpeg",
           "jpeg" => "image/jpeg",
           "png" => "image/png"
    ];
           foreach($_FILES['img']['error'] as $key => $value){
                 if($_FILES['img']['name'][$key] != ''){
                      if($value == 0){
                              $filename = $_FILES['img']['name'][$key];
                              $filetype = $_FILES['img']['type'][$key];
                              $filesize = $_FILES['img']['size'][$key];
                              $filetmpo = $_FILES['img']['tmp_name'][$key];
                              $filenbrs = $filename?count($_FILES['img']['name']):1;
                              $extension = pathinfo($filename, PATHINFO_EXTENSION);
     
                              if(!array_key_exists($extension, $allouer) || !in_array($filetype, $allouer)){// Check les extensions des fichiers.
                                     $erreur = 'Le format du fichier est incorrect !';
                              }
                              if($filenbrs > 3){ // Nombre des images souhaitées.
                                     $erreur = 'Maximum 3 images par articles !';
                              }
                              if($filesize > 500000000){ // Contrôle le poids des fichiers.
                                     $erreur = 'Fichier trop volumineux !';
                              }
                       }
                       else{
                            $erreur = 'Fichier endommagé !';
                       }
                }
                else{
                      $erreur = 'Fichier manquant !';
                }
                if(!isset($erreur)){
                      $filename = strtr($filename,'ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËéèêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ','AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn');
                      $filename = preg_replace("/[^a-z0-9\_\-\.]+$/","",strtolower($filename));
                      $send = move_uploaded_file($filetmpo, $nomdos.$filename); // Ici on configure le chemin d\'accés pour enregistrer les fichiers.
                }
                else{
                     echo $erreur; // Affiche les erreurs du formulaires !
                }
                if($send){
                      // Upload des fichiers réussi !
                }
                else{
                     // Erreur de l\'envois !
                }
          }
          else{}
    Discution marquée comme résolue !

    Un grand merci à vous membres de Developpez.net et pour tout vos conseils et temps consacrés.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. modification non prise en compte avec PDO
    Par kate59 dans le forum Langage
    Réponses: 7
    Dernier message: 30/09/2010, 15h02
  2. CSS non prise en compte avec un innerHTML
    Par Thewil dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/05/2009, 09h11
  3. Commentaires conditionnels non pris en compte avec IE 6
    Par oranjade dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 13/11/2008, 10h10
  4. Evenement onChange non pris en compte avec valeur préenregistrée
    Par Loizo dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 31/01/2008, 13h42
  5. Réponses: 19
    Dernier message: 01/02/2007, 12h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo