Affichage avec la fonction Count php

Résolu/Fermé
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022 - 11 janv. 2022 à 18:17
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022 - 12 janv. 2022 à 06:28
Bonjour,
Je sollicite votre aide car la fonction Count ne m'affiche pas le nombre exact des annonces générées par les membres(inscrits). J'ai essayé la requête sur PHPmYadmin avec les vrais valeurs et ça marche, mais pas dans le code.
Mes tables sont liées comme l'illustre la photo:


La colonne created_by_member est un booléen: 0 si l'annonce est créée par un utilisateur (non-inscrit), et 1 si l'annonce est créée par un membre (inscrit).

Dans notre cas, on s'intéresse aux membres(inscrits).

Voici mon code:
<?php
session_start();
include 'cnx.php';
include "header.php";
 
 
if(isset($_SESSION['id'])) {
   $session = intval($_SESSION['id']);
$telsession= intval($_SESSION['telephone']);
   $requser = $bdd->prepare('SELECT * FROM membres WHERE id=?');
   $requser->execute(array($session));
   $userinfo = $requser->fetch();


   $nbreannonce = $bdd->prepare("SELECT COUNT(*) FROM annonces
   WHERE
    annonces.created_by_member = ? AND annonces.telephone=?");
      $nbreannonce->execute(array($session, $telsession));
      $nbre= $nbreannonce->fetch();
?>


Et on echo le count:
<?php echo $nbre['COUNT(*)']?>


Uniquement pour le premier membre dont l'id =1, ça affiche correctement le nombre d'annonces qu'il a publié.
Les autres c'est 0.
A voir également:

9 réponses

jordane45 Messages postés 38371 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 janvier 2025 4 722
11 janv. 2022 à 18:30
Bonjour,

Pour commencer, tu devrais activer la gestion des erreurs PDO.
Pour ça, il faut suivre ce qui est indiqué ici :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs


Ensuite.. fais nous un var_dump des variables que tu passes à ta requête
//préparation de la requête et des variables
 $sql = "SELECT COUNT(*)
                FROM annonces
              WHERE annonces.created_by_member = ? 
                 AND annonces.telephone=?";

 $datas = array($session, $telsession);

var_dump($datas); //montres nous ce que ça t'affiche

//Execution de la requete
try{
  $requete = $bdd -> prepare($sql) ;
  $requete->execute($datas) ;
}catch(Exception $e){
  // en cas d'erreur :
   echo " Erreur ! ".$e->getMessage();
   echo " Les datas : " ;
  print_r($datas);
}

$nbre = $requete->fetchColumn(); // Récupère la première colonne depuis la première ligne d'un jeu de résultats



Une fois le var_dump affiché ... remplace tes "?" de ta requête par ces valeurs dans phpmyadmin et montre nous le résultat obtenu.



1
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
Modifié le 11 janv. 2022 à 19:25
BonjourJordane, la gestion des erreurs étant activée voici le nouveau code des requêtes:
<?php
session_start();
include 'cnx.php';
include "header.php";
 
 
if(isset($_SESSION['id'])) {
   $session = intval($_SESSION['id']);
$telsession= intval($_SESSION['telephone']);


   $sqluser = "SELECT * FROM membres WHERE id=?";

   $datauser=array($session);

var_dump($datauser);
//Execution de la requete
try{
    $requeteuser = $bdd -> prepare($sqluser) ;
    $requeteuser->execute($datauser) ;
    $userinfo= $requeteuser->fetch();
    }catch(Exception $e){
    // en cas d'erreur :
    echo " Erreur ! ".$e->getMessage();
    echo " Les datas : " ;
    print_r($datauser);
    }
    



//préparation de la requête et des variables
$sql = "SELECT COUNT(*)
FROM annonces
WHERE annonces.created_by_member = ? 
 AND annonces.telephone=?";

$datas = array($session, $telsession);

var_dump($datas); //montres nous ce que ça t'affiche

//Execution de la requete
try{
$requete = $bdd -> prepare($sql) ;
$requete->execute($datas) ;
}catch(Exception $e){
// en cas d'erreur :
echo " Erreur ! ".$e->getMessage();
echo " Les datas : " ;
print_r($datas);
}


$nbre = $requete->fetchColumn(); // Récupère la première colonne depuis la première ligne d'un jeu de résultats
?>


Le résultat du var_dump. Tu peux voir en commentaire ce que a donne en phpmydmin:
C:\wamp64\www\Projetsite\profil.php:16:
array (size=1)
  0 => int 2  //c'est bien l'id du membre
C:\wamp64\www\Projetsite\profil.php:46:
array (size=2)
  0 => int 2  //c'est bien l'id du membre
  1 => int 7178457 // Meme resultat sur phpmyadmin


Et l'erreur affichée:
Warning: Illegal string offset 'COUNT(*)' in C:\wamp64\www\Projetsite\profil.php on line 139
Cette ligne:
<?php echo $nbre['COUNT(*)']?>
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
Modifié le 11 janv. 2022 à 19:26
Petite modification dans le vardump
0
jordane45 Messages postés 38371 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 janvier 2025 4 722
11 janv. 2022 à 20:11

Warning: Illegal string offset 'COUNT(*)' in C:\wamp64\www\Projetsite\profil.php on line 139

Regarde le code, j'ai modifié ton fetch.
Il te suffit donc de faire :
<?php echo $nbre;


Par contre,
ce que je voudrais voir désormais.. c'est une capture écran de ton phpmyadmin avec la requête ci-dessous exécutée dedans...
SELECT COUNT(*)
 FROM annonces
 WHERE annonces.created_by_member = 2
     AND annonces.telephone = 7178457
0
jordane45 Messages postés 38371 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 janvier 2025 4 722 > jordane45 Messages postés 38371 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 janvier 2025
11 janv. 2022 à 20:14
au passage... un numéro de téléphone ne se stocke pas dans un champ INT mais dans un VARCHAR
Sinon, tu pers le "0" qui débute le numéro (si il y en a un..)
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
11 janv. 2022 à 20:31
En faisant echo $nbre, ça nous affiche 0.

Pour la capture d'écran lorsque annonces.created_by_member=2


N'oublions pas que created_by_member EST UN BOOLEEN:1 si c'est un membre, et 0 s'il est non-inscrit.

Capture d'écran de la même requête lorsque annonces.created_by_member=1

0
jordane45 Messages postés 38371 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 janvier 2025 4 722
11 janv. 2022 à 20:34

N'oublions pas que created_by_member EST UN BOOLEEN:1 si c'est un membre, et 0 s'il est non-inscrit.


Sauf que.. toi.. tu lui envois ça comme paramètres

array (size=2)
0 => int 2 //c'est bien l'id du membre
1 => int 7178457 // Meme resultat sur phpmyadmin


Hors.. 2 ( l'id du membre..) n'est pas un booleen ( 1 ou 0 ) ....

c'est d'ailleurs étonnant que tu ne stockes pas... à la place du booleen .. l' ID du membre qui a créé l'annonce.... ça serait plus logique..
(sinon.. comment fais tu le lien entre l'annonce et son créateur ?? )
1
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
11 janv. 2022 à 20:51
<< c'est d'ailleurs étonnant que tu ne stockes pas... à la place du booleen .. l' ID du membre qui a créé l'annonce.... ça serait plus logique..>>
==> Tu as raison, a serait plus logique. J'avais essayé précédemment à plusieurs reprises d'ajoutert dans la table annonces une colonne id_membre que j'ai également défini dans ma fonction insertAnnonce:
function insertAnnonce($created_by_member,$id_membre,$id_categorie,$id_ville,$pseudo,$telephone,$email,$titre,$description,$prix){
  global $bdd;
 

  $sql= "INSERT INTO annonces(created_by_member, id_membre,id_categorie,id_ville,pseudo,telephone,email,titre,description,prix) VALUES(?,?,?,?,?,?,?,?,?,?)";
  $datas= array($created_by_member, $id_membre,$id_categorie,$id_ville,$pseudo,$telephone,$email,$titre,$description,$prix);
  //Execution de la requete
  try{ //requete pour la première tabels
    $requete = $bdd->prepare($sql);
    $requete->execute($datas);
    return $bdd->LastInsertId();

  }catch(Exception $e){
    // en cas d'erreur :
    echo " Erreur ! ".$e->getMessage();
    echo " Les datas : " ; 
    print_r($datas);
    return false;
  }


if(isset($_POST['formannonce'])) {

  if(isset($_SESSION['id']) && !empty($_SESSION['id'])){
    $created_by_member=1;
$id_membre= $_SESSION['id'];
    $pseudo=$_SESSION['pseudo'];
    $telephone= $_SESSION['telephone'];
    $email= $_SESSION['email'];
  
} else {
$id_membre= 0;
  $pseudo = trim($_POST['pseudo']);
  $telephone= intval($_POST['telephone']);
  $email = trim($_POST['email']);
  $created_by_member=0;
}
    $id_ville= trim($_POST['villes']);  
    $titre = trim($_POST['titre']);  
    $prix= intval($_POST['prix']); 
    $description= trim($_POST['description']); 
    $id_categorie= trim($_POST['categorie']);
  

    $img1 = ($_FILES['img1']);
    $img2 = ($_FILES['img2']);
    $img3 = ($_FILES['img3']);
    $img4 = ($_FILES['img4']);
    $img5 = ($_FILES['img5']);


    //on créé l'annonce
    $id_annonce = insertAnnonce($created_by_member,$id_membre,$id_categorie,$id_ville,$pseudo,$telephone,$email,$titre,$description,$prix);
    // si on a bien un id_product, on upload et insère les images
    if(!empty($id_annonce)){
      savePhoto($id_annonce,$img1,$location);
      savePhoto($id_annonce,$img2,$location); 
      savePhoto($id_annonce,$img3,$location);
      savePhoto($id_annonce,$img4,$location);
      savePhoto($id_annonce,$img5,$location);
    echo"<h1 style= 'color: green; background-color: white; margin-top: 120px;'>Votre annonce a bien été déposée et sera publiée bientôt. 
    </h1>";
  
    }else{
      echo "Erreur : Aucun ID n'a été créé !";
    }
}


}

==> Le problème était que $id_membre ne pouvait pas être = 0, même lorsque l'utilisateur est non inscrit. J'ai donc enlevé cette colonne de la table pour ne laisser que le booléen
0
jordane45 Messages postés 38371 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 janvier 2025 4 722
11 janv. 2022 à 21:18
Tu ne peux pas la mettre à zéro ..ok .. mais par contre tu peux la mettre à NULL. ( il faut, bien entendu, autoriser cela dans le paramétrage de ton champ dans ta bdd ).

Quoi qu'il en soit,
Si tu veux conserver le fonctionnement que tu as mis en place actuellement... as tu compris où se trouvait ton erreur et comment la corriger ???
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
11 janv. 2022 à 21:38
<<Tu ne peux pas la mettre à zéro ..ok .. mais par contre tu peux la mettre à NULL. ( il faut, bien entendu, autoriser cela dans le paramétrage de ton champ dans ta bdd ). >>
Dans quelle partie de la bdd autorise-t-on le paramètrage?
Photo:


Et dans le code on fait $id_membre= null . C'est bien ça?

Je l'ai défini comme un index, mais lorsque j'essaie de faire la liasion entre les 2 table j'ai l'erreur:
error 1452 cannot add or update a child row a foreign key constraint fails

Y a-t-il un moyen de lier les 2 tables sans avoir à vider une d'elle, pour éviter l'erreur 1452?

<< Quoi qu'il en soit,
Si tu veux conserver le fonctionnement que tu as mis en place actuellement... as tu compris où se trouvait ton erreur et comment la corriger ???>>
=>Je pense que j'ai compris, je devrais remplacer annonces.created_by_member par annonces.id_membre, et le our est joué.
0
jordane45 Messages postés 38371 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 janvier 2025 4 722
11 janv. 2022 à 21:46
Pour paramétrer le null il suffit de cocher la petite case où est écrit le mot null .

Oui il faut bien simplement écrire $id_membre= null .

Par contre, ne définis pas de clé étrangère entre tes deux tables.
Pour le coup tu vas gérer toi-même la liaison.
En faisant ainsi, tu n'auras plus le message d'erreur.
1
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
11 janv. 2022 à 22:01
<<Pour le coup tu vas gérer toi-même la liaison.>>
Je n'ai pas bien compris:
1-Pour les annonces crées jusqu'à présent, je modifie les valeurs manuellment dans id_membre? Et donc il n' y aura pas de message d'erreurs.

<<Par contre, ne définis pas de clé étrangère entre tes deux tables. >>
2-Mais les tables ont besoin d'être liées pour que la colonne id_membre soit remplie lorsque le formulaire est soumis.
0
jordane45 Messages postés 38371 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 janvier 2025 4 722
11 janv. 2022 à 22:38

2-Mais les tables ont besoin d'être liées pour que la colonne id_membre soit remplie lorsque le formulaire est soumis

Déjà.. pour les deux tables .. je parle de annonce et de membres.
Et non.. il n'y a aucune obligation d'avoir une "liaison" .... et dans le cas présent, une clé étrangère ne te permettra pas de mettre des annonces pour les non-membres ...
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
11 janv. 2022 à 22:38
J'ai suivi tes instructions et tout a marché, j'ai pu même ajouté un id_membre dans ma table annonces, une chose que j'avais abandonné précédemment parce que c'était mission impossible.
D'autre part, le nombre d'annonces créé par chaque membre s'affiche correctement. Merci pour tout Jordane!
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
11 janv. 2022 à 22:47
<< et dans le cas présent, une clé étrangère ne te permettra pas de mettre des annonces pour les non-membres ... >>
Je vois... Donc, si je souhaite par exemple créer une table pour les non-membres, j'ajoute dans la table annonces l'id_nonmembre, ET C'EST DONC DANS CE CAS PRECIS quon doit créer des clés étrangères pour les membres et les non-membres?
0
jordane45 Messages postés 38371 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 janvier 2025 4 722
12 janv. 2022 à 01:37
Sauf que tu ne pourras pas créer une clé qui ira chercher dans deux tables différentes....

Par contre.. si toutes tes annonces étaient forcément liées à un membre .. là oui, tu pourrais mettre une clé étrangère...

Mais bon.. dans le cas actuel... tu ne DOIS PAS en mettre !

Au passage... tu sais à quoi ça sert réellement les clés étrangères ? Leur réelle utilité et comment s'en servir ?
Les avantages et les contraintes que ça peut amener ? Dans quel cas s'en servir (ou non) ?
Tu sais qu'on peut mettre en place une bdd s'en en utiliser une seule ? ( le tout c'est de mettre en place soi-même les codes qui permettent d'assurer la cohérence des données... )
Enfin bon.. ne t'attends pas à ce que je te fasse un cours là dessus... ce n'est pas mon rôle et il existe suffisamment de cours à ce sujet sur le net.
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
12 janv. 2022 à 06:28
D'accord, c'est clair. Merci pour toutes les précisions.
Bien à toi :)
0