Mysql jointure [Résolu/Fermé]

Signaler
Messages postés
88
Date d'inscription
vendredi 13 janvier 2017
Statut
Membre
Dernière intervention
9 mars 2020
-
Messages postés
88
Date d'inscription
vendredi 13 janvier 2017
Statut
Membre
Dernière intervention
9 mars 2020
-
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.

1 réponse

Messages postés
29169
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
7 août 2020
2 674
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 : https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
Je t'invite également à lire et à appliquer TOUT ce qui se trouve là : https://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
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 56971 internautes nous ont dit merci ce mois-ci

Messages postés
29169
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
7 août 2020
2 674
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...
Messages postés
88
Date d'inscription
vendredi 13 janvier 2017
Statut
Membre
Dernière intervention
9 mars 2020
5
Bonjour Jodane45,

Merci pour tes explications
J'ai trouvé d'où viens le soucis bonne journée.