Site e-commerce

Recherche d'un "prof particulié" pour conseils/questions

a marqué ce sujet comme résolu.

Un dernier soucis où je pense que vous pourrez m'aider : Du côté de ma base de donnée, lorsque je supprime un produit, que ça supprime le produit et lorsque je supprime une catégorie ça supprime tous les produits.

Je sais que ce sont les cascades qu'il faut utiliser mais j'ai peur de faire des conneries je voulais avoir vos conseils avant, j'ai plusieurs clés étrangères et je suis pas sûr de choisir les bonnes.

Là quand je veux supprimer un ou plusieurs produits à la fois j'ai une erreur SQL :

1
Erreur Mysql : SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`lepetit`.`mpl_category_has_mpl_products`, CONSTRAINT `fk_MPL_Category_has_MPL_Products_MPL_Products1` FOREIGN KEY (`MPL_Products_idMPL_Products`) REFERENCES `mpl_products` (`idMPL_Products`) )

Ce genre d'erreur survient quand on tente d'insérer une valeur dans une "colonne clé étrangère" qui n'existe pas comme ID dans la table référence, ou quand on tente de changer l'ID de la table référence alors qu'elle est utilisée dans une autre où il y a une clé étrangère.

+0 -0

Salut :)

Je vous remercie !

J'ai pu me débrouiller, tout fonctionne à merveille :) Du coup pas besoin de vous montrer la requête mais j'ai un autre nouveau petit problème. Je suis dessus depuis ce matin, je trouve vraiment pas de solution. Dans ma vu qui affiche la liste des produits, j'ai un bouton modifier à chaque ligne. Lorsqu'on clique dessus on arrive donc sur la page modification du produit qui reprend le formulaire "ajouter produit" mais avec les champs déjà remplie. Jusqu'ici tout fonctionne très bien, mais à la fin du formulaire, lorsqu'on doit choisir la ou les catégories associé au produit je ne vois pas comment "cocher" ceux qui avaient été enregistré dans la base lors de l'ajout.

Avec l'attribut checked="checked", je pense que c'est possible de faire quelque chose mais comment lui dire au serveur de bien m'afficher la liste des catégories sous forme de checkbox (comme déjà fait) mais avec certains d'entres eux déjà cochés (et les bons évidemment :p ) ?

Etant donné que y'a pas mal de fichiers différent entres les modèles et les controllers et les vues pour traiter tout ça, je sais même pas quoi vous montrer. Donc j'attends de voir d'abord si quelqu'un ai déjà eu à faire à ce problème et qui aurait des conseils, hésitez pas à me demander les bout de codes, je veux juste pas trop charger le message de code pour l'instant :)

PS : J'ai des -1 sur mes messages précédents, c'est parce que je me suis mal exprimé ?

PS : J'ai des -1 sur mes messages précédents, c'est parce que je me suis mal exprimé ?

Moufle

Je pense plutôt au passage d'un moinsunneur.


En gros, quand tu boucles sur les catégories pour afficher les checkboxes, tu vérifies à chaque fois si elle a été choisie pour le produit. Si oui, tu ajoutes checked="checked".

Note au passage que le principe serait exactement le même si tu avais une liste avec choix multiple.

+0 -0

tu vérifies à chaque fois si elle a été choisie pour le produit

Mais comment je pourrais-faire ?

1
2
3
4
5
<?php foreach ( $categories as $categorie ) { ?>
    <label class="checkbox">
    <input checked="checked" type="checkbox" name="productcategory[]" value="<?php echo $categorie['idMPL_Category']; ?>"><?php echo  $categorie["MPL_CategoryName"]; ?>    
    </label>
<?php } ?>

Là c'est la boucle qui affiche les catégorie, je vois vraiment pas comment je peux vérifier qu'elle à été choisie pour le produit :o

Tu as pourtant accès au produit au moment de cette boucle, non ?

Donc tu peux voir si $categorie est dans la liste de celles du produit…

Avec in_array(), par exemple  ;)

Pro-tip : pour colorer du PHP ET  du HTML, utilise html+php

