Bonjour,

Voila je rencontre un petit problème avec mon code.

Donc, j'ai créer un espace membre dont une partie provient d'ici, et le reste de gauche à droite, plus mon css et mes lignes de codes pour formulaire etc. Tout fonctionne correctement sauf juste un détail au niveau de l'avatar.
L'avatar s'upload bien dans la bdd et dans mon répertoire.
Deux problèmes surviennent,

  • Le premier: Obliger de déconnecté et reconnecté l'utilisateur pour que la photo se modifie, je cherche a se qu'elle change sans avoir à faire cette manipulation .
  • Le deuxième : J'autorise jpg, gif, png et quand je change d'image avec edition de profil->changer avatar et que je mets une image en jpg alors qu' une png etait déja en place dans mon répertoire je me retrouve avec deux images avec le meme id mais des extentions différentes. Si je fais avec deux images de la même extentions il efface bien l'ancienne pour remplacer par la nouvelle.

Décrivez ici votre code ou ce que vous cherchez à faire
Mon code de l'avatar

<?php
require 'inc/bootstrap.php';
$auth =App::getAuth();
$db = App::getDatabase();

if(isset($_FILES['avatar']) AND !empty($_FILES['avatar']['name'])) {
        $tailleMax = 2097152;
        $extensionsValides = array('jpg', 'jpeg', 'gif', 'png');
        if($_FILES['avatar']['size'] <= $tailleMax) {
        $extensionUpload = strtolower(substr(strrchr($_FILES['avatar']['name'], '.'), 1));
        if(in_array($extensionUpload, $extensionsValides)) {
         $chemin = "membres/avatars/".$_SESSION['auth']->id.".".$extensionUpload;
         $resultat = move_uploaded_file($_FILES['avatar']['tmp_name'], $chemin);
         if($resultat) {
            $updateavatar = $db->query('UPDATE users SET avatar = :avatar WHERE id = :id',(array(
               'avatar' => $_SESSION['auth']->id.".".$extensionUpload,
               'id' => $_SESSION['auth']->id
               )));
                  App::redirect('profil.php');
                                }   
                                else
                                {
                                    $msg="Erreur durant l'importation du fichier !";
                                }
                            }
                            else
                            {
                            $msg="Votre photo de profil doit être au format jpg, jpeg, gif ou png!";
                            }
                        }   
                        else
                        {
                            $msg="Votre photo de profil ne doit pas dépasser 2 Mo !";
                        }
        }
    ?>    
  <div id="logphotoprofil">
        <form method="POST" action="" enctype="multipart/form-data">
        <label>Pseudo : </label>
        <input type="text" name="newpseudo" placeholder="pseudo" value="<?php echo $_SESSION['auth']->username;?>"/><br /><br />
        <label>Mail : </label>
        <input type="email" name="newmail" placeholder="mail" value="<?php echo $_SESSION['auth']->email;?>" /><br /><br />
        <label>Mot de passe : </label>
        <input type="password" name="newmdp1" placeholder="Mot de passe"  /><br /><br />
        <label>Confirmez votre mot de passe : </label>
        <input type="password" name="newmdp2" placeholder="Confirmation mot de passe"  /><br /><br />
        <label>Avatar : </label>
        <input type="file" name="avatar"  /><br /><br />
        <input type="submit" value="Mettre à jour mon profil !"  />
        </form>

        <?php 
        if(isset($msg))
        {
        echo $msg;  
        }
        ?>

    </div>

Mon code pour afficher dans profil

<?php
require 'inc/bootstrap.php';
$auth =App::getAuth();
$db = App::getDatabase();

if(isset($_GET['id']) AND $_GET['id'] > 0)
{
    require_once 'inc/db.php';
    $getid =intval($_GET['id']);
    $user = $db->query('SELECT * FROM users WHERE id =?',(array($getid)))->fetch();

}

require 'inc/header.php'; 
require 'inc/menu.php';
?>
<div align="center">

    <div class="container">

         <form class="form-horizontal">
            <fieldset>

                <div class="blockg">
                <h2>Bienvenue <?= $_SESSION['auth']->username; ?> sur votre profil</h2>
                             <div class="logphotoprofil">
                              <img src="membres/avatars/<?= $_SESSION['auth']->avatar ?>" width="150" height="150">
                            </div>
                   </div>
   </fieldset>
        </form>
 </div>
     </div>

Ce que je veux

Ne plus devoir me déconnecter et reconnecter pour voir le changement de mon avatar
Pouvoir effacer dans le repertoire de destination l'image de mon avatar qui porte le meme Id mais avec une extentions différente quand je la modifie.

Ce que j'obtiens

