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 :

Ajout au panier avec plusieurs tables [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Ajout au panier avec plusieurs tables
    Bonjour,

    Je suis en train de réaliser une boutique web avec des tutos pour un ami où j’apprends sur le tas et je rencontre un problème au niveau de l'ajout d'un article à mon panier venant de tables différentes.
    Voici ce qui marche:
    Mon panier =
    Code php : 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
    25
    26
    27
    <?php
    $ids = array_keys($_SESSION['panier']);
    if(empty($ids)) {
    $products = array();    
    }
    else {
    $products = $DB->query('SELECT * FROM products WHERE id IN ('.implode(',',$ids).')');
    }
    foreach ($products as $product):
    ?>
     
    <div class="produitpanier">
     
    <span class="nom"><p> <?= $product->lien_article; ?> </p></span>
    <span class="prix"><p> <?= number_format($product->prix,2,',',' '); ?> &euro;</p></span>
    <span class="quantity"><input class="barqte" type="text" name="panier[quantity][<?= $product->id; ?>]" value="<?= $_SESSION['panier'][$product->id]; ?>" ></span>    
    <span class="supp"><p> <a href="panier.php?delPanier=<?= $product->id; ?>"> <img src="images/cb_prod.png" /></a> </p></span>
     
    </div>
     
    <?php endforeach; ?>
     
    <input class="recalculer" type="submit" value="Recalculer" >
     
    <div id="produittotal" >
    <p> Total :</p> <span class="total"><strong> <?= number_format($panier->total(),2,',',' '); ?> &euro; </strong></span>
    </div>

    ajout au panier =
    Code php : 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
     
    <?php
    require '_header.php';
    $json = array('error' => true);
    if(isset($_GET['id'])) {
    	$product = $DB->query('SELECT id FROM products WHERE id=:id', array('id' => $_GET['id']));
    	if(empty($product)){			
    		$json['message'] = "Ce produit n'existe pas";
    	}
    	$panier->add($product[0]->id);
    	$json['error'] = false;
    	$json['total'] = $panier->total();
    	$json['count'] = $panier->count();
    	$json['message'] = "Le produit a bien ete ajoute a votre panier ";
    }
    else {
    	$json['message'] = "Vous n'avez pas selectionné de produit à ajouter au panier";
    }
    echo json_encode($json);

    Fonction de mon panier =
    Code php : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    <?php
    class panier {
    	private $DB;
    	public function __construct($DB) {
    		if(!isset($_SESSION)) {
    			session_start();		// initialise la session
    		}
    		if(!isset($_SESSION['panier'])) {
    			$_SESSION['panier '] = array();
    		}
    		$this->DB = $DB;
                    if(isset($_GET['delPanier'])) {
    			$this->del($_GET['delPanier']);
                    }
                    if(isset($_POST['panier']['quantity'])){
                            $this->recalc();
                    }
    	}
            public function recalc() {
                    foreach($_SESSION['panier']as $product_id => $quantity) {
                            if(isset($_POST['panier']['quantity'][$product_id])){
                                $_SESSION['panier'][$product_id] = $_POST['panier']['quantity'][$product_id];
                            }
                    }
            }
    	public function count(){
    		return array_sum($_SESSION['panier']);
    	}
    	public function total() {
    		$total = 0;
    		$ids = array_keys($_SESSION['panier']);
    		if(empty($ids)) {
    			$products = array();
    		}
    		else {
    			$products = $this->DB->query('SELECT * FROM products WHERE id IN ('.implode(',',$ids).')');
    		}
    		foreach($products as $product) {
    			$total += $product->prix * $_SESSION['panier'][$product->id];
    		}
    		return $total;
    	}
    	public function add($product_id) {
    		if(isset($_SESSION['panier'][$product_id])){
    			$_SESSION['panier'][$product_id]++;
    		}
    		else {
    			$_SESSION['panier'][$product_id] = 1;
    		}
    	}
    	public function del($product_id) {
    		unset($_SESSION['panier'][$product_id]);
    	}
    }

    connexion DB =
    Code php : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    <?php
    class DB{
    	private $host = 'localhost';                   
    	private $username = 'root';     
    	private $password = '';
    	private $database = 'panier';
    	private $db;
    	// Pour connection a une autre bdd
    	public function __construct($host = null, $username = null, $password = null, $database = null) {
    		if ($host != null){
    			$this->host = $host;
    			$this->username = $username;
    			$this->password = $password;
    			$this->database = $database;
    		}	// if ($host != null){
    		try {		// Gerer une erreur
    			$this->db = new PDO('mysql:host='.$this->host.';dbname='.$this->database, $this->username,
    			$this->password, array(
    				PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
    				PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
    			));
    		}	//try {}
    		catch(PDOException $e){
    			die('<h2>Impossible de se connecter a la base de donnee</h2>');
    		}	//	catch()
            }	//	public function __construct()
    	public function query($sql, $data = array()){
    		$req =$this->db->prepare($sql);
    		$req->execute($data);
    		return $req->fetchAll(PDO::FETCH_OBJ);
    	}
    }   //class DB{}
    ?>

    La page de mon livre =
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php $products = $DB->query('SELECT * FROM products'); ?>
    <?php foreach ($products as $product): ?>
    <div id="descriplivre" >
        <p> Book Artistique <p>
        <p> Format: A5 - 40 pages <p>
        <p> Style: Matt <p>
        </br ></br >
        <p> Prix: 28 € <p> 
        <div class="panier" >
            <a class="addPanier" href="addpanier.php?id=<?= $product->id=1; ?>" >Ajouter au panier</a>
        </div>
    </div>
    <?php endforeach ?>

    et ma page carte_postale =
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php $products_cp_carre = $DB->query('SELECT * FROM products_cp_carre'); ?>
    <?php foreach ($products_cp_carre as $product): ?>
    <div id="descripcp" >
        <p> Lot de 5 cartes postales <p>
        <p> Format: 16x16 cm <p>
        <p> Style: Matt <p>
        </br ></br >
        <p> Prix: 9 € <p> 
        <div class="panier" >
            <a class="addPanier" href="addpanier.php?id=<?= $product->id=20; ?>" > Ajouter au panier</a>
        </div>
    </div>
    <?php endforeach ?>

    et la structure de ma bdd =
    BDD = panier
    table1 = products = livreA5 avec l'id 1
    table2 = products_cp_carre = Cartes_Postales_carre avec l'id 20 (l'affichage de cette table n'est pas sur la page du livre).

    Donc mon problème est que l'ajout de mon livre marche, mais quand je me rends sur la page carte postale et que je veux ajouter l'article avec l'id 20, j’obtiens l'erreur suivante :
    Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 in C:\wamp\www\Monsite\boutique\db.class.php on line 35
    Je fais des tests en changeant la variable $products avec $products_cp_carre dans les codes du panier, mais je ne trouve toujours pas comment résoudre ce problème.
    Voilà j'espère que vous trouverez une solution à mon problème.
    Merci d'avance.

  2. #2
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Essaie d'enlever fetchAll et remplace-le par fetch ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $req->fetch(PDO::FETCH_OBJ);
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Donc en changeant fetchAll en fetch j'obtient :
    ( ! ) Notice: Trying to get property of non-object in ...
    Mais j'ai trouvé une solution pas très pratique, mais qui fonctionne: du coup j'ai mis tous mes produits dans la même table et j'ai ajouté WHERE id=(l'id que je veux afficher) dans ma boucle foreach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php $products = $DB->query('SELECT * FROM products WHERE id=30'); ?>
    <?php foreach ($products as $product): ?>
    Tableau de mon produit 
    <?php endforeach ?>
    Le problème c'est que je dois créer cette boucle pour chaque article(id) que je veux afficher et ça risque de faire beaucoup de code à la fin, mais
    avec ça j'affiche bien le produit que je veux sur ma page avec l'ajout au panier qui fonctionne bien.

    Je pense que je vais me contenter de cette méthode pour le moment, car je rencontre un autre problème, quand mon panier est vide j'obtiens :
    Notice: Undefined index: panier in C:\wamp\www\monsite\boutique\panier.class.php on line 31
    au niveau de ma fonction recalculer...

    Panier.class.php =
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    <?php
    	class panier {
    		private $DB;
     
    		public function __construct($DB) {
    			if(!isset($_SESSION)) {
    				session_start();		// initialise la session
    			}
    			if(!isset($_SESSION['panier'])) {
    				$_SESSION['panier '] = array();
    			}
    			$this->DB = $DB;
                                if(isset($_GET['delPanier'])) {
    				$this->del($_GET['delPanier']);
                                }
     
                                if(isset($_POST['panier']['quantity'])){
                                        $this->recalc();
                                }
    		}
     
                    public function recalc() {
                        foreach($_SESSION['panier']as $product_id => $quantity) {
                            if(isset($_POST['panier']['quantity'][$product_id])){
                                $_SESSION['panier'][$product_id] = $_POST['panier']['quantity'][$product_id];
                            }
                        }
                    }
     
    		public function count(){
    			return array_sum($_SESSION['panier']);
    		}
     
     
    		public function total() {
    			$total = 0;
    			$ids = array_keys($_SESSION['panier']);
    				if(empty($ids)) {
    					$products = array();
    				}
    				else {
    					$products = $this->DB->query('SELECT * FROM products WHERE id IN ('.implode(',',$ids).')');
    				}
     
     
     
    			foreach($products as $product) {
    				$total += $product->prix * $_SESSION['panier'][$product->id];
    			}
    			return $total;
    		}
     
    		public function add($product_id) {
    			if(isset($_SESSION['panier'][$product_id])){
    				$_SESSION['panier'][$product_id]++;
    			}
    			else {
    				$_SESSION['panier'][$product_id] = 1;
    			}
    		}
     
    		public function del($product_id) {
    			unset($_SESSION['panier'][$product_id]);
    		}
    	}
    Voilà j'attends vos solutions avec impatience.

  4. #4
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 597
    Points : 883
    Points
    883
    Par défaut
    Bonjour.
    Tu peux créer une liste des id des produits que tu veux visualiser
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php 
    $liste_des_id="'4','7','9','30'";
    $requete_01="SELECT * FROM products WHERE id IN (".$liste_des_id.")"; 
    $products = $DB->query($requete_01);
    ?>

    Yves
    Participez vous aussi !
    Message utile
    Discussion résolue

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Géniale merci pour cette méthode sa va bien m'aider.

    Aurais-tu une idée pour mon erreur quand mon panier est vide ? J'ai suivi des tutos et donc je ne comprends pas encore tout ce que je fais, peut-être ajouter une condition SI le panier est vide, mais je ne sais ou la placer.

  6. #6
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Tu fais un code objet. Ce serait plus propre que, à l'échelle de cet objet, tu ne manipules pas des variables de type session :
    Au stade de définition de ta classe, ce sont des données théoriques : donc je passerais en paramètres les variables dont j'ai besoin, et c'est au niveau de la page de convocation de la classe que je dis que c'est une variable de session.
    et cela donnerait ce genre de choses :

    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
     
    //Page appelante
    if(isset ($_SESSION['panier']) && sizeof($_SESSION['panier')>0){
    	$panier=new Panier($monPdo,$_SESSION['panier']);
    }
    elseif(isset ($_SESSION['panier'])){
    	echo 'impossible, votre panier est vide';
    }
     
    //Page classe
    protected $propriete1;
    protected $propriete2;
    //mais pas $db ici, juste à chaque fois dans les paramètres des méthodes concernées
    public function __construct($db,$panier){
    	//tu peux manipuler tes variables sans te soucier de leur origine...
    }
    Autre chose, je ne mets jamais une instanciation de PDO en propriété d'objet ailleurs, car si je veux mettre ensuite l'objet en session, il refusera, car il ne met pas de PDO en session... Alors à moins que tu ne souhaites jamais mettre ta classe en session, ce qui est possible, il faudra passer le PDO de ta base systématiquement en paramètres des méthodes qui l'utilisent dans ta classe, sans le "pérenniser" dans une propriété.

    Une dernière convention : les noms de classe commencent toujours par une majuscule.

    J'espère avoir été claire... et ne pas avoir dit trop de bêtises.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/08/2006, 22h04
  2. [VB 2005]Dataset avec plusieurs tables
    Par estelledany dans le forum Windows Forms
    Réponses: 3
    Dernier message: 29/05/2006, 14h25
  3. [MySQL] requete avec liaisons avec plusieurs tables
    Par pod1978 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 10/03/2006, 22h21
  4. Ajout de rubrique dans plusieurs table
    Par flo456 dans le forum ASP
    Réponses: 3
    Dernier message: 19/10/2005, 09h01
  5. historique avec plusieurs table
    Par Cybher dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/08/2005, 16h38

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