Compter message boite de reception

Ce topic a été résolu
laurent09

laurent09 Le 22 avril 2017 à 21:39 (Édité le 25 janvier 2019 à 17:53)

Bonjour

je débute et j'apprends avec en php.
J'ai suivis le tuto sur le profil puis la boite de messagerie privée ici :
http://www.primfx.com/article/tuto-php-envoyer-des-messages-prives-232 .

tout est nickel, j'aurai aimé savoir:
-comment faire pour compter le nombre de message reçu dans sa boite de réception.
- et comment avoir les message non lus et les message lus dans deux tableau différent?

merci
Zbuu

Zbuu Le 22 avril 2017 à 22:28

Bonjour, 

Je ne connais pas ton code, et je n'ai pas non plus regardé le tutoriel. Mais si tu souhaites récupérer le nombre de messages de l'utilisateur il te suffit de faire un rowCount() sur la requête ou tu récupères les messages de ton utilisateur. 

un exemple (avec pdo) : 
$q = $bdd->prepare("SELECT * FROM ta_table_contenant_les_messages WHERE ton_champ_destinataire = ?");
$q->execute([$_SESSION['auth']['id']]);
$nbr_message = $q->rowCount();
$q->closeCursor();
Si tu ne comprends pas bien, poste nous ton code de la page ou tu récupères les messages :) 

laurent09

laurent09 Le 23 avril 2017 à 10:35

ok je vais essayer .

sinon voici mon code, c'est juste celui du tuto de primfx .
<?php
session_start();
$bdd = new PDO('mysql:host=127.0.0.1;dbname=', '', '');
if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) {
$msg = $bdd->prepare('SELECT * FROM messages WHERE id_destinataire = ?');
$msg->execute(array($_SESSION['id']));
$msg_nbr = $msg->rowCount();
?>
<!DOCTYPE html>
<html>
<head>
   <title>Boîte de réception</title>
   <meta charset="utf-8" />
</head>
<body>
   <a href="envoi.php">Nouveau message</a><br /><br /><br />
   <h3>Votre boîte de réception:</h3>
   <?php
   if($msg_nbr == 0) { echo "Vous n'avez aucun message..."; }
   while($m = $msg->fetch()) {
      $p_exp = $bdd->prepare('SELECT username FROM user WHERE id = ?');
      $p_exp->execute(array($m['id_expediteur']));
      $p_exp = $p_exp->fetch();
      $p_exp = $p_exp['username'];
   ?>
   <b><?= $p_exp ?></b> vous a envoyé: <br />
   <?= nl2br($m['message']) ?><br />
   -------------------------------------<br/>
   <?php } ?>
</body>
</html>
<?php } ?>
merci
Zbuu

Zbuu Le 23 avril 2017 à 12:01

Enfaîte tu récupère déjà le nombre de message 😀 
$msg_nbr = $msg->rowCount();
Donc suffit de faire un echo du style : 
<p>Vous avez <?= $msg_nbr; ?> messages</p>

Pour info <?= $une_variable; ?> c'est comme ci je faisais <?php echo $ma_variable; ?>
Balatharas

Balatharas Le 23 avril 2017 à 13:45 (Édité le 23 avril 2017 à 14:46)

Pour trouver le nombre de message que tu as reçu et qui sont non lus c'est simple:
<?php
$reqNBR = $bdd->prepare('ta requête 😉 ');
$reqNBR->execute([$argument]);
$msg_nonlus = $reqNBR->rowCount();

echo "Vous avez reçu ".$msg_nonlus." messages non lus.";
?>
Ta requête vaut mieux que tu la fasses pour comprendre: Sélectionne dans la table message toute les lignes qui ont la colonne id_destinataire = ? et lu = 0
Ensuite $argument sera le $_SESSION['id']
Du coup pour les messages non lus copier-coller:
<?php
$reqNBRlu = $bdd->prepare('ta requête 😉 ');
$reqNBRlu->execute([$argument]);
$msg_lus = $reqNBRlu->rowCount();

