Upload d'image update

xander18
Invité n'ayant pas de compte PHPfrance

23 févr. 2013, 02:43

Bonjour, voici mon problème j'ai un formulaire de modification qui me sert a modifier un produit.
Ce produit a une image qui a été uploadé lors de l'ajout d'un produit.
Si je modifie le produit sans modifier l'image je veut gardé l'image précédente donc je n'update pas l'image
Si j'update une image celle ci remplacera l'ancienne.
Or sa ne fonctionne pas et je commence a m'arraché les cheveux voici mon code Formulaire + action PHP.

Voici mon code : Formulaire :

Code : Tout sélectionner

<?php include('includes/connexion_bdd2.php'); ?> <!DOCTYPE> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>OSG Administration</title> <!-- Style générale --> <link rel="stylesheet" type="text/css" href="css/admin.css" /> <link rel="stylesheet" type="text/css" href="css/alert_admin2.css" /> <!-- message d'alerte --> <script type="text/javascript" src="js/main.js"></script> </head> <body> <div id="structure"> <div id="header"> <div id="logo"><a href="#" alt="index"><img src="img/banniere_admin.png" title="logo" alt="logo"></a></div> <!-- Menu --> <?php include('includes/menu_admin.php'); ?> <!-- fin du menu --> </div> <div id="content"><!-- début du content --> <br /><br /> <h3 class="titre3">Editer un produit<h3> <br /> <?php if(!empty($_GET['page'])) { $id = $_GET['page']; $req = mysql_query("SELECT * FROM produits WHERE id_produits=$id"); if (mysql_num_rows($req) > 0) { $data = mysql_fetch_assoc($req); } else { header('Location:admin_produits2.php'); } } ?> <form method="POST" action="modifier_produits.php?page=<?php echo $data['id_produits']; ?>" enctype="multipart/form-data"> <p> <label for="nom">Nom du produit</label><br /> <input type="text" class="input" id="nom" name="nom" value="<?php echo $data['nom']; ?>"> </p> <p> <label for="position">Prix</label><br /> <input type="text" class="input" id="prix" name="prix" value="<?php echo $data['prix']; ?>"> </p> <p> <label for="position">Quantiter</label><br /> <input type="text" class="input" id="quantiter" name="quantiter" value="<?php echo $data['quantiter']; ?>"> </p> <p> <label for="contenu">Description</label><br /> <textarea type="text" class="input" id="description" name="description"><?php echo $data['description']; ?></textarea> </p> <p> <br /> <label for="contenu">image actuelle :</label><br /> <img src="images/min/<?php echo $data['image']; ?>" alt="image" /> </p> <br /> <div id="image" > <label for="contenu">uploader une nouvelle image ? :</label><br /> <input class="input" type="file" name="image" id="image" > <!-- upload d'image --> </div> <br /> <?php //connection au serveur include ('includes/connexion_bdd.php'); ?> <div id="consoles"> <label for="consoles">Le produit est une console ? si non sur quel support est le produit * :</label> <select class="input " name="id_consoles" required> <?php // ici je récupère les consoles //connection au serveur $res = $bdd->query ('SELECT nom, id_consoles FROM consoles'); while ($donnees = $res->fetch()) { ?> <option value=<?php echo $donnees['id_consoles'] ;?>> <?php echo $donnees['nom'] ;?> </option><?php } $res->closeCursor(); ?> </select> </div> <br /> <div id="types"> <label for="Types">Types de produit * :</label> <select class="input " name="id_types" required> <?php // ici je récupère les consoles //connection au serveur $res = $bdd->query ('SELECT nom, id_types FROM types'); while ($donnees = $res->fetch()) { ?> <option value=<?php echo $donnees['id_types'] ;?>> <?php echo $donnees['nom'] ;?> </option><?php } $res->closeCursor(); ?> </select> </div> <br /> <div id="genres"> <label for="Genres">Genres de produit * :</label> <select class="input " name="id_genres" required> <?php // ici je récupère les genres //connection au serveur $res = $bdd->query ('SELECT nom, id_genres FROM genres'); while ($donnees = $res->fetch()) { ?> <option value=<?php echo $donnees['id_genres'] ;?>> <?php echo $donnees['nom'] ;?> </option><?php } $res->closeCursor(); ?> </select> </div> <br /><br /> <input src="img/modifier.png" type=image > <img src="img/annuler.png" onclick="javascript:location.href='admin_produits.php'" /> </form> <br /><br /> </div><!-- fin content --> </div><!-- fin structure --> </body> </html>
et mon Traitement PHP :
<?php
    require("session.class.php");
    $Session = new Session(); 
    //connection au serveur
    include ('includes/connexion_bdd2.php'); 
    extract($_POST);
            $id = $_GET['page'];
            $sql =  "UPDATE produits SET nom='$nom', prix='$prix', quantiter='$quantiter', description='$description', id_consoles='$id_consoles', id_genres='$id_genres', id_types='$id_types' WHERE id_produits=$id";         
            mysql_query($sql);
