ugrás a tartalomhoz

Uzenet kuldes felhasznaloknak

Anonymous · 2006. Júl. 18. (K), 15.28
Szeretnek uzenetett kuldeni egy admin laprol a regisztralt felhasznaloknak.
Ezeket az uzeneteket mysql-ben szeretnem tarolni.

Minden regisztralt felhasznalo egy csoport tagja (Alapertelmezeten "Registered User" csoport).

Azt szeretnem megoldalni, hogy csak egy felhasznalonak kuldjek uzenetet, vagy az oszes felhasznalonak amely benne van a "Registered User" csoportban.

Szuksegem van mindenfele tanacsra, hogyan lehet ezt a megoldani. Jelenleg nincs semmi a MySQL adatbazisban ami csoportokra utal. Letre kell hozak kulon mezot minden csoportnak ? Tovabba mint kene csinalni ?

Koszonom !
 
1

Mi van?

janoszen · 2006. Júl. 18. (K), 15.34
Milyen rendszerről beszélsz? Ugyanis azt kissé kifelejtetted. :D Anélkül nehéz lesz megmondani.
2

valasz

Anonymous · 2006. Júl. 18. (K), 15.43
Nem tudom mit ertesz pontosan rendszeren :)
PHP 4.x-et hasznalok, mySQL adatbazisal es Linuxon mukodik.

Van egy admin lap, en irtam. Egy felhasznalot tudok vele hozaadni az adatbazisba, szerkeszteni es kitorolni egy felhasznalot.

Most csoportokra akarnam osztani a felhasznlokat. Peldaul mindegyik regisztralt user legyen alapertelmezetten a "Registered User" csoportban.
3

kapcsolótábla

zsepi · 2006. Júl. 18. (K), 15.53
első blikkre három táblát javasolnék, valahogy így:
  • felhasznalok (felhasznalo_id, nev, stb.)
  • csoportok (csoport_id, csoport_nev, stb.)
  • felhasznalo2csoport (felhasznalo_id, csoport_id)

alapbol letrehozol egy felhasznalo csoportot (regisztrált felhasználók névvel), majd mikor létrehozol egy új felhasználót, akkor a felhasznalo2csoport táblába is beszúrsz egy sort, ahol a csoport_id-t a csoportnév alapján szerzed meg
4

valasz

Anonymous · 2006. Júl. 18. (K), 16.05
ezek kulon tablak ami azt jelenti, hogy kulon .SQL kiterjesztesu filek ?
5

reszletesen

Anonymous · 2006. Júl. 18. (K), 16.18
Kerlek ha lehet ird le kicsit reszletesebben, kezdo vagyok es nem igazan tudok meg sokmindent.

Koszonom !
6

Kód

janoszen · 2006. Júl. 18. (K), 16.59
Nincs kedvem veszekedni, hogy tanulnd meg, ne várj sültgalambot, ezért itt a kód:

CREATE TABLE users
(
 id VARCHAR(32) PRIMARY KEY NOT NULL,
 password VARCHAR(32) NOT NULL

 INDEX iid (id)
) TYPE=InnoDB;

CREATE TABLE groups
(
 id VARCHAR(32) PRIMARY KEY NOT NULL,

 INDEX iid (id)
) TYPE=InnoDB;

CREATE TABLE memberships
(
 id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
 user VARCHAR(32) NOT NULL,
 memberof VARCHAR(32) NOT NULL,

 INDEX iuser (user),
 FOREIGN KEY (user) REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,

 INDEX imemberof (memberof),
 FOREIGN KEY (memberof) REFERENCES groups(id) ON UPDATE CASCADE ON DELETE CASCADE
) TYPE=InnoDB;

CREATE TABLE messages
(
 id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
 from VARCHAR(32),
 to VARCHAR(32) NOT NULL,
 message LONGTEXT NOT NULL,

 INDEX ifrom (from),
 FOREIGN KEY (from) REFERENCES users(id) ON UPDATE CASCADE ON DELETE SET NULL,

 INDEX ito (to),
 FOREIGN KEY (to) REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE
) TYPE=InnoDB;
És akkor így választod ki a csoportot:
SELECT user FROM memberships WHERE memberof='csoportneve';
Majd ennek minden elemére elküldöd az üzenetet:
<?php
foreach ($usertomb as $user)
{
 mysql_query("INSERT INTO messages (from, to, message) VALUES ('feladouser',  '" . $user . "', '" . $uzenet . "')");
}
?>
Remélem, így érthető volt a példa. És remélem, jól írtam, mert siettem és nem teszteltem, csak fejből.

Persze ez így rettenetesen csúnya példa, mert a user- és üzenet-hozzáférést nem illik közvetlenül izélgetni, sokkal inkább egy függvényen/osztályon keresztül, de hát így egyszerű.
7

Koszonom !

Anonymous · 2006. Júl. 18. (K), 17.14
Koszonom !
Oszinten en megtanulnam de nem tudok semmi doksit ami elmagyaraza a dolgokat.
Kiprobalom a kodot, ha tudtok mas otleteket is jol jonne.
8

MySQL doksi

