Affichage avec la fonction Count php
Résolu
max30_3775
Messages postés
178
Date d'inscription
Statut
Membre
Dernière intervention
-
max30_3775 Messages postés 178 Date d'inscription Statut Membre Dernière intervention -
max30_3775 Messages postés 178 Date d'inscription Statut Membre Dernière intervention -
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:
Et on echo le 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.
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:
- Affichage avec la fonction Count php
- Fonction si et - Guide
- Affichage double ecran - Guide
- Easy php - Télécharger - Divers Web & Internet
- Windows 11 affichage classique - Guide
- Fonction miroir - Guide
9 réponses
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
Une fois le var_dump affiché ... remplace tes "?" de ta requête par ces valeurs dans phpmyadmin et montre nous le résultat obtenu.
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.
BonjourJordane, la gestion des erreurs étant activée voici le nouveau code des requêtes:
Le résultat du var_dump. Tu peux voir en commentaire ce que a donne en phpmydmin:
Et l'erreur affichée:
Warning: Illegal string offset 'COUNT(*)' in C:\wamp64\www\Projetsite\profil.php on line 139
Cette ligne:
<?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(*)']?>
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
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 ?? )
<< 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:
==> 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
==> 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
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 ???
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 ???
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
<<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é.
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é.
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.
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.
<<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.
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.
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 ...
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!
D'autre part, le nombre d'annonces créé par chaque membre s'affiche correctement. Merci pour tout Jordane!
<< 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?
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?
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.
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.