if(!empty($_FILES))
{
    $image = $_FILES['image'];
    $image_name = $image['name'];
    $ext = strtolower(substr(strrchr($image_name,'.'),1));
    $ext_aut = array('jpg','jpeg','png','gif');
     
    function check_extension($ext,$ext_aut)
    {
        if(in_array($ext,$ext_aut))
        {
            return true;
        }
    }
     
    $valid = (!check_extension($ext,$ext_aut)) ? false : true;
    $erreur = (!check_extension($ext,$ext_aut)) ? 'Veuillez charger une image' : '';
     
    if($valid)
    {
        $max_size = 2000000;
        if($image['size']>$max_size)
        {
            $valid = false;
            $erreur = 'Fichier trop gros';
        }
    }
     
    if($valid)
    {
        if($image['error']>0)
        {
            $valid = false;
            $erreur = 'Erreur lors du transfert';
        }
    }
     
    if($valid)
    {
        $path_to_image = 'images/fullsize/';
        $path_to_min = 'images/min/';
         
        $filename = sha1(uniqid($image_name));
         
        $source = $image['tmp_name'];
        $target = $path_to_image . $filename. '.'. $ext;
         
        move_uploaded_file($source,$target);
         
        if($ext == 'jpg' || $ext == 'jpeg') {$im = imagecreatefromjpeg($path_to_image.$filename.'.'.$ext);}
        if($ext == 'png') {$im = imagecreatefrompng($path_to_image.$filename.'.'.$ext);}
        if($ext == 'gif') { $im = imagecreatefromgif($path_to_image.$filename.'.'.$ext);}
         
        $ox = imagesx($im);
        $oy = imagesy($im);
         
        $nx = 150;
        $ny = floor($oy *($nx/$ox));
         
        $nm = imagecreatetruecolor($nx,$ny);
         
        imagecopyresized($nm, $im, 0,0,0,0, $nx,$ny,$ox,$oy);
         
        imagejpeg($nm, $path_to_min.$filename.'.'.$ext);
         
        $nom_image = $filename.'.'.$ext;
 
    } 
            extract($_POST);
            $id = $_GET['page'];
            $sql =  "UPDATE produits SET image='$nom_image' WHERE id_produits=$id";         
            mysql_query($sql); 
    }
            // message d'alerte
            $Session->setFlash('La modification du produits a été effectuer','success');
            // retour a la page d'acceuil
            header('Location:admin_produits.php');
 
 
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

23 févr. 2013, 13:48

salut,


qu'est ce qui ne fonctionne pas exactement ?

tu peux commencer par simplifier la validation afin de ne garder que l'essentiel pour tester la chose (ensuite tu ajoute les contrôles nécessaire quand tu a validé la logique de base).

tu peux aussi virer le extract et utiliser les variable contenu dans $_POST.
si c'est la formation de la requête qui te gêne utilise la concaténation:)

ton script est ouvert au faille sql (injection) utiliser mysql_real_escape_string pour protéger tes données.

tu peux aussi éviter d'ajouter un paramètre dans l'url action du formulaire, utilise simplement un champs caché (input type hidden) dans le formulaire pour passe ton id ;)

Pour ce qui est de l'upload c'est pareil, évite la copie de variable c'es inutile et se perd à a lecture du code.
As tu regardé ce que contenait $_FILES lorsque tu ne n'utilise pas ce champ ?

$valid = (!check_extension($ext,$ext_aut)) ? false : true;
$erreur = (!check_extension($ext,$ext_aut)) ? 'Veuillez charger une image' : '';
c'est exactement la même chose pourquoi deux tests ?
d'ailleurs le message d'erreur n'est pas clair c'est un fichier dont l'extension n'est pas autorisé (par exemple bmp, raw c'est des images ;) ).

deux fois if($valid)) c'est inutile :)

simplifie ton code tu y verra plus clair et tu devrais t'en sortir :)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 120 Messages

23 févr. 2013, 13:58

J'ai l'impression que ce code est du copié/collé de différents tutoriels. Pourquoi utilises-tu d'un côté l'extension MySQL et de l'autre PDO ?
Avec un niveau pareil, je te déconseille fortement de jouer à uploader des fichiers. C'est dangereux pour ton serveur.

xander18
Invité n'ayant pas de compte PHPfrance

23 févr. 2013, 14:55

c'est pas du copié collé mdr XD au début j'utilisé mysqlconnect ensuite j'ai appris a codé avec PDO et comme je m’étais déjà avancé je voulais pas tout refaire donc je jongle avec les 2
il n'y a que pour l'upload de d'image que j'ai utilisé un tuto

xander18
Invité n'ayant pas de compte PHPfrance

23 févr. 2013, 15:18

J'ai changé mon code en optant pour une image par url c'est moin compliqué qu'un uploader d'image et sa fonctionne nickel ;)
<?php
    require("session.class.php");
    $Session = new Session(); 
    //connection au serveur
    include ('includes/connexion_bdd2.php'); 
			extract($_POST);
            $id = $_GET['page'];
            $sql =  "UPDATE produits SET nom='$nom', prix='$prix', quantiter='$quantiter', description='$description', id_consoles='$id_consoles', id_genres='$id_genres', id_types='$id_types' WHERE id_produits=$id";         
            mysql_query($sql);
if(!empty($_POST['image']))
{
            $id = $_GET['page'];
            $sql =  "UPDATE produits SET image='$image' WHERE id_produits=$id";         
            mysql_query($sql); 
    }
            // message d'alerte
            $Session->setFlash('La modification du produits a été effectuer','success');
            // retour a la page d'acceuil
            header('Location:admin_produits.php');
 
 
?>