[RESOLU] crud sur upload

Eléphant du PHP | 65 Messages

22 juil. 2014, 15:04

bonjour à tous ,
je teste en ce moment PDO et je me pose une question concernant le crud lors d'un upload l'insert ce passe sans problème mais le delete et update me pose soucis
je passe juste l' id en bindvalue mais il ne supprime pas l'image dans le dossier pour le update ni le delete comment proceder pour ce genre de chose?
je vous met un extrais de mon code.
<?php
# CREATE
      if(isset($_POST['creer'])){

        $titrel  = $_POST['titrel'];
        $titrec = $_POST['titrec'];
        $description  = $_POST['description'];
        $histo = $_POST['histo'];
        $datepub = $_POST['datepub'];
        $images  = $_FILES['images'];
        //   move_uploaded_file($_FILES['images']['tmp_name'], './upload/'.$_FILES['images']['name']);
        if  ( move_uploaded_file ( $_FILES [ 'images' ][ 'tmp_name' ],  './upload/' . $_FILES [ 'images' ][ 'name' ])) 
        { 
        $images =  './upload/' . $_FILES [ 'images' ][ 'name' ]; 
        $sql  = 'INSERT INTO ouvrage (titrel,titrec,description,histo,datepub,images) ';
        $sql .= 'VALUES (:titrel, :titrec, :description, :histo, :datepub, :images)';

        try {
          $create = $db->prepare($sql);
          $create->bindValue(':titrel', $titrel, PDO::PARAM_STR);
          $create->bindValue(':titrec', $titrec, PDO::PARAM_STR);
          $create->bindValue(':description', $description, PDO::PARAM_STR);
          $create->bindValue(':histo', $histo, PDO::PARAM_STR);
          $create->bindValue(':datepub', $datepub, PDO::PARAM_STR);
          $create->bindValue(':images', $images, PDO::PARAM_STR);
          if($create->execute()){
            echo "<div class='alert alert-success'>
            <button type='button' class='close' data-dismiss='alert'>&times;</button>
            <strong>Inserer avec succès</strong>
            </div>";
          }
        } catch (PDOException $e) {
            echo "<div class='alert alert-error'>
            <button type='button' class='close' data-dismiss='alert'>&times;</button>
            <strong>Erreur insertion dans la base/strong>" . $e->getMessage() . "
            </div>";
        }
      }
      }
  # UPDATE
      if(isset($_POST['edition'])){
        $id = (int)$_GET['ouvrageid'];
        $titrel  = $_POST['titrel'];
        $titrec = $_POST['titrec'];
        $description  = $_POST['description'];
        $histo = $_POST['histo'];
        $datepub = $_POST['datepub'];
        $images  = "./upload/" . $_FILES['images']['name'];
   
        $sqlUpdate = 'UPDATE ouvrage SET titrel = ?, titrec= ?,description = ?, histo=  ?, images= ?, datepub = ? WHERE ouvrageid = ?';

        $datas = array($titrel, $titrec, $description, $histo, $images, $datepub, $id);

        try {
          $update = $db->prepare($sqlUpdate);
          if($update->execute($datas)){
            echo "<div class='alert alert-success'>
            <button type='button' class='close' data-dismiss='alert'>&times;</button>
            <strong>Modifié avec succès</strong>
            </div>";
          }
        } catch (PDOException $e) {
          echo "<div class='alert alert-error'>
            <button type='button' class='close' data-dismiss='alert'>&times;</button>
            <strong>Erreur d'édition</strong>" . $e->getMessage() . "
            </div>";
        }
      }
       
      # DELETE
      if(isset($_GET['action']) && $_GET['action'] == 'delete'){
        $id = (int)$_GET['ouvrageid'];
         $images = "./upload/" . $_FILES['images']['name'];//supp image dossier /upload/
         unlink("./upload/" . $_FILES['images']['name']);
        $sqlDelete = 'DELETE FROM ouvrage WHERE ouvrageid = :ouvrageid, images=:images';

        try {
          $delete = $db->prepare($sqlDelete);
          $delete->bindValue(':ouvrageid', $id, PDO::PARAM_INT);
          /*$delete->bindValue(':images', $id, PDO::PARAM_STR);*/
          if($delete->execute()){
            echo "<div class='alert alert-success'>
            <button type='button' class='close' data-dismiss='alert'>&times;</button>
            <strong>Supp avec succès</strong>
            </div>";
          }
        } catch (PDOException $e) {
          echo "<div class='alert alert-error'>
            <button type='button' class='close' data-dismiss='alert'>&times;</button>
            <strong>Erreur de supp de la base</strong>" . $e->getMessage() . "
            </div>";
        }
      }
