Site e-commerce

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

a marqué ce sujet comme résolu.

Pouahlala, comment je peux faire ça ? Ne serait-ce que "regarder" si le produit courant est le même que le produit précédent :o

Moufle

Ben il faut faire en sorte que le programme se souvienne de ce qu'il avait manipulé juste avant… Avec une variable, par exemple  ;)

Actuellement il sont classé par catégorie, pour que ça fonctionne avec ta méthode il faudrait qu'ils soient classé par produit en plus si je comprends bien.

Moufle

Là, j'avoue que ça dépend de ce que tu souhaites. Mais tu as dit vouloir une ligne avec le produit et toutes ses catégories, du coup, oui.

Je pensais faire une boucle dans une boucle mais j'ai vite renoncer en voyant le résultat ^^

Moufle

Tu n'en as effectivement pas besoin, il suffit de bien réfléchir à qu'est-ce qu'il se passe dans la boucle principale.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$reponse = $bdd->query(/* La requête */);
/* On initialise la variable comme étant une chaîne vide en dehors de la boucle… */
$precedent = '';
while ($donnees = $reponse->fetch())
{
    /* … parce qu'on en a besoin ici pour tester si on a changé de produit. Et
     * à la première itération, c'est presque le cas. Le fait d'avoir défini
     * comme une chaîne vide avant permet de faire en sorte que l'ID du
     * premier produit est considéré comme différent de celui d'avant qui,
     * pourtant n'existe pas */
    if ($precedent != $donnees['MPL_product_id']) {
        if ($precedent !== '') {
            echo '</td></tr>';
        }
        echo '<tr><th>'
            . htmlspecialchars($donnees['MPL_product_name'])
            . '</th></tr>';
    }
    /* On affiche de toute manière la catégorie */
    echo htmlspecialchars($donnees['MPL_Category_name']);
    /* Si on avait mis cette ligne en début de boucle, on aurait une condition
     * qui serait toujours respectée, donc on n'afficherait jamais le nom de
     * l'article. Et là, donc, on aura le nom du produit de la boucle
     * précédente dans la boucle suivante (tu suis ?) */
    $precedent = $donnees['MPL_Category_id'];
}
$reponse->closeCursor();

Une gestion d'éléments catégorisés (ici dans un tableau)

+1 -0

Je suis pas sûr d'avoir tout saisie mais je regarderai demain avec une nouvelle tête ^^