Décrivez ici vos erreurs ou ce que vous obtenez à la place de ce que vous attendez :(

11 réponses


fital
Réponse acceptée

Non @JeremieMeunier a raison. Il faut que tu updates ta Session

<?php $_SESSION['auth']->avatar = $_SESSION['auth']->id.".".$extensionUpload

(obligé si l'extension du fichier change...

Par contre Je pense que ton problème d'affichage peut être lié au cache du coup tu peux obliger à recharger l'image comme ceci :

<img src="membres/avatars/<?= $_SESSION['auth']->avatar."?".time()  ?>" width="150" height="150">

Faire un logout/login pour un changement d'avatar n'a aucune logique ;)

JeremieMeunier
Réponse acceptée

Alors je sais par exemple que pour mon site pour recharger l'image il faut que je rajoute un image.jpg?v=123456799, j'utilise actuellement le timestamp, mais tu peut utiliser une fonction comme celle-ci pour générer un affichage différent, que tu rentrerait dans ta BDD

function random($car)
{
    $string = '';
    $chaine = 'abcdefghijklmopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    srand((double)microtime()*time());
    for($i=0; $i<$car; $i++)
    {
        $string .=$chaine[rand()%strlen($chaine)];
    }
    return $string;
}

Ce qui permettra lorsque ton utilisateur change d'image de profil tu redonne une valeur à l'image qui pourra prendre plusieurs forme :

$filename = 'user1-25946.jpg';
//ou
$filename = 'user1.jpg?v=25946';
fital
Réponse acceptée

Non c'est la mauvaise :P

Avant de faire un unlink il te faut vérifier si le fichier existe dans le genre :

<?php
    if(file_exists("./membres/avatars/".$_SESSION['auth']->avatar)){
        unlink("./membres/avatars/".$_SESSION['auth']->avatar);
    }
 ?>

PS: et encore le code n'est pas sécurisé car la tu fais confiance au donnée de l'utilisateur. Si il change sa session il supprime ce qu'il veut. IL faut que tu prennes directement son avatar depuis la base de donnée

Bonjour,

Pour le problème n°1 : As-tu essayer de changer la valeur des variables de $_SESSION avec par exemple :

<?php $_SESSION['avatar'] = $nvAvatar; ?>

Pour ton problème n°2 : Plusieurs solutions, tu change l'extension de l'image avec une lib ou une API externe. Sinon si tu veut supprimer il faut regarder de ce côté là (php.net) !

sty
Auteur

salut jeremie, changer la valeur ne sert a rien je pense la tu me demande de faire a + b =c et d=a donc d+b =c.
du moins je l'ai tester et le code fonctionne mais pas de changement dans se que je souhaite :(
Je pense qu'il faut que je ferme la connection et la reactualise en gros faire un refresh

sty
Auteur

salut fital, je change cela et copie le code si cela ne vas pas

sty
Auteur

si j'ai bien compris pour ne pas faire d'erreur

<?php $_SESSION['auth']->avatar = $_SESSION['auth']->id.".".$extensionUpload

je le colle dans mon

if($resultat) {
            $updateavatar = $db->query('UPDATE users SET avatar = :avatar WHERE id = :id',(array(
               'avatar' => $_SESSION['auth']->id.".".$extensionUpload,
               'id' => $_SESSION['auth']->id
               )));
               $_SESSION['auth']->avatar = $_SESSION['auth']->id.".".$extensionUpload;
                  App::redirect('profil.php');
                                }   

et au niveau du

<img src="membres/avatars/<?= $_SESSION['auth']->avatar."?".time()  ?>" width="150" height="150">

ne fonctionne pas du moins je dois encore deco reco pour que l avatar change

sty
Auteur

oki ca passe du moins le changement sans devoir deconnecter et reconnecter fonctionne
J'ai fais le test avec une jpg et une png mais il garde dans le répertoire de destination les deux images avec le meme id mais pas la même extention.
Est-il possible d'effacer l'image si elle a une extention différente au niveau de la bdd tout se passe correct mais au niveua repertoire j 'ai 33.jpg et 33.png et actuellment l'image choisie par l'utilisateur est 33.png donc faudrait que 33.jpg soit delete.

Comme te la mentionné @JeremieMeunier dans son premier message, il faut utiliser la fontion php unlink() sur l'image à supprimer (à faire avant de mettre la nouvelle image mais après avoir vérifier si ce qu'à uploadé l'utilisateur est bien une image valide.

sty
Auteur

oui fital j ai relu les post et je regarde actuellement le unlink comme jamais fais, je lis :)
unlink("./membres/avatars/".$_SESSION['auth']->id)
dis moi pour toi c'est la bonne manière de le faire

sty
Auteur

oui j'avais prévu le if mais je voulais tester le unlink mais je pensais réellement que je devais me dirigier sur l id avec $_SESSION['auth']->id , vu que dans le répertoire c'est défini sur l id resultat cela passais pas ^^ et suis tombé sur un autre topic https://www.grafikart.fr/forum/topics/19937 qui parlais de se probleme la mais le code avec le if focntionne
encore un grand merci a toi et jeremie