Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: j0hny666 25. 09. 2012, 20:18:51

Název: PHP: systém pro komunikaci mezi uživateli
Přispěvatel: j0hny666 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
Název: Re:PHP: systém pro komunikaci mezi uživateli (PM)
Přispěvatel: Goheeca 25. 09. 2012, 20:28:51
Vazba M:N mezi uzivateli a zpravami; ve vazebni tabulce pak precteno/neprecteno ...
Název: Re:PHP: systém pro komunikaci mezi uživateli (PM)
Přispěvatel: Natix 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
}
Název: Re:PHP: systém pro komunikaci mezi uživateli (PM)
Přispěvatel: j0hny666 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!
Název: Re:PHP: systém pro komunikaci mezi uživateli (PM)
Přispěvatel: Kit 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.
Název: Re:PHP: systém pro komunikaci mezi uživateli
Přispěvatel: Nikeš 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.
Název: Re:PHP: systém pro komunikaci mezi uživateli
Přispěvatel: Franta 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.
Název: Re:PHP: systém pro komunikaci mezi uživateli
Přispěvatel: j0hny666 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 ;-)
Název: Re:PHP: systém pro komunikaci mezi uživateli
Přispěvatel: Rexxar 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.
Název: Re:PHP: systém pro komunikaci mezi uživateli
Přispěvatel: Kit 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é.