echo "Vous avez reçu ".$msg_lus." messages lus.";
?>
Ta requête vaut mieux que tu la fasses pour comprendre: Sélectionne dans la table message toute les lignes qui ont la colonne id_destinataire = ? et lu = 1
Ensuite $argument sera le $_SESSION['id']

Normalement tu devrais y arriver sans pb 😋
laurent09

laurent09 Le 27 avril 2017 à 10:46

merci beaucoup j'y suis arrivé grâce a vous.
je débute et j'apprend et ça fait plaisirs de voir que l'on peut recevoir de l'aide.
laurent09

laurent09 Le 27 avril 2017 à 11:01

par contre j'ai un autre souci en suivant donc le tuto message privée avancé  ici " http://www.primfx.com/article/tuto-php-envoyer-des-messages-prives-avance-238 " je me suis rendu compte que il y avait aussi la fonction message lu .
Mais le truc c'est que quand j'ai ajouté la ligne "lu" dans ma bdd mes message ne s'envoie plus, et lorsque je la supprime mes message ce renvoie.
je cherche mais je ne voie pas.
laurent09

laurent09 Le 27 avril 2017 à 14:07

voici mon code boite d'envoi

<?php
session_start();
$bdd = new PDO('mysql:host=127.0.0.1;dbname=testinfinity', 'testinfinity', '1234');
if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) {
   if(isset($_POST['envoi_message'])) {
      if(isset($_POST['destinataire'],$_POST['message'],$_POST['objet']) AND !empty($_POST['destinataire']) AND !empty($_POST['message']) AND !empty($_POST['objet'])) {
         $destinataire = htmlspecialchars($_POST['destinataire']);
         $message = htmlspecialchars($_POST['message']);
         $objet = htmlspecialchars($_POST['objet']);
         $id_destinataire = $bdd->prepare('SELECT id FROM user WHERE username = ?');
         $id_destinataire->execute(array($destinataire));
         $dest_exist = $id_destinataire->rowCount();
         if($dest_exist == 1) {
            $id_destinataire = $id_destinataire->fetch();
            $id_destinataire = $id_destinataire['id'];
            $ins = $bdd->prepare('INSERT INTO messages(id_expediteur,id_destinataire,message,objet) VALUES (?,?,?,?)');
            $ins->execute(array($_SESSION['id'],$id_destinataire,$message,$objet));
            $error = "Votre message a bien été envoyé !";
         } else {
            $error = "Cet utilisateur n'existe pas...";
         }
      } else {
         $error = "Veuillez compléter tous les champs";
      }
   }
   $destinataires = $bdd->query('SELECT username FROM user ORDER BY username');
   if(isset($_GET['r']) AND !empty($_GET['r'])) {
      $r = htmlspecialchars($_GET['r']);
   }
   if(isset($_GET['o']) AND !empty($_GET['o'])) {
      $o = urldecode($_GET['o']);
      $o = htmlspecialchars($_GET['o']);
      if(substr($o,0,3) != 'RE:') {
         $o = "RE:".$o;
      }
   }
   ?>
   <!DOCTYPE html>
   <html>
   <head>
      <title>Envoi de message</title>
      <meta charset="utf-8" />
   </head>
   <body>
      <form method="POST">
         <label>Destinataire:</label>
         <input type="text" name="destinataire" <?php if(isset($r)) { echo 'value="'.$r.'"'; } ?> />
         <br /><br />
         <label>Objet:</label>
         <input type="text" name="objet" <?php if(isset($o)) { echo 'value="'.$o.'"'; } ?> />
         <br /><br />
         <textarea placeholder="Votre message" name="message"></textarea>
         <br /><br />
         <input type="submit" value="Envoyer" name="envoi_message" />
         <br /><br />
         <?php if(isset($error)) { echo '<span style="color:red">'.$error.'</span>'; } ?>
      </form>
      <br />
      <a href="reception.php">Boîte de réception</a>
   </body>
   </html>
<?php
}
?>
lorsque j’enlève la ligne "lu" a la fin de ma table "messages" les message s'envoie, et lorsque je le rajoute les messages ne s'envois plus.