si sa marche pour le create cela devrai fonctionner aussi ?
lors de l'update sa me modifier bine le chemin dans ma bdd mais pas le fichier
et le delete supprime bine la ligne dans ma base mais pas mon fichier
si quelque pouvez m’expliquer ou sa pêche un grand merci d'avance
Modifié en dernier par moogli le 22 juil. 2014, 21:46, modifié 1 fois.
Raison : Bbcode code => php

ViPHP
xTG
ViPHP | 7331 Messages

22 juil. 2014, 16:29

Il te manque une partie, celle qui agit sur le système de fichier. ;)
Le code présent dans l'ajout :
if  ( move_uploaded_file ( $_FILES [ 'images' ][ 'tmp_name' ],  './upload/' . $_FILES [ 'images' ][ 'name' ])) 
Son principe est qu'après upload d'un fichier ce dernier est stocké dans un répertoire temporaire du serveur.
Le move_uploaded_file te permet d'aller le placer à l'endroit final que tu souhaites.

Dans le cas d'une modification il faut donc :
- si c'est un nouvel upload => refaire un move_uploaded_file pour écraser l'ancien fichier
- si c'est juste renommer le fichier => voir du côté de la fonction rename

Dans le cas d'une suppression il faut appeler la fonction unlink sur le fichier pour le supprimer.

Eléphant du PHP | 65 Messages

22 juil. 2014, 17:40

merci pour les informations le upload c'est nickel par contre mon delete est récalcitrant :
# DELETE
      if(isset($_GET['action']) && $_GET['action'] == 'delete'){
        $id = (int)$_GET['ouvrageid'];
         $images  = "./upload/" . $_FILES['images']['name'];

   			if(file_exists ( $images))
    		 unlink( $images );

        $sqlDelete = 'DELETE FROM ouvrage WHERE ouvrageid = :ouvrageid';

        try {
          $delete = $db->prepare($sqlDelete);
          $delete->bindValue(':ouvrageid', $id, PDO::PARAM_INT);
          if($delete->execute()){
            echo "<div class='alert alert-success'>
            <button type='button' class='close' data-dismiss='alert'>&times;</button>
            <strong>Supp avec succès</strong>
            </div>";
          }
        } catch (PDOException $e) {
          echo "<div class='alert alert-error'>
            <button type='button' class='close' data-dismiss='alert'>&times;</button>
            <strong>Erreur de supp de la base</strong>" . $e->getMessage() . "
            </div>";
        }
      }
J'ai des erreur sur mon unlink
Notice: Undefined index: images
Warning: unlink(./upload/): Permission denied
j ai tester de mettre un chmod
if(file_exists ( $images))
   				chmod($images, 0777);
    		 unlink( $images );
mais sa coince toujours pourquoi le warning et le notice?

ViPHP
xTG
ViPHP | 7331 Messages

22 juil. 2014, 17:56

A voir le message tu tentes de supprimer un répertoire.
Est-ce bien ce que tu veux ?

Eléphant du PHP | 65 Messages

22 juil. 2014, 17:58

Arf non pas du tous je veux juste supprimer l'image du répertoire lors de la suppression
pourtant je le donne le chemin avec le non de l image.

Code : Tout sélectionner

$images = "./upload/" . $_FILES['images']['name'];
que je veut supprimé.
je suis en local avec wamp sous windows

Eléphant du PHP | 65 Messages

22 juil. 2014, 18:37

Bon la suppresion dans la bdd ce fait bien mais pas dans le dossier ou il y a l'images déroutant ce truck

ViPHP
xTG
ViPHP | 7331 Messages

22 juil. 2014, 18:44

Qu'est ce que tu as dans $_FILES['images']['name'] ? ;)

Eléphant du PHP | 65 Messages

22 juil. 2014, 18:59

je viens de faire un var dump de $image

Code : Tout sélectionner

string './upload/'
donc il trouve pas le nom du fichier pourtant dans la bdd j'ai bien sa /upload/truck.jpg
donc avec $id il devrait retrouver le nom?
je comprend pas là c'est un peu obscure encore je cherche mais je trouve pas le pourquoi
je suis sur que c'est un truck tous con en plus grrr

ViPHP
xTG
ViPHP | 7331 Messages

22 juil. 2014, 20:13

Sauf que $_FILES est ce que retourne le formulaire.
Pas ce qui vient de la BDD.

Il faut donc avant ta requête DELETE une requête SELECT pour récupérer l'url vers le fichier pour pouvoir le supprimer.

Eléphant du PHP | 65 Messages

23 juil. 2014, 13:05

merci pour l'information je pensais que vu que je récupéré déjà l id je pouvais récupérer aussi les autres champ.
par contre faire la requête select avant...
$sqlSelect = 'SELECT * FROM ouvrage WHERE ouvrageid = :ouvrageid';
 $sqlDelete = 'DELETE FROM ouvrage WHERE ouvrageid = :ouvrageid';

        try {
          $delete = $db->prepare($sqlSelect);
          $delete->bindValue(':ouvrageid', $id, PDO::PARAM_INT);
          if($delete->execute($sqlDelete )){
            echo "<div class='alert alert-success'>
            <button type='button' class='close' data-dismiss='alert'>&times;</button>
            <strong>Supp avec succès</strong>
            </div>";
          }
        } catch (PDOException $e) {
          echo "<div class='alert alert-error'>
            <button type='button' class='close' data-dismiss='alert'>&times;</button>
            <strong>Erreur de supp de la base</strong>" . $e->getMessage() . "
            </div>";
        }
      }
sa donnerai quelque chose comme sa ou pas du tous?

ViPHP
xTG
ViPHP | 7331 Messages

23 juil. 2014, 13:17

Euh... Oui et non ? ^^
Tu mélanges un peu les deux variables dans ce que tu as fais donc je ne sais pas si c'est la totalité du code que tu souhaitais faire.
Ou bien si c'était juste le select.

Eléphant du PHP | 65 Messages

23 juil. 2014, 13:41

J' essaye d'appliquer tes remarques suis pas un pro donc je teste.
je veux juste récupérer mon chemin d'image proprement
sa marche actuellement mais pas avec la requête que je t ai montrer je te montre comment j'ai contourner le soucis.
 $images=$_GET['images'];
        if( file_exists ( $images))
        unlink($images);
mais la avec une requête slq en plus je patauge dans la semoule mais je veut tenir compte de ce que tu me dit

Eléphant du PHP | 65 Messages

23 juil. 2014, 13:42

J' essaye d'appliquer tes remarques suis pas un pro donc je teste.
je veux juste récupérer mon chemin d'image proprement
sa marche actuellement mais pas avec la requête que je t ai montrer je te montre comment j'ai contourner le soucis.
 if(isset($_GET['action']) && $_GET['action'] == 'delete'){
        $id = (int)$_GET['ouvrageid']; $images=$_GET['images'];
        if( file_exists ( $images))
        unlink($images); $sqlDelete = 'DELETE FROM ouvrage WHERE ouvrageid = :ouvrageid' ;
        try {
          $delete = $db->prepare($sqlDelete);
          $delete->bindValue(':ouvrageid', $id, PDO::PARAM_INT);
         // $delete->bindValue(':images', $images, PDO::PARAM_STR);
          if($delete->execute()){
            echo "<div class='alert alert-success'>
            <button type='button' class='close' data-dismiss='alert'>&times;</button>
            <strong>Supp avec succès</strong>
            </div>";
          }
        } catch (PDOException $e) {
          echo "<div class='alert alert-error'>
            <button type='button' class='close' data-dismiss='alert'>&times;</button>
            <strong>Erreur de supp de la base</strong>" . $e->getMessage() . "
            </div>";
        }
      }
mais la avec une requête slq en plus je patauge dans la semoule mais je veut tenir compte de ce que tu me dit

ViPHP
xTG
ViPHP | 7331 Messages

23 juil. 2014, 16:45

Voici un exemple basique à adapter :
// Soit $_GET['numero'] un champ fourni par l'url et représentant ma clé primaire

$sql = 'SELECT monChamps FROM maTable WHERE numero = ' . PDO::quote($_GET['numero']); // PDO::quote pour protéger contre l'injection SQL
$result = $pdo->query($sql); // query plutôt que requête préparée car plus adaptée à la situation
if( $result )
{
   $data = $result->fetch();
   if( $data )
   {
      $monChamps = $data['monChamps']; // j'ai récupéré le contenu
   }
}

Eléphant du PHP | 65 Messages

23 juil. 2014, 20:30

merci bien pour l'aide temps que j ai ton attention j'en profite :D
on ton avis l'utilisation des getter et setter est elle vraiment utile?
je ne parle pas des méthodes magique
si j ai bien piger la doc
les setter pour les verif et les getter pour l affichage c'est bine sa?