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 :

Écrasement photo avec mise à jour membre [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de monlou
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2010
    Messages : 363
    Par défaut Écrasement photo avec mise à jour membre
    Bonjour,
    j'ai 2 petits problèmes avec mon script Update membre

    1-quand un utilisateur vient faire une modification a son profil et qu'il ne met rien dans la case photo, le traitement update vient écraser et effacer l'ancienne inscription photo dans la table.


    2- Dans mon script function insertPhoto()
    j'ai une restriction limite a 200K mais voila que si un membre ajoute une photo depassant 200k, le traitement update se fait quand meme et inscrit le nom de la photo dans la table mais elle n'est pas Uploader dans ../images.

    j'aimerais bien savoir comment je pourrais améliorer mon code pour la bonne gestion des upolad photos dans mon Update membre.

    merci

    je vous mets ici le script photo du formulaire: mod_voiturier.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <p>    
          <label for="photo">Modifier une photo</label>
          <input type="hidden" name="MAX_FILE_SIZE"  value="200000" />
          <input type="file" name="photo" id="photo" value="<?php echo $info['photo'];?>" />
        </p>
    et update_voiturier.php

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    <?php
     
    function insertPhoto() {
      if (isset($_FILES['photo'])) 
        {
     
          $fichier = basename($_FILES['photo']['name']);
          $taille_maxi = 200000;
          $taille = filesize($_FILES['photo']['tmp_name']);
          $extensions = array('image/png', 'image/gif', 'image/jpg', 'image/jpeg', 'image/bmp');
          //$extension = strrchr($_FILES['photo']['name'], '.');
          $extension = $_FILES['photo']['type'];
          //Début des vérifications de sécurité...
     
          if($_FILES['photo'] ['error'] != 0)
    	{
    	  echo ' une erreur est rencontree !';
    	  echo $_FILES['photo']['error'];
    	}
          elseif(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
    	{
    	  echo 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, ou bmp...';
    	}
          elseif($taille>$taille_maxi)
    	{
    	  echo 'Erreur!! Le fichier depasse 200 K...';
    	}
          else // s'il n'y a pas d'erreur on upload!
    	{
    	  //On formate le nom du fichier ici...
    	  $fichier = strtr($fichier, 
    			   'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
    			   'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    	  $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier)or die(mysql_error());
    	  $dossier = '../images/'or die(mysql_error());
    	  if(move_uploaded_file($_FILES['photo']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
    	    {
    	      echo 'Upload effectué avec succès !';
    	    }
    	  else //Sinon (la fonction renvoie FALSE).
    	    {
    	      echo 'Echec de l\'upload !';
    	    }
     
    	}
        }
    }
     
     function checkForm() {
       if ($_POST['email'] != "" &&
           $_POST['pseudo'] != ""
          ) {
         return true;
       }
     
       return false;
     }
     
    function updateVoiturier() {
      if (isset($_FILES['photo'])) {
        $photo = mysql_real_escape_string(htmlspecialchars($_FILES['photo']['name']));  
      } else {
        $photo = '';
      }
      $nom = mysql_real_escape_string(htmlspecialchars($_POST['nom']));
      $prenom = mysql_real_escape_string(htmlspecialchars($_POST['prenom']));
      $adresse = mysql_real_escape_string(htmlspecialchars($_POST['adresse']));
      $ville = mysql_real_escape_string(htmlspecialchars($_POST['ville']));
      $pays = mysql_real_escape_string(htmlspecialchars($_POST['pays']));
      $province = mysql_real_escape_string(htmlspecialchars($_POST['province']));
      $code_postal = mysql_real_escape_string(htmlspecialchars($_POST['code_postal'])); 
      $telephone = mysql_real_escape_string(htmlspecialchars($_POST['telephone']));
      $cellulaire = mysql_real_escape_string(htmlspecialchars($_POST['cellulaire']));
      $occupation = mysql_real_escape_string(htmlspecialchars($_POST['occupation']));
      $sexe = mysql_real_escape_string(htmlspecialchars($_POST['sexe']));
      $annee = mysql_real_escape_string(htmlspecialchars($_POST['annee']));
      $mois = mysql_real_escape_string(htmlspecialchars($_POST['mois']));
      $jour = mysql_real_escape_string(htmlspecialchars($_POST['jour']));
      $date_naissance = $annee . "-" . $mois . "-"  . $jour;
      //$pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
      $email = mysql_real_escape_string(htmlspecialchars($_POST['email']));
      $password = mysql_real_escape_string(htmlspecialchars($_POST['password']));
      $date_inscription = date('Y-m-d');
      $permis_conduire = mysql_real_escape_string(htmlspecialchars($_POST['permis_conduire']));
      $annee_experience = mysql_real_escape_string(htmlspecialchars($_POST['annee_experience']));
      $message    = mysql_real_escape_string(htmlspecialchars($_POST['message']));
     
      $sql="  UPDATE gestion_voiturier 
    	  SET nom =     '" . $nom . "',
                  prenom =  '" . $prenom . "',
                  adresse = '" . $adresse . "',
                  ville = '" . $ville . "', 
                  pays =  '" . $pays . "' ,
                  province = ' " . $province . "',
                  code_postal = '" . $code_postal . "',
                  telephone = '" . $telephone . "',
                  cellulaire = '" . $cellulaire .  "',
                  occupation = '" . $occupation . "',
                  sexe = '" . $sexe . "' ,
                  date_naissance = '" . $date_naissance . "' ,
                  message = '" . $message . "' ,
                  email = '" . $email . "',
                  date_inscription = '" . $date_inscription . "',
                  photo = '" . $photo . "' ,
                  annee_experience = '" . $annee_experience . "',
                  permis_conduire =  '" . $permis_conduire . "' 
               
              WHERE membres_id = " . $_SESSION['membreID'];
     
      echo $sql;
      if (!mysql_query($sql))
        {
          die('Erreur - table gestion_voiturier: ' . mysql_error());
        }
      if (!mysql_query($sql))
      {
        die('Erreur - table voitures:' . mysql_error());
      }
      if (isset($password)) {
        $sql = "UPDATE membres set password = md5('" . $password . "') WHERE id = " . $_SESSION['membreID'];
        mysql_query($sql) or die(mysql_error());
      }
      header( "Location: session_voiturier.php" );
    }
     
    $show_form = true;
    if (isset($_POST['submit'])) {
      if (isset($_POST['email'])) { 
        insertPhoto();
        updateVoiturier();
     
    	die();
      } else {
       die("check pseudo");
      }
    }
    ?>

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    En faite, et en cas d'erreur sur l'upload, tu ne fais que faire des echo retournant un message d'erreur, mais coté requête, tu ne traite pas le cas.
    Du coup, c'est le phénomène que tu remarque.

    D'ailleurs, tu devrais remarquer le même problème sur toutes les autres données.
    Si la personne ne mets pas de nom par exemple, tu vas obtenir un champ vide.

    C'est l'un des points les plus pénible à faire : Vérifier chaque donnée entrante (GET, POST, etc ...), contrôler quelle soit conforme à ce qu'on attend, et traiter le cas (au cas par cas) si elle ne l'ai pas.

    Il ne faut pas mettre à jours le nom de la photo s'il y a une erreur.
    Ca débouche sur (au moins) une alternative.
    Exemple :
    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
     
    <?php
    // On fait en sorte de savoir si l'upload à correctement été fait ou pas
    $insert_photo = insertPhoto();
    //
    $photo = null;
    if ($insert_photo === true) {
        $photo = "photo = '".mysql_real_escape_string(htmlspecialchars($_FILES['photo']['name']))."', ";
    }
     
    //
    $sql = "  UPDATE gestion_voiturier 
    	SET nom =     '" . $nom . "',
    	prenom =  '" . $prenom . "',
    	... etc ...
    	$photo
    	... etc ...
    	WHERE membres_id = " . $_SESSION['membreID'];
    ?>
    Ici, par défaut $photo est initialisé à null, du coup ce champ ne sera pas mise à jour en cas d'erreur.

    Par contre, pour faire il va falloir modifier pas mal de choses, entre autre tes 2 fonctions insertPhoto() et updateVoiturier().


    Aussi, pose toi la question sur le nom de cette photo.
    Si on regarde bien, il risque d'avoir un problème dans le cas où le nom comporte des caractères spéciaux.
    Le nom du fichier enregistré dans la Bdd sera différent de celui déplacé après upload.
    Au niveau du déplacement du fichier, tu fais des remplacements de caractères spéciaux, alors que coté Bdd, tu applique juste un htmlspecialchars(), ce n'est pas synchro.

  3. #3
    Membre éclairé Avatar de monlou
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2010
    Messages : 363
    Par défaut
    merci Runcodephp de ta réponse

    en fait, pour les noms, prenom, etc, je n'ai pas ces problèmes, car lors de l'inscription, j'ai mis des validations javascript obligatoires on blur sur ces champs , ce qui oblige a remplir tous les champs


    et lors du Update, je fais des echos dans tous mes champs de formulaire, ce qui remplit aussi tous les champs par defaut

    mais avec le champ photos, le traitement ne ramene pas la valeur de photo dans la base

    peut-etre qu'il y a une erreur dans ceci a cause que je mets 2 values dans le meme champ


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <p>    
          <label for="photo">Modifier une photo</label>
          <input type="hidden" name="MAX_FILE_SIZE"  value="200000" />
          <input type="file" name="photo" id="photo" value="<?php echo $info['photo'];?>" />
        </p>

  4. #4
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Citation Envoyé par monlou
    en fait, pour les noms, prenom, etc, je n'ai pas ces problèmes, car lors de l'inscription, j'ai mis des validations javascript obligatoires on blur sur ces champs , ce qui oblige a remplir tous les champs
    Non, Javascript, on ne cesse de dire que c'est coté client (navigateur).
    Tu n'as aucun garanti de ce coté, vraiment aucune.
    Le plus important (et de loin), c'est de vérifier les données qui arrivent coté serveur, sinon, tu risque d'obtenir n'importe quoi.
    Javascript dans ce contexte là (formulaire), c'est un petit plus, c'est juste un confort pour la personne en face.
    Bref, le gars en 1er à tout le loisir de désactiver Javascript si ça lui casse les pieds.
    Aussi, tu n'est pas à l'abri de faire une erreur de syntaxe dans ton code JS, une simple étourderie et voilà que les vérifs ne fonctionnent plus.
    Je peux en rajouter des comme ça.


    et lors du Update, je fais des echos dans tous mes champs de formulaire, ce qui remplit aussi tous les champs par defaut
    Lors du Update, d'accord, mais avant ?
    Puis même si tu prévois de pré-remplir le formulaire, la personne peut très supprimer le contenu, ne serait-ce accidentellement.
    Là encore, ce sont des manips coté client dont tu n'a pas grand chose pour garantir quoi que ce soit.

    Bref, tu part du principe que tous le gens auront JS d'activé, que le données qui transiteront du serveur vers le poste client (et inversement) ne soient jamais altérées, que tout fonctionne bien (serveur, internet, modem, le Pc du gars, etc, etc...), que les personnes ne fassent jamais d'erreurs, etc ...
    Ca fait beaucoup de principes


    Pour ce qui est de l'upload de la photo, je pense que tu n'as pas vraiment compris qu'il faut traiter le cas quand tu fais la mise à jours de la Bdd.
    Tu spécifie que l'image ne doit pas dépasser 200000 octets (ce qui fait 195.3125 Kilo Octet soit dit en passant), du coup, ça va déboucher sur une erreur.
    Si tu ne traite pas cette erreur, tu auras obligatoirement une erreur dans la Bdd, ça coule de source.
    Ce n'est pas un problème de HTML, mais de code Php qu'il faudra rajouter.
    SI c'est bon -> On upload + mise à jour du nom
    SINON On ne fait rien (pas de mise à jour sur le nom)

    Ceci quelque soit l'erreur.
    -Erreur de dépassement en Octets
    -Erreur sur le type de fichier
    -Le serveur à mal obtenu les paquets de donnée
    etc, etc ...

    <input type="file" name="photo" id="photo" value="<?php echo $info['photo'];?>" />
    Ceci est inutile. Ce n'est pas parce que tu rajoutera le nom de la photo ici que le navigateur renverra le flux de l'image.
    D'ailleurs, tu n'as aucune main mise de ce coté.
    D'une part, tu ne sauras jamais où se trouve son image sur son PC, de même que la personne peut très bien venir sur ton site d'un autre PC, etc, etc ...

    Toujours le même crédo : Le coté client tu ne le maitrisera jamais, c'est pour ça qu'il faut traiter chaque erreur possible coté serveur.
    Si le gars ne recherche pas sa photo, et bien coté serveur il y aura rien.
    Et bien "rien" ça se gère.
    C'est casse bonbon, mais on a pas le choix. (si tu veux un truc qui fonctionne)


    Donc reprend le code, la logique que je t'ai mis auparavant (ce n'était qu'un exemple).
    As tu compris d'ailleurs l'intérêt de ce code ?

  5. #5
    Membre éclairé Avatar de monlou
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2010
    Messages : 363
    Par défaut
    oui RunCodePhp, je m' rends!!
    merci de me le faire rappeler, je cherchais peut-etre la méthode facile et je suis conscient de l'importance de traiter les erreurs cote serveur.

    il y avait sur un tuto que j'ai deja étudier auparavant une mise en garde qui disait:
    ''Il ne faut jamais faire confiance a l'utilisateur''

    alors, je comprends que je dois modifier mes 2 fonctions insertPhoto() et updateVoiturier().
    si je comprends bien, je dois traiter chacun des champs de mon formulaire
    pour les erreurs d'omissions en plus des attaques sql


    Il ne faut pas mettre à jours le nom de la photo s'il y a une erreur.
    Ca débouche sur (au moins) une alternative.
    Exemple :............

    Ici, par défaut $photo est initialisé à null, du coup ce champ ne sera pas mise à jour en cas d'erreur.

    Par contre, pour faire il va falloir modifier pas mal de choses, entre autre tes 2 fonctions insertPhoto() et updateVoiturier().
    mais la! peux-tu me renseigner sur un tuto qui traite de ce sujet car présentement c'est nouveau pour moi a part la lecture d'un petit script
    CheckForm()

  6. #6
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    il y avait sur un tuto que j'ai deja étudier auparavant une mise en garde qui disait:
    ''Il ne faut jamais faire confiance a l'utilisateur''
    Je suis totalement d'accord sur ce point aussi.
    Il faut adhérer, sinon, c'est un peu se mettre la tête dans le sable (politique de l'autruche).
    Par contre, il faudra à mon sens ne pas tomber non plus dans la paranoïa.
    Mais pour ton code par exemple, il n'en fait pas assez, tu as trop miser, voir tout miser sur JS alors que c'est l'inverse qu'il faut faire en 1er.

    mais la! peux-tu me renseigner sur un tuto qui traite de ce sujet car présentement c'est nouveau pour moi a part la lecture d'un petit script
    CheckForm()
    Je n'ai pas de tuto sous le coude malheureusement, ou alors ça fait trop longtemps.

    A mon sens, et vu que tu débute, il faudrait peut être mettre de coté tes 2 fonctions insert/update provisoirement, et faire les choses dans l'ordre, les unes après les autres.
    Tant pis si ce code se répètera plusieurs fois dans d'autres pages, tu rationaliseras ceci après.

    En 1er, les vérifications sont normalement à faire avant le code HTML, avant le doctype/html/body, ce qui n'est pas le cas de ton coté.
    Faudrait déjà revoir un peu ton principe/structure sur ce plan là, car c'est justement en faisant ainsi qu'on parvient à rationaliser le code, d'automatiser certaines de ces tâches répétitives.

    En faite, il faudrait que ta(es) page(s) ait une structure comme celle ci : (c'est un exemple)
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    <?php
    // ---------- TRAITEMENTS ----------
    // connexion bdd
    $connexion = la_connexion;
    // démarre la session
    session_start();
     
    // On initialise l'action à réaliser
    $action = (isset($_POST['action'])) && !empty($_POST['action'])) ? $_POST['action'] : NULL;
     
    switch ($action) {
        case 'update' : // Mise à jour des données de l'utilisateur
            $erreur = false;
     
            // On vérifie les données
            if (isset($_POST['nom']) && !empty($_POST['nom'])) {
                $nom = $_POST['nom'];
            }
            else {
                $erreur = true;
                $msgErreur[] = 'Veuillez saisir votre nom';
            }
            //
            if (isset($_FILES['photo']) && !empty($_FILES['photo'])) {
                if ($_FILES['photo']['error'] > 0) {
                    switch ($_FILES['photo']['error']) {
                        case 1 : $msgErreur[] = 'Le fichier téléchargé excède la taille de xxx';
                        break;
                        case 2 : $msgErreur[] = 'Le fichier téléchargé excède la taille de xxx';
                        break;
                        case 3 : $msgErreur[] = 'Le fichier a été que partiellement téléchargé.';
                        break;
                        case 4 : $msgErreur[] = 'Aucun fichier a été téléchargé';
                        break;
                        ... etc ... (il y a jusquà 8 erreurs "type")
                    }
                }
            }
            else {
                $erreur = true;
                $msgErreur[] = 'Veuillez rechercher une photo';
            }
     
            ... etc, etc pour chaque donnée ...
     
            if ($erreur == false) {
                // On met à jour la Bdd (UPDATE)
                // Puis on pourra redigirer vers une autre page si on veut
                header('Location : autre_page.php');
            }
        break;
    }
     
    // On récupère les donnée nécessaires à l'interface
    // Requêtes
    // Fichiers
    // ... etc, etc ...
     
    // ---------- INTERFACE (html) ----------
    ?>
    <doctype ... >
    <html>
    ... etc...
    <body>
     
    <?php
    // On affiche les erreurs éventuelles
    if (isset($msgErreur) && is_array($msgErreur) && !empty($msgErreur)) {
        foreach($msgErreur as $erreur) {
            echo '<p>'.$erreur.'</p>';
        }
    }
    ?>
     
    <formu ... etc ...>
        ... etc ...
    </formu>
     
    </body>
    </html>
    Voir la doc sur les différentes erreur que peu renvoyer $_FILES : http://fr2.php.net/manual/fr/feature...oad.errors.php

    En procédant ainsi, la mise à jours de la Bdd ne se fera QUE si TOUTES les données prévues sont cohérentes, y compris la photo.
    C'est une autre manière d'aborder la chose, ce qui évitera de faire comme je l'avait proposé précédemment, ici c'est théoriquement plus simple (et plus sur).

    Donc si 1 seul élément n'est pas conforme, aucune mise à jour sera faite, mais le script continuera, donc les données obtenues en POST seront dispos, et ceci permettra de les ré-afficher au lieu de celle de la Bdd (par exemple).


    C'est un principe, une manière de faire, à toi de voir si tu adhère ou pas.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/06/2015, 15h38
  2. Réponses: 6
    Dernier message: 28/11/2013, 12h55
  3. Référencement avec mise à jour asynchrone
    Par Heptaeon dans le forum Référencement
    Réponses: 2
    Dernier message: 12/09/2006, 17h06
  4. Liste déroulante avec mise à jour champ en dynamique
    Par B-Pascal dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/07/2006, 16h53
  5. Access Problème avec mise à jour données
    Par Yanmeunier dans le forum Access
    Réponses: 2
    Dernier message: 30/03/2006, 17h05

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