Mysql jointure

Résolu/Fermé
Programming_018 Messages postés 106 Date d'inscription vendredi 13 janvier 2017 Statut Membre Dernière intervention 14 mars 2024 - Modifié le 2 août 2019 à 12:46
Programming_018 Messages postés 106 Date d'inscription vendredi 13 janvier 2017 Statut Membre Dernière intervention 14 mars 2024 - 2 août 2019 à 12:30
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

jordane45 Messages postés 38142 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649
Modifié le 2 août 2019 à 12:25
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-poster-un-extrait-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://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
Je t'invite également à lire et à appliquer TOUT ce qui se trouve là : https://forums.commentcamarche.net/forum/affich-37584947-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 ){




1
jordane45 Messages postés 38142 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649
2 août 2019 à 12:27
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...
0
Programming_018 Messages postés 106 Date d'inscription vendredi 13 janvier 2017 Statut Membre Dernière intervention 14 mars 2024 7
2 août 2019 à 12:30
Bonjour Jodane45,

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