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,
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>
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.
Décrivez ici vos erreurs ou ce que vous obtenez à la place de ce que vous attendez :(
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 ;)
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';
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) !
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
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
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.
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
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