Déjà j'ai refais ma requête, je pense avoir saisie ce système de "vrai" jointure. Néanmoins, quelle est la réelle différence entre ce que je faisais avant et maintenant ? :o Je gagne en performance ? C'est plus propre ?`

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php
function product_has_category(){
    global $pdo;
    try {
        $query = $pdo->prepare("SELECT * 
            FROM MPL_Category_has_MPL_Products
            INNER JOIN MPL_Products
            ON MPL_Products_idMPL_Products = idMPL_Products
            INNER JOIN MPL_Category
            ON MPL_Category_idMPL_Category = idMPL_Category
            ORDER BY idMPL_Products");
        $query->execute();
        $produits = $query->fetch();
        return $produits;
    }
    catch( PDOException $e ) {
        die('Erreur Mysql : '.$e->getMessage());
    }
    $query->closeCursor();
};

Autre chose, je travail en MVC, et quand j'te vois mélanger requête et PHP, je m'y retrouve moins, j'ai plus l'habitude ^^ c'est terrible…

J'te vois utiliser un while, pourquoi pas un foreach ? Et une chose qui me perturbe c'est tes <td> / <th> / <tr> , Etant donné que je suis déjà à l'intérieur de mon tableau je n'ai qu'un <tr> qui englobe des <td>. M'enfin là j'suis naze donc c'est peut être pour ça que je comprends pas très bien, comme je l'ai dis je reviendrais sur le code avec une tête neuve, ça marchera peut être ;)

En tout cas, merci beaucoup de passer du temps à répondre à mes questions. J'espère ça servira aussi à d'autres !

Je suis pas sûr d'avoir tout saisie mais je regarderai demain avec une nouvelle tête ^^

Déjà j'ai refais ma requête, je pense avoir saisie ce système de "vrai" jointure. Néanmoins, quelle est la réelle différence entre ce que je faisais avant et maintenant ? :o Je gagne en performance ? C'est plus propre ?

Moufle

Le second pour sûr, le premier dépend du moteur de base de données (InnoDB, MyISAM, etc.)

Autre chose, je travail en MVC, et quand j'te vois mélanger requête et PHP, je m'y retrouve moins, j'ai plus l'habitude ^^ c'est terrible…

J'te vois utiliser un while, pourquoi pas un foreach ?

Moufle

Du coup, c'est un bon exercice que d'adapter, non ? Effectivement, avec du MVC bien fait, on a un foreach, mais c'est la seule chose qui change.

Et une chose qui me perturbe c'est tes <td> / <th> / <tr> , Etant donné que je suis déjà à l'intérieur de mon tableau je n'ai qu'un <tr> qui englobe des <td>.

Moufle

A adapter évidemment pour le rendu que tu souhaites. Là, mon idée c'est d'avoir une ligne par produit et une cellule dans laquelle tu mets toutes les catégories.

+1 -0

Le second pour sûr, le premier dépend du moteur de base de données (InnoDB, MyISAM, etc.)

Je viens de regarder, le moteur de base que j'ai pris est InnoDB. Je connais pas trop les différences entres tous, faudrait que je regarde.

A adapter évidemment pour le rendu que tu souhaites. Là, mon idée c'est d'avoir une ligne par produit et une cellule dans laquelle tu mets toutes les catégories.

J'ai essayé d'adapter, je crois que c'est pas encore ça ^^ J'aurais jamais trouvé cette méthode tout seul, et étant donné qu'elle ne vient pas de moi, j'ai un peu du mal à l'appliquer.. Je sur la bonne voie au moins ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php foreach ( $produits as $produit ) { ?>
<tr>
    <?php 
    if ($precedent != $produit['idMPL_Products']) {
        if ($precedent !== '') {
            echo '';
        }
        echo '<td>' . $produit["MPL_ProductName"] . '</td>';
    } 
    ?>
    <td><?php echo $produit["MPL_CategoryName"];?></td>
    <?php $precedent = $produit['idMPL_Category'];?>
    <td class="hidden-phone"><?php echo $produit["MPL_ProductPrice"]; ?> &#x20AC;</td>
    <td class="centered">
        <button value="<?php echo $produit['idMPL_Products']; ?>" formaction="?module=product&amp;action=modifier&amp;id=<?php echo $produit['idMPL_Products']; ?>" formmethod="post" class="btn btn-primary btn-xs" type="submit"><i class="fa fa-pencil"></i></button>                                  
    </td>
    <td>
        <div class="centered">
            <label>
                <input type="checkbox" name="choix[]" value="<?php echo $produit['idMPL_Products']; ?>">
            </label>
        </div>
    </td>
</tr>
<?php } ?>

Bonjour ! :)

J'ai réglé le soucis, étant donné que je savais pas trop moi même ce que je voulais comme rendu dans le tableau, forcément ça arrange pas :)

J'arrive à avancer sans trop de problème sur le reste mais il me reste néanmoins toujours ce problème de modification de catégories associées au produits :/ Si j'ai bien compris, il me manque dans $produit toutes les catégories associées, étant donné que je n'en ai qu'une seule !

Comment je pourrais faire pour construire le tableau des catégories à partir des résultats de ma requête ? Et surtout, où je le fais ? Directement dans le modèle ? :o

Pour ma part, comme ça, je ferais dans le modèle, en bouclant simplement sur les résultats d'une requête comme la tienne et en reconstruisant le tableau (rien de bien sorcier, vraiment : il suffit de prendre chaque résultat et de mettre les colonnes liées aux catégories dans un autre tableau), mais c'est la seule chose qui me vienne en tête, et ça me dérange un peu. A l'occasion, je regarderai comment fonctionne Doctrine dans ce genre de cas.

+1 -0

Que tu l'aies déjà fait ou pas, tu sais parcourir un tableau (même si ce dernier contient d'autres tableaux ou même des objets) et tu sais accéder aux éléments d'un tableau (ou aux propriétés/membres/attributs d'un objet), non ?

Ben il suffit de mettre un peu ça ensemble, avec un petit indice supplémentaire : boucler sur un jeu de résultats SQL ou sur un tableau, c'est un peu pareil, au final.  ;)

+1 -0

Bon c'est sûrement tout bête mais j'ai du mal à sortir ce que je veux

Ici, c'est ma requête qui me ressort $produit

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
function product_has_category(){
    global $pdo;
    try {
        $query = $pdo->prepare("SELECT * 
            FROM MPL_Category_has_MPL_Products
            INNER JOIN MPL_Products
            ON MPL_Products_idMPL_Products = idMPL_Products
            INNER JOIN MPL_Category
            ON MPL_Category_idMPL_Category = idMPL_Category
            ORDER BY idMPL_Products DESC");
        $query->execute();
        $produits = $query->fetchAll();
        while ( ) {

        }
        return $produits;
    }
    catch( PDOException $e ) {
        die('Erreur Mysql : '.$e->getMessage());
    }
    $query->closeCursor();
};

Est-ce que c'est ici que je dois construire un tableau, dans le while ? Si oui comment je peux réellement le faire ? Je suis un peu pommé :(

Utiliser un tableau, ça, c'est pas un problème. Avec un var_dump j'arrive à m'y retrouver. Mais le créer à partir d'un résultat comme ça…

Là j'ai un p'tit exemple de ce que me donne la requête pour l'instant Exemple

Oui oui ça c'est déjà fait, seulement quand je veux utiliser ce tableau pour dire que tel produit est associé à x catégorie, seulement une catégorie sur les x sera affiché :/

Ymox m'a proposé de faire un tableau de catégorie associée pour que je les chope plus facilement, et c'est ici que je galère ^^

+0 -0

En fait il y a deux manières:

soit tu continues avec des requêtes jointes et tu fais :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$query = $pdo->query("SELECT MPL_Products.*, MPL_Category.name AS category_name 
            FROM MPL_Category_has_MPL_Products
            INNER JOIN MPL_Products
            ON MPL_Products_idMPL_Products = idMPL_Products
            INNER JOIN MPL_Category
            ON MPL_Category_idMPL_Category = idMPL_Category
            ORDER BY idMPL_Products DESC");
$lastId = 0;
$finalArray = [];
$currentProduct = null;
$produits = $query->fetchAll(PDO_FETCH_ASSOC);
foreach($produits as $produit){
    if($produit['id'] != $lastId){//si on est en train d'étudier le premier produit ou un autre produit
        if($currentProduct != null){
             $finalArray[] = $currentProduct;
        }
        $currentProduct = $produit;
        $lastId = $produit['id'];
        $currentProduct['categories'][] = $produit['category_name'];
    }
    else{
        $currentProduct['categories'][] = $produit['category_name'];
    }
}
return $finalArray;

C'est un peu plus chiant à coder mais c'est performant, alors que la méthode simple te permettra de faire une requête par produit

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
$query = $pdo->query("SELECT * FROM MPL_Products");
$produits = $query->fetchAll(PDO_FETCH_ASSOC);
foreach($produits as &$produit){//le & c'est pour indiquer une référence, pour dire qu'on va modifier le tableau lui même
    $produit['categories'] = $pdo->query("SELECT * FROM  MPL_Category, MPL_Category_has_MPL_Products 
    WHERE MPL_Category_has_MPL_Products.id_category = MPL_Category.id 
        AND MPL_Category_has_MPL_Products.id_product = 
            ".intval($produit['id'])
    )->fetchAll(PDO_FETCH_ASSOC);
}
unset($produit);//bug de php dans les foreach avec référence
return $produits;
+1 -0

C'est parce que je travaille en MVC et je pensais que c'était une fonction que tu avais faite ^^

Etant donné que ton return tu le fais qu'après le foreach (qui évidemment serait dans une "vue" pour moi), comment je pourrais découper tout ça moi ? Je sens que je vais devoir faire plusieurs fonctions du coup non ?

+0 -0

Ah, le "return" est dû au fait que je pensais que tu allais mettre ça dans une fonction mais perso je n'ai pas mis le prototype et les acolades par pure flemme de devoir faire l'indentation ^^

Les bouts de code que je t'ai passé te permettent de générer le tableau qui va bien. Dans ta vue, tu devras ensuite le parcourir pour l'afficher comme tu le veux.

Justement je voudrais avoir une seule et même fonction pour tout ce code :p

Si c'est possible techniquement, est-ce normal d'avoir 36 erreurs d'illegal string ? J'arrive même pas à tester ton "tableau" pour voir ce qu'il pourrait donner dans un var_dump damned ! :'(

Avant de te montrer les erreurs, je voudrais déjà savoir si je peux partir de la requête que j'avais faite qui me retournait $produit. Est-ce qu'à partir de cette requête, en plus qu'elle me retourne les informations dont j'avais besoin, peut intégrer également dans un sous tableau les catégories associées au produit ? Ou je dois re-faire carrément une autre fonction à part ?

Ymox m'avait aidé pour la VUE, avec une méthode qui consistait à chercher dans un tableau IN_ARRAY() : Ci-dessous.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php                   
foreach ( $categories as $check => $categorie) { 
?>
    <label class="checkbox">
        <input
<?php
    if (in_array($categorie['idMPL_Category'], $produit)) {
?>
        checked="checked"
<?php
    }
?>
        type="checkbox" name="productcategory[]" value="<?php echo $categorie['idMPL_Category']; ?>"><?php echo  $categorie["MPL_CategoryName"]; ?>
    </label>
<?php
}
?>

Le but était qu'en gros, lorsque je viens modifier un produit (et que j'arrive sur la page modifier) j'affiche dans un premier temps la liste de toutes les catégories, via checkbox.. mais que les checkbox soient "checké" pour chaque catégorie associé au produit :o

Donc en gros ce qu'il me manque c'est que dans $produit il y ai bien toutes les info que j'ai besoin, entres autres "toutes" les catégories associées ^^

EDIT :

En gros avec cette requête, juste avant le return je voudrais créer un sous-tableau mais je sais juste pas trop comment m'y prendre, je vois même pas quoi mettre après mon égal :p

Je suis sûr que je suis pas loin !

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function product_has_category(){
    global $pdo;
    try {
        $query = $pdo->prepare("SELECT * 
            FROM MPL_Category_has_MPL_Products
            INNER JOIN MPL_Products
            ON MPL_Products_idMPL_Products = idMPL_Products
            INNER JOIN MPL_Category
            ON MPL_Category_idMPL_Category = idMPL_Category
            ORDER BY idMPL_Products DESC");
        $query->execute();
        $produits = $query->fetchAll();
        $produits['categories'] = ???
        return $produits;
    }
    catch( PDOException $e ) {
        die('Erreur Mysql : '.$e->getMessage());
    }
    $query->closeCursor();
}
+0 -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