PHP: systém pro komunikaci mezi uživateli

j0hny666

PHP: systém pro komunikaci mezi uživateli
« kdy: 25. 09. 2012, 20:18:51 »
Zdravím,

pracuji na svém administračním systému a chtěl bych obsáhnout možnost posílání zpráv mezi uživateli.

Zde je jak zatím postupuji:

- uživatel si vybere cílovou skupinu, případně si zatrhne libovolné uživatele ze seznamu (např. pouze administratorum, všem, nebo třeba jen třem konkrétním lidem)
- napíše zprávu a skript si podle zvolené skupiny vytáhne adresáty z db a uloží je do pole
- provedou se kontroly atd. a zpráva se uloží do db

 Tady jsem zatím skončil a řeším následující problém: když je více adresátů, zpráva se uloží vícekrát, pokaždé má akorát jiné ID příjemce. Tohle řešení sice funguje, ale při větším počtu uživatelů asi nebude úplně ideální. Má někdo nápad či zkušenost jak by se to dalo řešit, aby se zpráva neduplikovala, ale zároveň by s ní každý mohl zacházet individuálně? (například přečteno/nepřečteno)


používám PHP 5 s MySql 5.5
« Poslední změna: 25. 09. 2012, 23:07:30 od Petr Krčmář »


Goheeca

Re:PHP: systém pro komunikaci mezi uživateli (PM)
« Odpověď #1 kdy: 25. 09. 2012, 20:28:51 »
Vazba M:N mezi uzivateli a zpravami; ve vazebni tabulce pak precteno/neprecteno ...

Natix

Re:PHP: systém pro komunikaci mezi uživateli (PM)
« Odpověď #2 kdy: 25. 09. 2012, 20:32:01 »
Tak co třeba zprávu dekomponovat tabulku zprávy do dvou tabulek (pseudokód, ale myšlenka je snad jasná):

Kód: [Vybrat]
Message {
    id: long
    contents: string
}

MessageToUser {
    messageId: long
    userId: long
}

j0hny666

Re:PHP: systém pro komunikaci mezi uživateli (PM)
« Odpověď #3 kdy: 25. 09. 2012, 20:34:31 »
Podívám se na obě řešení :)

v databázích se moc nevyznám, zatím pouze základy, takže spojování tabulek je mi trochu cizí :), ale pokusím se to na základě vašich odpovědí nějak dát do kupy a napíšu jak se mi to povedlo.

Děkuji za tak rychlé odpovědi!

Kit

Re:PHP: systém pro komunikaci mezi uživateli (PM)
« Odpověď #4 kdy: 26. 09. 2012, 09:35:10 »
Tak co třeba zprávu dekomponovat tabulku zprávy do dvou tabulek (pseudokód, ale myšlenka je snad jasná):

Kód: [Vybrat]
Message {
    id: long
    contents: string
}

MessageToUser {
    messageId: long
    userId: long
}

Variací by mohl být messageId typu hash, např. MD5 či SHA1. Tím by se mohlo ušetřit ještě víc místa, protože hodně zpráv bývá stejných.


Nikeš

Re:PHP: systém pro komunikaci mezi uživateli
« Odpověď #5 kdy: 26. 09. 2012, 14:03:37 »
Možná se uchýlím od zadané otázky, ale budeš potřebovat i odesílatele přidat do MessageToUser s příznakem is_sender(nebo podobným), kvůli možnosti mazání zpráv.

Aneb, když si odesílatel chce smazat zprávu ze svého outboxu, nesmí se to projevit v inboxech příjemců a naopak.

Navíc kvůli kontrole zneužívání je často nutné zprávu jako smazanou jen označovat (my to děláme sloupcem deleted_dt, které obsahuje kdy byl daný záznam smazán) a ne skutečně z DB odebírat.

Franta

Re:PHP: systém pro komunikaci mezi uživateli
« Odpověď #6 kdy: 26. 09. 2012, 14:18:50 »
Má někdo nápad či zkušenost jak by se to dalo řešit, aby se zpráva neduplikovala, ale zároveň by s ní každý mohl zacházet individuálně? (například přečteno/nepřečteno)

Jednoduše oddělit tělo zprávy (vlastní text, přílohy, obrázky...) od hlaviček (od, komu, přečteno...) Pak se ti bude duplikovat jen jméno odesílatele a datum. I tohle by šlo ukládat jen jednou, ale je otázka, jestli to má smysl a taky jak obecné řešení hledáš. Oddělit tělo a hlavičky mi přijde rozumný kompromis.

j0hny666

Re:PHP: systém pro komunikaci mezi uživateli
« Odpověď #7 kdy: 28. 09. 2012, 14:33:19 »
Tak jsem to konečně zprovoznil. Použil jsem relaci M:N s tím, že v jedné tabulce mám samotnou zprávu (text a titulek) a v duhé mám sloupce date, senderid, recipientid, read, sender_del a recipient_del. Při smazání zprávy uživatelem se tak vymaže pouze jemu a druhé straně zůstane.

Díky všem za commenty, dal jsem na vaše rady a šlape to ;-)

Rexxar

Re:PHP: systém pro komunikaci mezi uživateli
« Odpověď #8 kdy: 28. 09. 2012, 20:57:48 »
No, dalo by sa to aj inac...ak by si zaznamy nemazal z databazy, iba by si im nastavil stlpec 'deleted' na 1.

Kit

Re:PHP: systém pro komunikaci mezi uživateli
« Odpověď #9 kdy: 29. 09. 2012, 08:50:49 »
No, dalo by sa to aj inac...ak by si zaznamy nemazal z databazy, iba by si im nastavil stlpec 'deleted' na 1.

Přečti si ještě jednou, co j0hny666 napsal. Záznamy nemaže a ten sloupec 'deleted' tam má také.