Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: skOMplikowane wyciągniecie danych z bazy
Forum PHP.pl > Forum > Bazy danych > MySQL
Apo
Witam
Ostatnio zaczełem pisać autoryzacje dla frameworka bardzo podobną do tej którą napisał Ludvik, bo moim zdaniem lepszej nie ma smile.gif

Struktura tabel wygląda tak:

users - (id, name, password): przechowuje dane o użytkownikach
user_groups(id, uid, gid): przechowuje przynależność danego użytkownika (uid, tabela users) do danej grupy z uprawnieniami (gid, tabela groups)
roles - (id, name): nazwa pojedyńczej roli
groups - (id, name): nazwy istniejących grup
group_roles(id, rid, gid): przechowuje role (rid, tabela roles) przypisane grupą(gid, tabela groups) (tylko identifikatory)

No i teraz chciałem pobrać dane konkretnego użytkownika z bazy, hasło, nick i role.
Czyli musze pobrać hasło, nick następnie odczytać jego przynależność do danej grupy i potem odczytać wszystkie role przypisane tej grupie. Zrobiłem takie coś:

  1. SELECT users.name, users.password, roles.name
  2. FROM users, user_groups, group_roles
  3. LEFT JOIN roles ON roles.id = group_roles.rid
  4. WHERE users.id = 1 AND user_groups.uid = users.id AND group_roles.gid = user_groups.gid


Ale to nie jest poprawne bo wyskakują mi nieodpowiednie role :/ Najlepiej jak zapytanie będzie bardzo wydajne.

Pozdrawiam Apo
splatch
Poproszę przykładową strukturę, najlepiej z danymi.
Apo
Kod
-- phpMyAdmin SQL Dump
-- version 2.8.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Czas wygenerowania: 06 Wrz 2006, 16:23
-- Wersja serwera: 5.0.22
-- Wersja php: 5.1.4
--
-- Baza danych: `apos`
--

-- --------------------------------------------------------

--
-- Struktura tabeli dla  `action_roles`
--

CREATE TABLE `action_roles` (
  `id` int(10) NOT NULL auto_increment,
  `aid` int(10) NOT NULL,
  `rid` varchar(10) NOT NULL,
  `parameters` varchar(20) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10;

--
-- Zrzut danych tabeli `action_roles`
--

INSERT INTO `action_roles` VALUES (1, 1, '1', NULL);
INSERT INTO `action_roles` VALUES (2, 1, '4', NULL);
INSERT INTO `action_roles` VALUES (3, 2, '1', '$news_id');
INSERT INTO `action_roles` VALUES (4, 2, '2', '$news_id');
INSERT INTO `action_roles` VALUES (5, 2, '4', NULL);
INSERT INTO `action_roles` VALUES (6, 3, '1', '$news_id');
INSERT INTO `action_roles` VALUES (7, 3, '3', '$naes_id');
INSERT INTO `action_roles` VALUES (8, 3, '4', NULL);
INSERT INTO `action_roles` VALUES (9, 4, '4', NULL);

-- --------------------------------------------------------

--
-- Struktura tabeli dla  `actions`
--

CREATE TABLE `actions` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(25) NOT NULL,
  `prefether` varchar(30) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5;

--
-- Zrzut danych tabeli `actions`
--

INSERT INTO `actions` VALUES (1, 'NewsViewAction', NULL);
INSERT INTO `actions` VALUES (2, 'NewsEditAction', 'newsPrefether');
INSERT INTO `actions` VALUES (3, 'NewsDeleteAction', 'newsPrefether');
INSERT INTO `actions` VALUES (4, 'NewsAddModAction', 'newsPrefether');

-- --------------------------------------------------------

--
-- Struktura tabeli dla  `group_roles`
--

CREATE TABLE `group_roles` (
  `id` int(10) NOT NULL auto_increment,
  `rid` int(10) NOT NULL,
  `gid` int(30) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5;

--
-- Zrzut danych tabeli `group_roles`
--

INSERT INTO `group_roles` VALUES (1, 1, 1);
INSERT INTO `group_roles` VALUES (2, 2, 2);
INSERT INTO `group_roles` VALUES (3, 3, 2);
INSERT INTO `group_roles` VALUES (4, 4, 3);

-- --------------------------------------------------------

--
-- Struktura tabeli dla  `groups`
--

CREATE TABLE `groups` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(30) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4;

--
-- Zrzut danych tabeli `groups`
--

INSERT INTO `groups` VALUES (1, '');
INSERT INTO `groups` VALUES (2, '');
INSERT INTO `groups` VALUES (3, '');

-- --------------------------------------------------------

--
-- Struktura tabeli dla  `roles`
--

CREATE TABLE `roles` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5;

--
-- Zrzut danych tabeli `roles`
--

INSERT INTO `roles` VALUES (1, 'NewsView');
INSERT INTO `roles` VALUES (2, 'NewsEdit');
INSERT INTO `roles` VALUES (3, 'NewsDelete');
INSERT INTO `roles` VALUES (4, 'administrate');

-- --------------------------------------------------------

--
-- Struktura tabeli dla  `user_groups`
--

CREATE TABLE `user_groups` (
  `id` int(10) NOT NULL auto_increment,
  `uid` int(10) NOT NULL,
  `gid` int(10) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3;

--
-- Zrzut danych tabeli `user_groups`
--

INSERT INTO `user_groups` VALUES (1, 0, 3);
INSERT INTO `user_groups` VALUES (2, 1, 1);

-- --------------------------------------------------------

--
-- Struktura tabeli dla  `users`
--

CREATE TABLE `users` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(20) NOT NULL,
  `password` varchar(30) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3;

--
-- Zrzut danych tabeli `users`
--

INSERT INTO `users` VALUES (1, 'apo', 'pass');
INSERT INTO `users` VALUES (2, 'noob', 'pass');
SongoQ
Zapytanie jest prawidlowe i zwraca 1 role NewsView, tak przynajmniej zauwazylem. Przesledz jeszcze raz dane w bazie.

Co do wydajnosci do index na zlaczenie czyli to co jest w where i to co jest po ON bo narazie masz tylko klucze podstawowe.
Apo
Cytat(SongoQ @ 6.09.2006, 17:23:20 ) *
Zapytanie jest prawidlowe i zwraca 1 role NewsView, tak przynajmniej zauwazylem. Przesledz jeszcze raz dane w bazie.


Jaki kretyn ze mnie. Miałem źle przypisanych użytkowników do swojej grupy, a dokładniej tu:
- INSERT INTO `user_groups` VALUES (1, 0, 3); ;(


@SongoQ jestes bogiem ;p
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.