Mysql jointure [Résolu]

Messages postés
71
Date d'inscription
vendredi 13 janvier 2017
Statut
Membre
Dernière intervention
19 août 2019
-
Bonjour je voudrais vous posez une question peut-être bête mais qui me bloque vraiment.

Je programme du php dans le logiciel sublimetext3 et comme hébergeur je me sert du logiciel wamp.
Voilà ce qui se passe : Je voudrais faire une jointure entre 3 tables : clients, articles, panier

Pour que si jamais le clients clique à nouveau sur le bouton ajouter au panier et que l'article existe déjà dans son panier et bien que cela additionne juste 1 dans la colonne quantité.

Pour cela voici le script que j'ai effectué :


<?php


 if(isset($_GET['id']) AND !empty($_GET['id'])){
  $get_id = htmlspecialchars($_GET['id']);

  $article = $bdd->prepare('SELECT * FROM article WHERE id = ?');
  $article->execute(array($get_id));

  if($article->rowCount() == 1){
   $article = $article->fetch();
   $id_article = $article['id'];
   $titre = $article['titre'];
   $reference = $article['reference'];
   $contenu = $article['contenu'];
   $prixht = $article['prixht'];
   $promotion = $article['promotion'];
   $tva = $article['tva'];
   $quantite = $article['quantite'];
   $categorie = $article['categorie'];
  }else{
   die('Cet article n\'existe pas !');
  }

  if($_SESSION['email']){
   $clients = $bdd->prepare('SELECT * FROM clients WHERE email = ?');
   $clients->execute(array($_SESSION["email"]));


   if($clients->rowCount() == 1){
    $clients = $clients->fetch();
    $email = $clients['email'];
   }
  }else{
   header('Location: ../../');
  }

  if(isset($_GET['action']) AND !empty($_GET['action'])){

   $articlepanierexist = $bdd->prepare("SELECT * FROM clients,article,panier WHERE clients.email = panier.email and panier.id_article = article.id and panier.email = ?");
   $articlepanierexist->execute(array($_SESSION["email"]);

   $articlepanierexist = $articlepanierexist->fetch();
   $id = $articlepanierexist["id"];
   $quantite = $articlepanierexist['quantite'];

   if($articlepanierexist->rowCount == 1){
    $maj = $bdd->prepare("UPDATE panier SET quantite = ? WHERE id = ?");
    $maj->execute(array($quantite,$id));
   }else{
    $insertmbr = $bdd->prepare("INSERT INTO panier(id_article,email,article,quantite,datePanierAjouter) VALUES (?, ?, ?, ?, NOW())");
    $insertmbr->execute(array($id_article,$email,$titre,1));
   }


  }
 }
?>



Je tiens à préciser que tout fonctionne sauf l'update dans le panier voici ce que cela me sort comme erreur.

Notice: Trying to get property 'rowCount' of non-object in C:\wamp64\www\chemin\chemin\article.php on line 63


Mais par contre même avec cette erreur cela passe dans la fonction sinon de l'update se qui insère l'article comme ci c'était un nouveau. Je pense que j'ai un problème dans mes jointures.

Sachant que la ligne 63 = if($articlepanierexist->rowCount == 1){

EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Afficher la suite 

1 réponse

Meilleure réponse
Messages postés
26141
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 août 2019
1764
1
Merci
Bonjour,

1 - Merci de poster ton code CORRECTEMENT un indiquant le LANGAGE dans les balises de code. Cela permet d'avoir la coloration syntaxique ainsi que l'indentation.
Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

2 - Si ta question concernait réélement un souci de JOINTURE avec ta bdd mysql... il aurait fallut poster ta question dans le forum Mysql...

3 - Au final tu as posté au bon endroit.. car ce n'est pas un souci de jointure.
Déjà... ROWCOUNT ne s'utilise PAS sur des requêtes SELECT (comme indiqué dans la documentation officielle de PHP pour le PDO )
Vu que tu utilises PDO.. il faut correctement détecter les éventuelles erreurs dans les requêtes SQL.
Pour cela, il faut activer l'affichage des erreurs ET placer CHAQUE requête dans des blocs try/catch.
Applique ce qui indiqué ici : http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
Je t'invite également à lire et à appliquer TOUT ce qui se trouve là : http://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code

4 - la fonction ROWCOUNT, quoi qu'il en soit s'utiliser sur un "objet" de requête... pas sur l'array issu d'un fetch...
Bref... remplace ce bout de code
$articlepanierexist = $articlepanierexist->fetch();
$id = $articlepanierexist["id"];
$quantite = $articlepanierexist['quantite'];

if($articlepanierexist->rowCount == 1){

par
$res_articlepanierexist = $articlepanierexist->fetch();
$id = !empty($res_articlepanierexist ["id"]) ? $res_articlepanierexist ["id"] : NULL;
$quantite =!empty( $res_articlepanierexist ['quantite']) ?  $res_articlepanierexist ['quantite'] : 0

if($id ){




Cordialement,
Jordane

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 59102 internautes nous ont dit merci ce mois-ci

jordane45
Messages postés
26141
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 août 2019
1764 -
De plus.. attention...
Tu utilises le même nom de variables pour deux choses différentes
$articlepanierexist = $bdd->prepare("SELECT * FROM clients,article,panier WHERE clients.email = panier.email and panier.id_article = article.id and panier.email = ?");


$articlepanierexist = $articlepanierexist->fetch();


Soit c'est le prépare...
Soit le Fetch

Mais pas les trois .... faut donner des noms différentes...
Programming_018
Messages postés
71
Date d'inscription
vendredi 13 janvier 2017
Statut
Membre
Dernière intervention
19 août 2019
1 -
Bonjour Jodane45,

Merci pour tes explications
J'ai trouvé d'où viens le soucis bonne journée.
Commenter la réponse de jordane45