Balatharas

Balatharas Le 27 avril 2017 à 17:36

Remplace ceci:
$bdd = new PDO('mysql:host=127.0.0.1;dbname=testinfinity', 'testinfinity', '1234');
Par ceci:
try {
   $bdd = new PDO('mysql:host=127.0.0.1;dbname=testinfinity', 'testinfinity', '1234');
} catch(Exception $e) {
   echo 'Erreur: ', $e->getMessage(), "\n";
}
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
De plus tu devrais éviter les mdp type 1234 ou azerty et tu devrais mettre le code de connexion à la bdd dans un fichier à part, fichier que tu inclus avec include/include_once/require/require_once en haut de tes fichiers.

Ton problème vient du fait que ne met pas la colonne lu dans ta requête d'insertion. Du coup il faut que tu ajoute la colonne "lu" ici
$ins = $bdd->prepare('INSERT INTO messages(id_expediteur,id_destinataire,message,objet) VALUES (?,?,?,?)');
dans messages( ICI ), et un autre point d'interrogation "?"
Puis tu rajoutes dans l'exécution "0".
laurent09

laurent09 Le 27 avril 2017 à 18:01

ok merci beaucoup ça a marché j'avais déjà ajouté lu dans "messages" mais j'avais pas mis le "0" dans l'exécution.

pour le mot de passe c'est des test que je fait pour le moment, je vais voir pour ce que tu ma dit pour le fichier inclus.

une autres question désolé mais je débute et j'apprend en même temps.
pour quoi tu ma fait mettre  ceci :
try {   
   $bdd = new PDO('mysql:host=127.0.0.1;dbname=testinfinity', 'testinfinity', '1234');
} catch(Exception $e) {
   echo 'Erreur: ', $e->getMessage(), "\n";
}
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
 
merci encore
Balatharas

Balatharas Le 27 avril 2017 à 18:08

une autres question désolé mais je débute et j'apprend en même temps
Voilà l'utilité du forum 😀
Le code que je t'ai donné (c'est vrai j'aurais du t'expliquer) permet d'afficher les erreurs, comme ça, par exemple essaie de mettre un nom de table qui n'existe pas dans ta requête d'insertion.
Zbuu

Zbuu Le 27 avril 2017 à 19:17

@Beignet pourquoi tu mets warning et exception au lieu d'en définir qu'un ? 
Balatharas

Balatharas Le 27 avril 2017 à 20:51

On sait jamais je me pose pas de questions sur ce coup la 😶 @Zbuu
laurent09

laurent09 Le 28 avril 2017 à 20:20

@beignet j'ai une question je voudrais savoir si tu aurai un tuto pour ajouter le fichier de conection a la bdd avec include_once? comme tu ma dit .

merci
Balatharas

Balatharas Le 28 avril 2017 à 21:37 (Édité le 28 avril 2017 à 21:39)

Bah c'est simple:
Tu crée un fichier .php que tu appelles par exemple: bdd.inc.php et que tu range dans un dossier appelé include, tu mets ça dedans
<?php
// ta connexion
?>
Ensuite en haut de chaque fichier et en dessous de session_start(); tu mets ceci
require 'include/bdd.inc.php';
Et normalement rien ne devrait changer a part le fait que tu n'auras pas a editer tout tes fichiers si tu change quelque chose dans ta connexion.

Si le problème responsable du topic est résolu, clique sur le bouton en haut de la page 😉
laurent09

laurent09 Le 28 avril 2017 à 21:43

Ok merci beaucoup je test tout ça demain. 
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte