2016-11-24 2 views
0

J'ai un système de messagerie (PHP/MYSQL) et je l'ai déjà préparé le terrain pour la lecture/non lus dans la table message simplePhp marquer efficacement les messages comme lu

Table 
- msgbody 
- datetime 
- receipent 
- read/unread 
- sent/unsent (this field is for sending of notification) 

J'ai 2 questions

  1. Je comprends lorsque l'utilisateur crée le message que je vais insérer dans la table avec le champ comme non lu, et lorsque je récupère le message la première fois avec la déclaration suivante

    MYSQL statement: Select * from table WHERE receipient = "a"; 
    

Ce que je fais est que je vais dans le tableau et puis je définir le champ non lu à lire à l'aide des instructions d'insertion multiples (très inefficace!)

est-il que je peux quand même renoncer à la boucle de tableau et mettre à jour le champ quand je le sélectionne?

Et est-ce la bonne façon de déterminer si un message est lu?

2) J'utilise jquery comme frontal, et je peux faire un appel ajax à php, mais je suis toujours curieux de savoir comment je fais, je détermine sur le frontal si l'utilisateur chargé et vu le message ou ne pas.

Quelqu'un peut-il faire la lumière sur la façon dont cela devrait être fait? Ajoute l'appel à mettre à jour pour lire lorsque l'appel Ajax à charger est réussi?

  • Ajax appel à mettre à jour lorsque la base de données est lue?
  • Ajax appel à mettre à jour ...... quand?

MISE À JOUR: Codes ajoutés. Mon code php pour INSERTION de messages

Avertissement: codes fonctionnent bien. c'est le processus que j'ai besoin d'aide.

$query = $this->db->prepare('INSERT INTO table (msgbody,date time,recipient,read,sent) VALUES(:msg,:date,:user,:read,:sent); 
if ($query->execute(array(
':msg' => $msg, 
':date' => $datetime, 
':user' => $user, 
':read' => '0', 
':sent' => '0'))) { 
return TRUE; 
} 


My php code for retrieving of message 

$query = $this->db->prepare('SELECT * FROM table WHERE recipient = :user); 
if ($query->execute(array(
':user' => $user 
))){ 

$data = $query->fetchAll(); 

foreach ($data as $msg) { 
if $msg['read'] == '0'; 
$this->updateRead($msg['id']); 


} 

$ this-> Fonction updateRead comprend une table mise à jour de champ lecture à 1, ainsi que l'envoi Pusher au destinataire d'origine afin qu'ils connaissent le message est lu.

Alors, que se passe-t-il si j'ai 1000 messages, je pourrais finir par boucler 1000 fois juste pour marquer 2-3 messages comme Read.

+0

La structure de votre table n'est pas esthétique. – Phiter

+0

Non, il n'y a aucun moyen de combiner un 'SELECT' avec' UPDATE' dans une seule requête. – Barmar

+0

Mais cela ressemble à une situation parfaite pour une préparation et une exécution multiples – RiggsFolly

Répondre

0

Vous ne pouvez pas sélectionner et mettre à jour dans une seule requête. Mais vous n'avez pas besoin d'une boucle, vous pouvez mettre à jour tous les messages avec une seule requête. Si vous effectuez ces opérations dans une transaction, vous n'avez pas à vous soucier de l'ajout de nouveaux messages entre les deux requêtes. L'atomicité de la transaction doit garantir qu'ils voient la même vue de la base de données.

+0

J'ai essayé ceci mais j'ai fait face au problème quand les messages sont envoyés trop rapidement ainsi la mise à jour et l'insertion finissent par mettre à jour les messages étant insérés aussi. Je ne comprends pas ce que vous voulez dire par atomicité de transaction. Donc je pense que je devrais le définir comme lu comme je le récupère. Mais pas les autres données que je n'ai pas récupérées, à ce moment-là. –

+0

L'atomicité des transactions signifie que lorsque vous effectuez des requêtes dans une transaction, les modifications apportées à la base de données par d'autres processus ne sont pas visibles pour vous. – Barmar

+0

OH oui par la façon dont je me suis aussi souvenu pourquoi cela ne fonctionne pas parce que j'ai aussi besoin de pousser le message à l'expéditeur d'origine, et mettre à jour leur interface avec le statut READ. –