janoszen · 2006. Júl. 18. (K), 17.24
Hát, ha tudsz angolul, akkor ott a MySQL doksi. Ha nem tudsz, legfőbb ideje megtanulni, mert anélkül bizony nem fogsz boldogulni. A kódból néhány dolgot le tudsz szűrni, de ennél lehetséges, hogy flexibilisebb userkezelésre lesz szükséged majd valamikor. Ez esetben ajánlom figyelmedbe az ACL módszert.
9

kerdes

Anonymous · 2006. Júl. 18. (K), 17.24
ezt az INDEX meg inoodb vackerajt muszaj hasznalni ?
10

Természetesen nem...

janoszen · 2006. Júl. 18. (K), 17.54
Persze, hogy nem muszáj használni, viszont így automatikusan törlődik egy user hozzárendelés, ha pl. törlöd a usert vagy a csoportot. Kényelmesebb és kisebb a valószínűsége az inkonzisztenciának.
11

koszonom !

Anonymous · 2006. Júl. 18. (K), 21.47
Koszonom ! Mukodik, tartozom neked egy sorrel.
Nem szeretnek sokat kerni :( de meg tudnad mondani, hogyan tudnek egy felhasznalot tobb csoportba bele rakni ?

Koszi !
12

Több csoport

janoszen · 2006. Júl. 18. (K), 21.53
Például:

INSERT INTO memberships (user, memberof) VALUES ('egyuser', 'csoport1');
INSERT INTO memberships (user, memberof) VALUES ('egyuser', 'csoport2');
A memberships táblában levő recordok n:m hozzárendelést biztosítanak a felhasználók és a csoportok között. Ergo, egy bejegyzés a memberships táblában megmondja, hogy egy user és egy csoport között van tagsági hozzárendelés. Ha nem létezik megfelelő user:csoport bejegyzés, nem tagja a csoportnak.

Pl. így tudsz egy tagságot leellenőrizni:

SELECT COUNT(*) FROM memberships WHERE user='keresettuser' AND memberof='keresettcsoport';
Ha az eredmény 1, akkor tagja a csoportnak, ha 0, akkor nem az. :)

Ja, és a sört nem szeretem. :D Nem iszom alkoholt. :D
13

Koszonom

Anonymous · 2006. Júl. 18. (K), 23.13
Nalam van egy tabla, a neve register

'CREATE TABLE register (
              user_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
              username VARCHAR(25) NOT NULL,
              password VARCHAR(15) NOT NULL,
              email VARCHAR(50) NOT NULL,
              validate VARCHAR(50) NOT NULL, 
              forgetpwd VARCHAR(50) NOT NULL,
              date_entered DATETIME NOT NULL,
              memberof VARCHAR(32) NOT NULL)';
eben a tablaban tarolom a regisztralt felhasznalo nevet es a user csoportjat "memberof" amely alapertelmezeten "registered".

Szerinted az en tablamba is alkalmazhato ahoz amit leirtal ?
14

Nem.

janoszen · 2006. Júl. 18. (K), 23.16
Nem, erre nem tudod alkalmazni, mert a register és a member táblád között n:1 reláció van, ergo, egy usert egy csoporthoz rendelsz fixen. Copy paste a fenti kódot és egészítsd ki a saját mezőiddel.
15

kerdes

Anonymous · 2006. Júl. 19. (Sze), 10.16
Meg tudnad kerlek mondani, hogy a kov. sor mit csinal ?

FOREIGN KEY (memberof) REFERENCES groups(id) ON UPDATE CASCADE ON DELETE CASCADE
16

doksi

Táskai Zsolt · 2006. Júl. 19. (Sze), 10.45
http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html
nem merek hozzászólni ilyen melegben...
17

Megoldás

janoszen · 2006. Júl. 19. (Sze), 12.53
Azt csinálja, hogy a memberof mező csak olyan értékeket vehet fel, amik a groups tábla id mezőjében szerepelnek. Ha az értéket módosítják, a memberof mező is megfelelően módosulni fog, ha az értéket törlik, a megfelelő sor is törlődni fog (CASCADE).
18

Ugye ezek a constraintok (foreign key, cascade delete, stb),

Anonymous · 2006. Júl. 20. (Cs), 08.55
csak innodb tipusu tablakkal mukodnek? Van olyan, hogy innodb? Ugy tudom mar megvette az Oracle? Ti tenyleg innodb tipusu tablakat hasznaltok? En meg sosem hasznaltam innodb-t. Jo nehany eve probaltam, de amikor egy insert -re kb. ezt irta ki a mysql: a record with NULL value does not exist in table tblCountries, akkor igencsak elment a kedvem tole.

CREATE TABLE tblCountries(
 ID UNSIGNED INT NOT NULL
 country varchar (100) not null,
 Primary Key (ID)
)TYPE=innodb;

CREATE TABLE tblUsers(
 ID INT UNSIGNED NOT NULL AUTO_INCREMENT, 
 UserName VARCHAR(100) NOT NULL UNIQUE,
 country INT NULL ,

 FOREIGN KEY (country ) REFERENCES tblCountries(id),
 Primary Key (ID)
)TYPE=innodb;

INSERT INTO tblUsers (ID,UserName,country) VALUES (NULL, 'pistike', NULL);