Partage
  • Partager sur Facebook
  • Partager sur Twitter

MYSQL Jointure

2 catégories avec produits

Sujet résolu
    15 juillet 2019 à 19:28:26

    Bonjour, 

    J'ai réalisé un panier en php session et  souhaiterai affiché plusieurs catégories avec leurs produits.

    j'ai utilisé la fonction "Inner join" pour joindre ma deuxième table,

    j'ai fait deux tables (une par catégories table 1= products table 2= pendent)

    Mais j'ai un problême avec les "ID" ([SQL] Erreur 1052).

    <form method="post" action="panier.php">	
               	
    <?php
    			$ids = array_keys($_SESSION['panier']);
    			if(empty($ids)){
    				$products = array();
    			}else{
    				$products = $DB->query('SELECT * FROM products INNER JOIN pendent WHERE id IN ('.implode(',',$ids).')');
    			}
    			foreach($products as $product):
    			?><br>
    			
    			                             
    	<h6><span class="name">Product name : </span><span class="name"><?= $product->name; ?></span><br>
    				                         	
    		<a href="monsite3/bague/<?= $product->id; ?>.jpg" class="img"> <img src="monsite3/bague/<?= $product->id; ?>.jpg" height="15%"></a><br>
    					                                 	                                 
    			<span class="price">Price : </span><span class="price"><?= number_format($product->price,2,',',' '); ?> €</span><br>
    				                                     	                                     
    				<span class="quantity">Quantity : </span><span class="quantity"><input type="text" name="panier[quantity][<?= $product->id; ?>]" value="<?= $_SESSION['panier'][$product->id]; ?>"></span><br>
    				                                         
    				    <span class="subtotal">Prix avec TVA : </span><span class="subtotal"><?= number_format($product->price * 1.,2,',',' '); ?> €</span><br>
    				                                            
    				         <span class="action">Supprimer : </span><span class="action">
    					    <a href="panier.php?delPanier=<?= $product->id; ?>" class="del"><img src="del.png"></a></span><br>
    					    
    					                                        
    					                                     			                         	
    					                                 
    		 
    
    		 
    	<?php endforeach; ?>





    • Partager sur Facebook
    • Partager sur Twitter
      15 juillet 2019 à 20:50:22

      Bonjour,

      Une jointure nécessite de préciser la condition de jointure avec le mot clé ON ...

      Un peu de recherche sur les jointures te fera du bien je pense ...

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        15 juillet 2019 à 21:21:25

        Merci je viens de mater pour les ON 

        Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de '.name, pendent.price = products.price WHERE id IN (2,1)' à la ligne 1 in C:\wamp64\www\test site panier\db.class.php on line 32

        2

        <form method="post" action="panier.php">	
                   	
        <?php
        			$ids = array_keys($_SESSION['panier']);
        			if(empty($ids)){
        				$products = array();
        			}else{
        				$products = $DB->query('SELECT products.id, products.name, products.price FROM products INNER JOIN pendent ON pendent.id = products.id, pendent.name = products.name, pendent.price = products.price WHERE id IN ('.implode(',',$ids).')');
        			}
        			foreach($products as $product):
        			?><br>
        			
        			                             
        	<h6><span class="name">Product name : </span><span class="name"><?= $product->name; ?></span><br>
        				                         	
        		<a href="monsite3/bague/<?= $product->id; ?>.jpg" class="img"> <img src="monsite3/bague/<?= $product->id; ?>.jpg" height="15%"></a><br>
        					                                 	                                 
        			<span class="price">Price : </span><span class="price"><?= number_format($product->price,2,',',' '); ?> €</span><br>
        				                                     	                                     
        				<span class="quantity">Quantity : </span><span class="quantity"><input type="text" name="panier[quantity][<?= $product->id; ?>]" value="<?= $_SESSION['panier'][$product->id]; ?>"></span><br>
        				                                         
        				    <span class="subtotal">Prix avec TVA : </span><span class="subtotal"><?= number_format($product->price * 1.,2,',',' '); ?> €</span><br>
        				                                            
        				         <span class="action">Supprimer : </span><span class="action">
        					    <a href="panier.php?delPanier=<?= $product->id; ?>" class="del"><img src="del.png"></a></span><br>
        					    
        					                                        
        					                                     			                         	
        					                                 
        		 
        
        		 
        	<?php endforeach; ?>

        -
        Edité par FélixLefebure 15 juillet 2019 à 21:55:33

        • Partager sur Facebook
        • Partager sur Twitter
          15 juillet 2019 à 22:34:20

          Encore besoin d'apprendre...

          Il me paraît étrange que ta condition de jointure ait besoin de tant d'égalité (qu'il faut séparer par des AND, d'où l'erreur...).

          Quelle est la structure des 2 tables ? Avec un exemple de données si possible ?

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            15 juillet 2019 à 23:12:50

            Oui je te le fait pas dire, 

            j'ai lus Mysql sur openclassroom et Le tuto de graphik art pour faire un panier Php MYSQL en session.

            Alors ma base de donnée MYSQL s'apelle :

            Tuto > (table 1 "products") >id Name Price Quantity
                     > (table 2 "Pendent") >Id Name Price Quantity 

            exemple : Product name "Blue"
                           Price 8.50 euros 
                           Quantity 1 

            je n'ai pas fait de table catégorie.


            un grand merci pour l'aiguillage.

            Je viens de mater pour les AND 

            <form method="post" action="panier.php">	
                       	
            <?php
            			$ids = array_keys($_SESSION['panier']);
            			if(empty($ids)){
            				$products = array();
            			}else{
            				$products = $DB->query('SELECT products.id, products.name, products.price FROM products INNER JOIN pendent ON products.id != pendent.id AND products.name != pendent.name AND products.price != pendent.price');
            			}
            			foreach($products as $product):
            			?><br>
            			
            			                             
            	<h6><span class="name">Product name : </span><span class="name"><?= $product->name; ?></span><br>
            				                         	
            		<a href="monsite3/bague/<?= $product->id; ?>.jpg" class="img"> <img src="monsite3/bague/<?= $product->id; ?>.jpg" height="15%"></a><br>
            					                                 	                                 
            			<span class="price">Price : </span><span class="price"><?= number_format($product->price,2,',',' '); ?> €</span><br>
            				                                     	                                     
            				<span class="quantity">Quantity : </span><span class="quantity"><input type="text" name="panier[quantity][<?= $product->id; ?>]" value="<?= $_SESSION['panier'][$product->id]; ?>"></span><br>
            				                                         
            				    <span class="subtotal">Prix avec TVA : </span><span class="subtotal"><?= number_format($product->price * 1.,2,',',' '); ?> €</span><br>
            				                                            
            				         <span class="action">Supprimer : </span><span class="action">
            					    <a href="panier.php?delPanier=<?= $product->id; ?>" class="del"><img src="del.png"></a></span><br>
            					    
            					                                        
            					                                     			                         	
            					                                 
            		 
            
            		 
            	<?php endforeach; ?>





            -
            Edité par FélixLefebure 15 juillet 2019 à 23:41:21

            • Partager sur Facebook
            • Partager sur Twitter
              16 juillet 2019 à 0:00:09

              Tes 2 tables sont identiques ?

              Et c'est quoi ces != ? Le retour de ta requête doit être space !

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                16 juillet 2019 à 0:27:49

                https://openclassrooms.com/fr/courses/1959476-administrez-vos-bases-de-donnees-avec-mysql/1961564-selectionnez-des-donnees#/id/r-1978757


                j
                'a trouver sa ci-dessus "!=" sa veut dire différent ba la je doit avouer je suis complètement perdue.

                oui et non juste les ID sont pareils sur mes 2 tables.


                • Partager sur Facebook
                • Partager sur Twitter
                  16 juillet 2019 à 9:33:10

                  FélixLefebure a écrit:

                  je suis complètement perdue

                  Oui cela semble évident :D

                  Ta requête :

                  SELECT products.id, products.name, products.price
                  FROM products INNER JOIN pendent
                  ON products.id != pendent.id AND products.name != pendent.name AND products.price != pendent.price

                   Signifie : donne moi la liste de tous les produits liés à tous les "pendent" qui n'ont aucune valeur en commun. Donc chaque produit sera lié à chaque "pendent" qui n'a pas exactement les mêmes valeurs ... je ne pense pas que cela ait un sens ...

                  FélixLefebure a écrit:

                  juste les ID sont pareils sur mes 2 tables.

                  Euh ... tu écris plus haut :

                  FélixLefebure a écrit:

                  (table 1 "products") > id Name Price Quantity

                  (table 2 "Pendent") > id Name Price Quantity 

                  Pour moi tes deux tables sont identiques ... elles ont les mêmes colonnes (même si ces colonnes ne contiennent pas les mêmes valeurs).

                  FélixLefebure a écrit:

                  J'ai réalisé un panier en php session et  souhaiterai affiché plusieurs catégories avec leurs produits

                  Alors excuse moi, mais je vais essayer de reprendre les choses depuis le début. Tu veux un système de panier, avec des produits et des catégories.

                  Il faut donc un modèle au minimum de ce genre :

                  • categorie ( id_categorie [pk], nom )
                  • produit ( id_produit [pk], libelle, prix_unitaire, id_categorie [fk] )
                  • client ( id_client [pk], num_session [unique], nom, prenom, email, motpasse )
                  • panier ( id_panier [pk], id_client [fk], date_panier )
                  • panier_produit ( id_panier [pk][fk], id_produit [pk][fk], quantite, prix_unitaire )

                  Cela fait donc 5 tables ... et aucune n'est identique tu remarqueras ...

                  Tu commences par enregistrer tes catégories dans la table categorie, chacune aura ainsi son id unique.

                  Tu enregistres ensuite tes produits dans la table produit, en rappelant l'id de la catégorie associée. Au passage n'est-il pas souhaitable qu'un article puisse être associé à plusieurs catégories ?

                  Lorsqu'un client se connecte tu enregistres sa session dans la table client pour lui donner un id unique.

                  Lorsqu'un client enregistré choisi un premier produit, tu crées un panier avec l'id du client et la date éventuellement, et tu relies le panier et le produit choisi dans la table panier_produit.

                  A chaque nouveau produit choisi tu rajoutes un enregistrement dans la table panier_produit ...

                  Dans tous les cas, je te conseille fortement la lecture complète du cours MySQL (que tu apparemment seulement survolé trop rapidement) ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    17 juillet 2019 à 15:12:03

                    Super les explications j'y vois un peu plus clair !

                    je te remercie vivement et vais réviser sa .

                    Je ne compte pas faire d'espace client, le visiteurs commande les produits et je transmet a paypal par l'api le contenue du panier.

                    puis je changer la table "client" et ne garder que le " num_session [unique]"
                    ??


                    -
                    Edité par FélixLefebure 17 juillet 2019 à 15:20:54

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 juillet 2019 à 16:40:31

                      FélixLefebure a écrit:

                      puis je changer la table "client" et ne garder que le " num_session [unique]"

                      Oui, à ce moment là, le modèle serait simplement :

                      • categorie ( id_categorie [pk], nom )
                      • produit ( id_produit [pk], libelle, prix_unitaire, id_categorie [fk] )
                      • panier_produit ( num_session [pk], id_produit [pk][fk], quantite, prix_unitaire )
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        17 juillet 2019 à 23:02:53

                        Bonsoir, 

                        je viens de faire les relations pour ma clé primaire et étrangères.

                        par contre je pêche pour les relations du "panier_produit"

                        Je bloque sur "
                        Chaque table doit définir une clé primaire, et une table ne peut avoir qu'une seule clé primaire."

                        du coup j'ai essayer d'enlever "num_session" pour définir "id_produit" en clé primaire et le relier a "id_catégorie


                        Mon schéma pour y voir clair :



                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 juillet 2019 à 0:30:34

                          Bonsoir.

                          Non, la colonne id_produit de la table panier_produit ne peut pas être une clé primaire étant donné que tu peux avoir plusieurs enregistrements dans la table avec le même identifiant de produit.

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

                            18 juillet 2019 à 1:25:07

                            ok merci beaucoup,

                            sa marche je viens d'essayer sa je pence que c'est bon non ? 

                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 juillet 2019 à 9:34:55

                              Pour moi la clé primaire de la table panier_produit devrait être composée sur les deux colonnes num_session et id_produit.

                              CREATE TABLE category (
                              	id_category INT UNSIGNED NOT NULL PRIMARY KEY,
                              	name VARCHAR(60) NOT NULL
                              ) Engine=INNODB;
                              
                              CREATE TABLE product (
                              	id_product INT UNSIGNED NOT NULL PRIMARY KEY,
                              	name VARCHAR(60) NOT NULL,
                              	price DECIMAL(10,2) NOT NULL,
                              	id_category INT UNSIGNED NOT NULL,
                              	FOREIGN KEY ( id_category ) REFERENCES category( id_category )
                              ) Engine=INNODB;
                              
                              CREATE TABLE basket (
                              	id_session INT UNSIGNED NOT NULL,
                              	id_product INT UNSIGNED NOT NULL,
                              	price DECIMAL(10,2) NOT NULL,
                              	quantity DECIMAL(10,3) NOT NULL,
                              	PRIMARY KEY ( id_session, id_product ),
                              	FOREIGN KEY ( id_product ) REFERENCES product( id_product )
                              ) Engine=INNODB;
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                18 juillet 2019 à 15:21:23



                                sa devrai le faire je pence ;) 

                                plus qu'adapter le code php.

                                edit : 
                                Comment récupérer L'id session ?

                                -
                                Edité par FélixLefebure 18 juillet 2019 à 18:07:02

                                • Partager sur Facebook
                                • Partager sur Twitter

                                MYSQL Jointure

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown