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 :

fonction update avec foreach dans pdo [PDO]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut fonction update avec foreach dans pdo
    Bonjour à tous, je rencontre deux problèmes lorsque je souhaite mettre à jour une fiche article avec pdf joint et les catégories auxquelles se rattache l'article.

    En mettant à jour la fiche, les informations concernants la fiche article sont prises en compte, les variables des catégories sont présentes dans le print_r de l'array posté mais ne s'intègrent pas en base de données (l'id_product est rentré mais pas l'id_cat.)

    Mon foreach est-il correct en pdo ? Je n'arrive pas à trouver l'erreur.
    Voici ma fonction :

    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
      public function update($product)
      {
        $q = $this->db->prepare('UPDATE products SET name = :name, brand = :brand, description = :description, article = :article, SEO_Title = :SEO_Title ,SEO_Description = :SEO_Description ,SEO_Keywords = :SEO_Keywords WHERE id = :id');
        $q->bindValue(':id', $product->id(), PDO::PARAM_INT);
        $q->bindValue(':name', $product->name());
        $q->bindValue(':brand', $product->brand());
        $q->bindValue(':description', $product->description());
        $q->bindValue(':article', $product->article());
        $q->bindValue(':SEO_Title', $product->SEO_Title());
        $q->bindValue(':SEO_Description', $product->SEO_Description());
        $q->bindValue(':SEO_Keywords', $product->SEO_Keywords());
     
        $q->execute();
     
     
        foreach ($_POST['category'] as $key => $value)
        {
            $q = $this->db->prepare('UPDATE product_cat SET id_cat = :id_cat, id_product =:id_product');
            $q->bindValue(':id_cat', $key);
            $q->bindValue(':id_product',$product->id());
            $q->execute();
        }
     
      }
    et voici l'envoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if (isset($_POST['edit']) && isset($_POST['id'])) 
    {
     
    print_r($_POST);
    	  $rand = rand();
    	  $chemin_destination = '../article/';
          $product = new Product(array('name' => $_POST['name'], 'description' => $_POST['description'], 'article' => $rand.'.pdf', 'SEO_Title' => $_POST['seo_title'], 'SEO_Description' => $_POST['seo_description'], 'SEO_Keywords' => $_POST['seo_keywords'], 'brand' => $_POST['brand'],'category' => $_POST['category'],'id'=>$_POST['id']));
     
          move_uploaded_file($_FILES['article']['tmp_name'], $chemin_destination . $rand . '.pdf');
          $manager->update($product);
     
    }

    Deuxième question, peut-on faire un isset sur un fichier envoyé pour mettre à jour celui-ci uniquement s'il existe avant d'enchainer avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	  $rand = rand();
    	  $chemin_destination = '../article/';
              move_uploaded_file($_FILES['article']['tmp_name'], $chemin_destination . $rand . '.pdf');

    Merci pour votre aide !

  2. #2
    Membre régulier
    Femme Profil pro
    Etudiante en informatique
    Inscrit en
    Janvier 2013
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 98
    Points : 95
    Points
    95
    Par défaut
    Difficile de comprendre de quoi tu parles sans connaitre le schéma de ta base de données...
    Montre nous ton schéma et réexplique ton problème, car la c'est vraiment pas clair

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il ne manquerait pas un peu un WHERE dans ton UPDATE ?
    De plus, la préparation de la requête est à faire en dehors de la boucle.

    Pour la deuxième question :
    http://www.php.net/manual/fr/function.file-exists.php
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Merci pour ta réponse, je vais essayer d'être plus précis. (désolé, je débute avec PDO)
    Je possède 4 tables :
    - products (id, reference, name, brand, description, article, SEO_Title, SEO_Description, SEO_Keywords)
    - brands (id, brand)
    - categories (id, categorie)
    - product_cat (id, id_cat, id_product) jointure entre la table "categories" et "products".

    Un produit appartient à une seule marque, le CRUD fonctionne bien.

    Un produit peut appartenir à plusieurs catégories. La fonction create fonctionne bien mais pas la fonction update qui ne met pas à jour les catégories auxquelles le produit appartient , la table "products" est donc bien mise à jour mais pas "product_cat", des erreurs sont présentes dans l'update. en effet, l'id_product est bien mis à jour, mais l'id_cat va faire apparaitre 6 fois la même valeur et non les valeurs mises à jour, présentent dans le print_r($_POST) avant mise à jour.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Merci Sabotage pour ton aide. En intégrant le WHERE comme ceci, aucune donnée est mise à jour concernant la partie catégorie. Je vois pour intégrer la boucle en dehors..pas encore habitué à PDO.

    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
    public function update($product)
      {
        $q = $this->db->prepare('UPDATE products SET name = :name, brand = :brand, description = :description, article = :article, SEO_Title = :SEO_Title ,SEO_Description = :SEO_Description ,SEO_Keywords = :SEO_Keywords WHERE id = :id');
        $q->bindValue(':id', $product->id(), PDO::PARAM_INT);
        $q->bindValue(':name', $product->name());
        $q->bindValue(':brand', $product->brand());
        $q->bindValue(':description', $product->description());
        $q->bindValue(':manual', $product->article());
        $q->bindValue(':SEO_Title', $product->SEO_Title());
        $q->bindValue(':SEO_Description', $product->SEO_Description());
        $q->bindValue(':SEO_Keywords', $product->SEO_Keywords());
     
        $q->execute();
     
     
        foreach ($_POST['category'] as $key => $value)
        {
            $q = $this->db->prepare('UPDATE product_cat SET id_cat = :id_cat WHERE id_product =:id_product');
            $q->bindValue(':id_cat', $key);
            $q->bindValue(':id_product',$product->id(), PDO::PARAM_INT);
            $q->execute();
        }
     
      }

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    En intégrant mes boucles en dehors, cela ne fonctionne toujours pas et l'id product n'est plus prise en compte. Ai-je une erreur dans la structure ?

    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
    public function update($product)
      {
        $q = $this->db->prepare('UPDATE products SET name = :name, brand = :brand, description = :description, article = :article, SEO_Title = :SEO_Title ,SEO_Description = :SEO_Description ,SEO_Keywords = :SEO_Keywords WHERE id = :id');
        $q->bindValue(':id', $product->id(), PDO::PARAM_INT);
        $q->bindValue(':name', $product->name());
        $q->bindValue(':brand', $product->brand());
        $q->bindValue(':description', $product->description());
        $q->bindValue(':manual', $product->article());
        $q->bindValue(':SEO_Title', $product->SEO_Title());
        $q->bindValue(':SEO_Description', $product->SEO_Description());
        $q->bindValue(':SEO_Keywords', $product->SEO_Keywords());
     
        $q->execute();
     
         $q2 = $this->db->prepare('UPDATE product_cat SET id_cat = :id_cat WHERE id_product =:id_product');
        foreach ($_POST['category'] as $key => $value)
        $q2->bindValue(':id_cat', $key);
        $q2->bindValue(':id_product',$product->id(), PDO::PARAM_INT);
        $q2->execute();
     
      }

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Tu as oublié les accolades dans ton dernier foreach.
    Fais afficher les erreurs pdo pour les visualiser (cf tuto)


    Par ailleurs, n'utilise pas rand() pour avoir un nom de fichier unique. rand donne un nombre aléatoire mais rien ne garanti qu'il soit unique entre deux tirages. Utilise plutôt uniqid à la place.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Merci ABCIWEB pour ces précisions !
    noté pour rand(), je vais faire la modification. J'ai également modifié les crochets.
    Je viens d'activer les erreurs php et effectivement, il m'indique des erreurs dans mon formulaire d'update au niveau de la ligne de récupération des cases actives (des catégories), je ne comprends pas ou se trouve mon erreur.
    voici l'erreur retourné : Notice: Undefined index: id au niveau de l'input.

    voici ma zone php dans le formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $retourcat = $manager->getListcat($id);
    	foreach ($retourcat as $cat){
    		echo '<div class="checkbox checkbox-replace">
    	<input type="checkbox" '.($cat['active'] == 'yes'?'checked="checked"':'').' name="category['. htmlspecialchars($cat['id']). ']" id="'. htmlspecialchars($cat['id']). '">
    	<label>'. htmlspecialchars($cat['category']). '</label>
    	</div>';
        }
     
    ?>
    Et la fonction qui s'y raporte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public function getListcat($id)
      {
        $product = array();
          $q = $this->db->prepare('SELECT * FROM categories c LEFT JOIN  product_cat m ON m.id_cat=c.id AND id_product= :id_product');
          $q->execute(array(':id_product' => $id));
          while ($donnees = $q->fetch(PDO::FETCH_ASSOC))
          {
            $product[] = array('category' =>$donnees['category'], 'active'=>($donnees['id_product'] ==NULL ? 'no': 'yes'));
          }
     
        return $product;
      }
    Dois-je gérer cette fonction différemment avec PDO ?

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Tu dis qu'il y a une erreur au niveau de l'input. Cela n'a rien à voir avec le fonctionnement de pdo.

    Mets toi en mode debug : fais afficher les variables et les tableaux pour comprendre ce qui se passe.
    (Et fais plus d'exercices pdo avec les tuto avant de coder.)

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Merci. Je continue à faire des tutos avec pdo..!
    J'ai trouvé mes erreurs il s'agissait de ma fonction getListcat. La voici corrigée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public function getListcat($id)
      {
        $product = array();
          $q = $this->db->prepare('SELECT category, id_product, c.id AS id_category FROM categories c LEFT JOIN  product_cat p ON p.id_cat=c.id AND id_product= :id_product');
          $q->execute(array(':id_product' => $id));
          while ($donnees = $q->fetch(PDO::FETCH_ASSOC))
          {
            $product[] = array('id_category' => $donnees['id_category'],'category' =>$donnees['category'], 'active'=>($donnees['id_product'] ==NULL ? 'no': 'yes'));
          }
     
        return $product;
      }
    Et dans mon formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php							
    $retourcat = $manager->getListcat($id);
    foreach ($retourcat as $cat)
    {
    	echo '<div class="checkbox checkbox-replace">
    		<input type="checkbox" '.($cat['active'] == 'yes'?'checked="checked"':'').' name="category['. htmlspecialchars($cat['id_category']). ']" id="'. htmlspecialchars($cat['id_category']). '">
    		<label>'. htmlspecialchars($cat['category']). '</label>
    	</div>';
    }
    ?>
    Cependant, comment puis-je traduire ma requête left join et retour array dans le while avec pdo ? Dois-je crée une nouvelle class avec les get et set avec id_product et id_cat (pour la table de jointure) ?
    Merci encore pour votre aide.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Problème résolu ! Merci pour votre aide.

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

Discussions similaires

  1. [XL-2003] Fonction SI avec résulat dans une autre cellule
    Par jbs68 dans le forum Excel
    Réponses: 5
    Dernier message: 31/03/2010, 18h44
  2. Réponses: 0
    Dernier message: 11/01/2010, 10h49
  3. Appleler une fonction VBScript avec parametre dans un batch
    Par spoun95 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 10/10/2008, 17h08
  4. update avec paramètre dans access (pour modifier une image)
    Par salihovic dans le forum Windows Forms
    Réponses: 2
    Dernier message: 17/02/2008, 21h27
  5. astuce avec fonction update
    Par cubepiege dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/11/2005, 10h54

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