1
2
3
4
5
<?php foreach ( $categories as $categorie ) { ?>
    <label class="checkbox">
    <input checked="checked" type="checkbox" name="productcategory[]" value="<?php echo $categorie['idMPL_Category']; ?>"><?php echo  $categorie["MPL_CategoryName"]; ?>    
    </label>
<?php } ?>

+0 -0

Merci pour le pro-tip et merci de répondre <3

Tu as pourtant accès au produit au moment de cette boucle, non ?

Euh oui mais l'info dont j'ai besoin se situe dans la table qui relie la table produit à catégorie, donc il faudrait que je fasse le modèle pour faire un select de la bonne info déjà non ?

Je n'ai jamais utilisé cette fonction je vais regarder la doc :o

Pour l'instant j'en ai deux

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php
function afficher_category(){
    global $pdo;
    try {
        $query = $pdo->prepare("SELECT * 
            FROM mpl_category
            ORDER BY idmpl_category");
        $query->execute();
        $categories = $query->fetchAll();
    }
    catch( PDOException $e ) {
        die('Erreur Mysql : '.$e->getMessage());
    }
    return $categories;
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
function afficher_produit($id){
    global $pdo;
    try {
        $query = $pdo->prepare("SELECT * 
            FROM mpl_products
            WHERE idmpl_products = :id");
        $query->bindValue(':id', $id, PDO::PARAM_INT);
        $query->execute();
        $produit = $query->fetch(PDO::FETCH_ASSOC);
    }
    catch( PDOException $e ) {
        die('Erreur Mysql : '.$e->getMessage());
    }
    return $produit;
};

La requête qui m'avait servi à insérer les catégorie associé au produit lors de "l'ajout d'un produit" est celle-ci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
function ajouter_product_has_category($category, $id){
    global $pdo;
    try {
        // $id = $pdo->lastInsertId();
        $query = $pdo->prepare("INSERT INTO mpl_category_has_mpl_products (MPL_Category_idMPL_Category, MPL_Products_idMPL_Products)
            VALUES (:category, :id)");
        $query->bindValue(':category', $category, PDO::PARAM_STR);
        $query->bindValue(':id', $id, PDO::PARAM_INT);
        $query->execute();
        return true;
    }
    catch(PDOException $e) {
        die('Erreur Mysql : '.$e->getMessage());
    }
    $query->closeCursor();
}

Ok au top ! Je pense que c'est bon, je te montre le var_dump de la fonction :)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
array (size=11)
  'idMPL_Products' => string '2' (length=1)
  'MPL_ProductName' => string 'Papier toilettes' (length=16)
  'MPL_ProductDescription' => string 'Papier toilettes blanc rouleau x6' (length=33)
  'MPL_ProductQuantity' => string '0' (length=1)
  'MPL_ProductPrice' => string '2' (length=1)
  'MPL_ProductPicture' => string '1380370196276.jpg' (length=17)
  'MPL_PrductFinalPrice' => string '0' (length=1)
  'MPL_TVA' => string '0' (length=1)
  'MPL_ProductStock' => string '0' (length=1)
  'MPL_Category_idMPL_Category' => string '1' (length=1)
  'MPL_Products_idMPL_Products' => string '2' (length=1)

Du coup il me reste à gérer la fonction in_array(), je l'utilise dans la vue ou dans le controller ? Si tu pouvais me montrer un peu comment je pourrais l'utiliser pour mon cas je t'en serais reconnaissant ! La doc PHP est sympa mais leurs exemples ne m'insipire pas souvent :/

Ah mince.. :(

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
function afficher_produit($id){
    global $pdo;
    try {
        $query = $pdo->prepare("SELECT * 
            FROM mpl_products, mpl_category_has_mpl_products
            WHERE idmpl_products = :id
            AND MPL_Products_idMPL_Products = :id");
        $query->bindValue(':id', $id, PDO::PARAM_INT);
        $query->execute();
        $produit = $query->fetch(PDO::FETCH_ASSOC);
    }
    catch( PDOException $e ) {
        die('Erreur Mysql : '.$e->getMessage());
    }
    return $produit;
};

Il est dans 2 catégories (portant l'id 1 et 4) :o en effet ça marche pas vraiment en faite !

Bah du coup je vois pas trop comment faire, récupérer le produit et les catégories qui lui sont associées…

Un truc de ce style ?

1
2
  AND MPL_Products_idMPL_Products = idmpl_products
  AND MPL_Category_idMPL_Category = idmpl_category

J'ai réussis je crois bien :)

J'ai tester sur phpMyAdmin en tout cas il m'a bien sélectionner les bons résultats mouahaha :D

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
function afficher_produit($id){
    global $pdo;
    try {
        $query = $pdo->prepare("SELECT * 
            FROM mpl_products
            INNER JOIN mpl_category_has_mpl_products ON idmpl_products = MPL_Products_idMPL_Products
            WHERE idmpl_products = :id");
        $query->bindValue(':id', $id, PDO::PARAM_INT);
        $query->execute();
        $produit = $query->fetch(PDO::FETCH_ASSOC);
    }
    catch( PDOException $e ) {
        die('Erreur Mysql : '.$e->getMessage());
    }
    return $produit;
}

Alors maintenant que j'ai la bonne requête, là où je comprends toujours pas comment faire c'est au niveau de mon checked… Vous avez une idée ? :o

En gros dans ma boucle tu m'a conseillé d'utiliser un in_array mais je vois pas trop, tu pourrais me lancer sur la piste stp ? :)

Merci encore !

En faite dans mon var_dump je n'ai pas encore tout à fait ce que je voudrais…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
array (size=11)
  'idMPL_Products' => string '3' (length=1)
  'MPL_ProductName' => string 'Essuie tout' (length=11)
  'MPL_ProductDescription' => string 'Essuie tout blanc rouleau x3' (length=28)
  'MPL_ProductQuantity' => string '0' (length=1)
  'MPL_ProductPrice' => string '2' (length=1)
  'MPL_ProductPicture' => string '1380151559764.jpg' (length=17)
  'MPL_PrductFinalPrice' => string '0' (length=1)
  'MPL_TVA' => string '0' (length=1)
  'MPL_ProductStock' => string '0' (length=1)
  'MPL_Category_idMPL_Category' => string '2' (length=1)
  'MPL_Products_idMPL_Products' => string '3' (length=1)

Sur PHPMyAdmin il me renvoie bien deux lignes : ex un sopalin qui se situe dans la catégorie 2 et un autre dans la catégorie 4. (MPL_Category_idMPL_Category)

Mais mon var_dump ne me renvoie qu'une catégorie associée :o

Tu utilises $query->fetch(), qui ne te retourne jamais qu'une seule ligne  ;)

Pour sélectionner un élément dans une liste de choix, il faut que, à la génération de la liste, on vérifie si la valeur choisie est la même que l'élément qu'on affiche. Pour ça, pas trop de souci :

1
2
3
4
5
6
7
8
<?php
foreach ($choix as $valeur => $etiquette) {
    echo "$etiquette ($valeur";
    if ($valeur_choisie == $valeur) {
        echo " — choisie !";
    }
    echo ")\n";
}

Pré-sélection d'option

Maintenant, quand on a une liste où on peut choisir plusieurs éléments (ce qui est le cas quand on a un <select multiple="multiple"> comme une série de <input type="checkbox" />), on ne va plus avoir une seule valeur choisie, mais une série. Du coup, on va devoir regarder si la valeur qu'on affiche est dans cette série.

1
2
3
4
5
6
7
8
<?php
foreach ($choix as $valeur => $etiquette) {
    echo "$etiquette ($valeur";
    if (in_array($valeur, $valeurs_choisies)) {
        echo " — choisie !";
    }
    echo ")\n";
}

Pré-sélection d'options multiples


Edit

Ici aussi, évite de poster deux sujets à la suite à deux heures d'intervalle, tu as l'édition qui permet d'ajouter du contenu à un message  ;)

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte