Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: 1 zapytanie sprawdza 2 warunki
Forum PHP.pl > Forum > Bazy danych > MySQL
vadergb
Witam,

siedzialem ostatnio i sie zastanawialem:

Dotychczas sprawdzajac np czy taki email istnieje i haslo jest poprawne robilem:

  1. SELECT count(*) FROM users WHERE email='$email' LIMIT 1
// sprawdzamy czy email istnieje w bazie
wiadomo gdy =1 to istnieje gdy 0= nie istnieje
  1. SELECT count(*) FROM users WHERE password='$password' AND user_id='$_SESSION[id]' LIMIT 1
// sprawdzamy czy uzytkownik podal dobre haslo
wiadomo gdy =1 to istnieje gdy 0= nie istnieje

i musze w zapytania wykonac.

dalo by sie to tak zrobic aby za pomoca jednego zapytania wyswietlalo:

ilosc_email | ilosc_password
1 | 0

i wtedy wyciagam np
$row['ilosc_email'] -> gdy =1 to istnieje taki mail gdy 0 nie istnieje
$row['ilosc_password'] -> gdy =1 to istnieje takie haslo gdy 0 nie istnieje

Jesli by sie tak dalo obciazamy nasz system o 1 zapytaniem...

Z gory thx za pomoc

nitek
po co sprawdzasz osobno, czy uzytkownik o takim mailu istnieje, a potem dopiero, czy haslo jest poprawne?
w jednym zapytaniu bedzie to mniej wiecej tak:

  1. SELECT count(mail) AS ilosc_mail, count(password) AS ilosc_password FROM users WHERE email='$email' AND password='$password' AND user_id=."$_SESSION[id];


poza tym z kodu wynika, że hasło masz jawnie zapisane w bazie.. jakieś md5 chociaż by się przydało..
thek
Nitek... nie do końca o to mu chodziło. Użycie
  1. WHERE email='$email' AND password='$password'
Zwróci mu wszystkich użytkowników mających to hasło i jednocześnie ten sam email. A taki w bazie zazwyczaj jest maksymalnie jeden. Wywołanie z kolei dając OR zamiast AND wywali rekordy gdzie jest albo podany emailn albo podane hasło. I w wyniku count zwróci dokładnie te same liczby. Bo po czym rozpozna hasło lub email?

Można takie zapytanie napisać ale wyglada ono mniej więcej tak:
  1. SELECT ( SELECT count(id) FROM users WHERE email LIKE '$email' ) AS mail, ( SELECT count(id) FROM users WHERE password LIKE '$password' ) AS password

Inaczej tego nie da się zrobić i de facto jest to złożenie dwóch podzapytań do kupy, z których każde zwraca namto o co nam chodzi.
nitek
Cytat(thek @ 31.08.2009, 16:47:53 ) *
Nitek... nie do końca o to mu chodziło. Użycie


Sorry, tego podwójnego counta to sam nie wiem jakim cudem napisałem biggrin.gif
faktycznie 'mały' błąd winksmiley.jpg
vadergb
Cytat(nitek @ 31.08.2009, 15:41:30 ) *
po co sprawdzasz osobno, czy uzytkownik o takim mailu istnieje, a potem dopiero, czy haslo jest poprawne?
w jednym zapytaniu bedzie to mniej wiecej tak:

  1. SELECT count(mail) AS ilosc_mail, count(password) AS ilosc_password FROM users WHERE email='$email' AND password='$password' AND user_id=."$_SESSION[id];


poza tym z kodu wynika, że hasło masz jawnie zapisane w bazie.. jakieś md5 chociaż by się przydało..


To byl przyklad w ktorym nie chodzilo o zabezpieczenie - kodowanie jest na sha1.

thek - o takie cos mniej wiecej mi chodzilo. thx
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-2024 Invision Power Services, Inc.