Złączenie tabel

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.

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ą...

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ć.

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.

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ć.

0

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

  • użytkownicy -> załatwia logowanie
  • klienci -> informacje o kliencie
  • pracownicy -> infromacje o pracowniku
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ć.

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. ;)

0

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

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

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
            );
0

@Oak
Niestety "#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, ' at line 15"

0

Tak zadziałało. @Oak Dzięki za pomoc z tym widokiem. To była dobra sugestia.

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
            );

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