Złączenie tabel

Odpowiedz Nowy wątek
piko
2012-12-16 16:05
piko
0

Witam,
Mam logowanie do aplikacji, które sprawdza czy E-mail i hasło się zgadza i wtedy taka osoba otrzymuje dostęp. W tej chwili mam taki zapytanie:

SELECT * FROM Klient WHERE Email='$Email' AND Haslo='$Haslo' LIMIT 1;

Chciałbym teraz przerobić to zapytanie tak, aby dodatkowo przeszukało tabele Pracownik po tych samych parametrach.
Chciałem zrobić to po przez UNION, ale tabele nie mają tych samych kolumn i nie działa mi to wtedy. Proszę o jakąś wskazówkę. Zależy mi na tym, że jeśli w któreś tabeli Email i Hasło się zgadza to żeby zwróciło mi wszystkie dane danego usera.

Pozostało 580 znaków

2012-12-16 16:57
Moderator

Rejestracja: 16 lat temu

Ostatnio: 39 sekund temu

0
SELECT k.*, p.* FROM Klient as k
inner join Pracownik as p on k.Email=p.Email AND k.Haslo=p.Haslo
WHERE k.Email='$Email' AND k.Haslo='$Haslo'
 LIMIT 1;

Jeśli dobrze rozumiem o co pytasz...

BTW zdajesz sobie sprawę z tego co się stanie jak ktoś wpisze w pole hasło:

alamakota' or '1'='1

? W kodzie pojawi ci się:

SELECT * FROM Klient WHERE Email='cośtam' AND Haslo='alamakota' or '1'='1' LIMIT 1;

i zabezpieczenie ominęte bo '1'='1' zawsze jest prawdą...


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

Piko
2012-12-16 17:21
Piko
0

Twoje zapytanie zwraca mi pusty wynik.
Opisze raz jeszcze o co mi chodzi.
Mam formularz logowania z którego korzystają Pracownicy oraz Klienci. Po wpisaniu danych skrypt musi sprawdzić czy dane wpisane w pola formularza zgadzają się z bazą. Niestety pracownicy i klienci są rozdzieleni na 2 tabele, wiec zapytanie trochę się komplikuje i nie wiem jak je wykonać.

Pozostało 580 znaków

2012-12-16 17:31
Moderator

Rejestracja: 16 lat temu

Ostatnio: 39 sekund temu

0

aaaa, no ja zrozumiałem że logowanie jest oparte o tą samą tabelę a chcesz dostać też jakieś dodatkowe dane które są w tabeli pracownicy ;]
Rozwiazanie jest proste: zrób tą bazę z głową! Logowanie powinno być opartę o osobną tabelę "Użytkownicy" wspólną dla wszystkich użytkowników.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

piko
2012-12-16 17:37
piko
0

Nie do końca mogę tak mieć. Pracownicy są powiązani z innymi tabelami, z którymi reszta użytkowników nie powinna mieć powiązań. Wiem, że jedna tabela byłaby najrozsądniejsza, ale niestety nie mogę tak zrobić.

Pozostało 580 znaków

2012-12-16 17:48
Moderator

Rejestracja: 16 lat temu

Ostatnio: 39 sekund temu

0

@piko czy ty umiesz czytać? Ja proponuje mieć 3 tabele:

  • użytkownicy -> załatwia logowanie
  • klienci -> informacje o kliencie
  • pracownicy -> infromacje o pracowniku

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

piko
2012-12-16 18:03
piko
0

@Oak Nie do końca działa. Zwraca mi błąd.
@Shalom Pewnie ma to sens, ale nie chce już tego zmieniać. Mam już pobudowane wiele zapytań do tych tabel. Pytanie jest takie czy jest jakaś możliwość rozwiązania tego w oparciu o to co pisałem wcześniej? Nawet jeśli nie będzie to najbardziej przemyślane rozwiązanie. Cel jest jeden: ma działać.

Pozostało 580 znaków

Oak
2012-12-16 18:04
Oak

Rejestracja: 8 lat temu

Ostatnio: 4 lata temu

0

Mając dane tabele Klient i Pracownik określone przykładowo tak:

create table Klient (
    id integer primary key,
    email varchar,
    haslo varchar,
    uwagi text
);

create table Pracownik (
    id integer primary key,
    imie varchar,
    email varchar,
    pensja numeric(8,2),
    haslo varchar
);

Możemy stworzyć widok Logowanie, którego będziemy używać w formie tabeli.

create view Logowanie
    as (select id, null as imie, email, haslo, uwagi, null as pensja from Klient
        union
        select id, imie, email, haslo, null as uwagi, pensja from Pracownik);

Teraz:

select * from Logowanie
 where email = '$email'
   and haslo = '$haslo'
 limit 1;

Poprzedni post usunąłem, gdyż nie rozwiązywał on problemu. ;)

edytowany 1x, ostatnio: Oak, 2012-12-16 18:04

Pozostało 580 znaków

Piko
2012-12-16 18:05
Piko
0

@Oak Zaraz sprawdzę metodę z Widokami. Być może to mi pomoże.

Pozostało 580 znaków

Piko
2012-12-16 18:30
Piko
0

Moje tabele:
Klient (Id_Klient(PK), Role_Id_Roli(FK), Imie, Nazwisko, Firma, Email, Haslo, Adres, Telefon)
Pracownik (Id_Pracownik(PK), Stanowiska_Id_Stanowiska(FK), Role_Id_Roli(FK), Imie, Nazwisko, Email, Haslo, Telefon)

Tworze widok:

CREATE VIEW Logowanie
    AS (SELECT Id_Klient, NULL AS Id_Pracownika, NULL AS Stanowiska_Id_Stanowiska, Role_Id_Roli, Imie, Nazwisko, Nazwa_firmy, Email, Haslo, Adres, Telefon  FROM Klient
        UNION
        SELECT Id_Pracownika, NULL AS Id_Klient, Stanowiska_Id_Stanowiska, Role_Id_Roli, Imie, Nazwisko, NULL AS Nazwa_firmy, Email, Haslo, NULL AS Adres, Telefon FROM Pracownik); 

I niestety błąd: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION SELECT Id_Pracownika, NULL AS Id_Klient, Stanowiska_Id_Stanowiska,' at line 3

Pozostało 580 znaków

Oak
2012-12-16 18:40
Oak

Rejestracja: 8 lat temu

Ostatnio: 4 lata temu

0
Piko napisał(a):

Tworze widok:

CREATE VIEW Logowanie
AS (SELECT Id_Klient, NULL AS Id_Pracownika, NULL AS Stanowiska_Id_Stanowiska, Role_Id_Roli, Imie, Nazwisko, Nazwa_firmy, Email, Haslo, Adres, Telefon  FROM Klient
UNION
SELECT Id_Pracownika, NULL AS Id_Klient, Stanowiska_Id_Stanowiska, Role_Id_Roli, Imie, Nazwisko, NULL AS Nazwa_firmy, Email, Haslo, NULL AS Adres, Telefon FROM Pracownik); 

Masz takie same nazwy dwóch kolumn. Powinno być raczej:

CREATE VIEW Logowanie AS
            (SELECT NULL AS Id_Pracownika,
                    Id_Klient,
                    NULL AS Stanowiska_Id_Stanowiska,
                    Role_Id_Roli,
                    Imie,
                    Nazwisko,
                    Nazwa_firmy,
                    Email,
                    Haslo,
                    Adres,
                    Telefon
            FROM    Klient

            UNION

            SELECT Id_Pracownika,
                   NULL AS Id_Klient,
                   Stanowiska_Id_Stanowiska,
                   Role_Id_Roli,
                   Imie,
                   Nazwisko,
                   NULL AS Nazwa_firmy,
                   Email,
                   Haslo,
                   NULL AS Adres,
                   Telefon
            FROM   Pracownik
            );

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0