Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL][PHP] Ilość zwróconych rekordów
Forum PHP.pl > Forum > Przedszkole
arszawin
Fragment kodu:
  1. $sql = "SELECT * FROM users WHERE login = '$_POST[login]'";
  2. $wynik = mysql_query( $sql );

Powyższy kod wyświetla oczywiście ilość rekordów, w których pole login jest równe danej wpisanej w formularzu.
W praktyce, przy założeniu, że loginy nie mogą się powtarzać - będzie to 0 (gdy nie ma takiego użytkownika) lub 1 (w przeciwnym wypadku).

Gdy np $_POST[login] = nieMaTakiegoUzytkownika to naturalnie zwracane jest 0.
Ale... w zakłopotanie wprowadziło mnie to, że gdy w formularzu zrobie kilka spacji ($_POST[login] = " ") albo nie wpisze nic ($_POST[login] = ""), zwracane jest... 1! Dlaczego ? Oczywiście w bazie nie powinno być takiego rekordu.
pedro84
Wiesz co to trim? Wiesz co to SQL Injection. Pierwsze Ci się przyda do pozbycia się nadmiarowych spacji, drugie to podstawa!
arszawin
Dzięki za zwrócenie uwagi na SQL Injection.

Tak powinno być lepiej:
  1. $temp = addslashes($_POST[login]);
  2. $sql = "SELECT * FROM users WHERE login = '$temp'";
  3. $wynik = mysql_query( $sql );

Natomiast nie zrozumiałem, w jakim kontekście wspomniałeś o trim ? Dlaczego powinno zależeć mi na usunięciu nadmiarowych spacji ? W dalszym ciągu zwracany wynik to 1 i nie wiem dlaczego. Jeżeli dobrze rozumiem, to zapytanie wygląda mniej więcej tak:
  1. SELECT * FROM users WHERE login = ' '

Fifi209
użyj mysql_real_escape_string

co do trima
  1.  
  2. $login = mysql_real_escape_string(trim($_POST['login']));
  3.  


W dodatku po co wyciągasz wszystko?
Wyciągnij tylko id tego usera. ;]
arszawin
W takim razie może nieco inaczej:

  1. $login = mysql_real_escape_string(trim($_POST[login]));
  2. $sql = "SELECT * FROM users WHERE login = '$login'";
  3. $wynik = mysql_query( $sql );
  4.  
  5. $user = mysql_fetch_object( $wynik );
  6. $password = $user -> pass;
  7. $status = $user -> status;
  8.  
  9. if ( $password == md5( $_POST[pass] ) && mysql_num_rows($wynik)>0 ) {
  10. if ( $status == 1 ) {
  11. $_SESSION[login] = $_POST[login];
  12. }
  13. elseif ( $status == 0 ) {
  14. echo "<span>Konto nie zostało aktywowane.</span>";
  15. showLogin();
  16. } else {
  17. echo '<span>Konto zbanowane.</span>';
  18. showLogin();
  19. }
  20.  
  21. }
  22. else {
  23. echo '<span>Nieprawidłowy login lub/i haslo.</span>';
  24. showLogin();
  25. }

Jeżeli w formularzu podam pusty ciąg znaków, albo kilka spacji otrzymuje komunikat, iż konto nie zostało aktywowane. Wskazuje to na to, jakby znaleziono takiego użytkownika w bazie, co jest bez sensu. Zaproponowane mysql_real_escape_string nie rozwiązało tego problemu.
!*!
Przejrzyj ten temat.

Zadbaj o dane które przychodzą do Ciebie. Gdzie sprawdzasz czy login w ogóle coś zawiera, czy w ogóle istnieje, a jak istnieje to w jakiej formie?
Cytat
...Dlaczego powinno zależeć mi na usunięciu nadmiarowych spacji ...

Ponieważ powinno Ci zależeć na bezpieczeństwie. poczytaj o SQL Injection raz jeszcze.
[MYSQL] pobierz, plaintext
  1. $sql = "SELECT * FROM users WHERE login = '$login'";
[MYSQL] pobierz, plaintext

Po co pobierasz wszystko? Ogranicz się tylko do loginu i daj limit na 1.
Fifi209
Cytat(!*! @ 27.07.2010, 07:54:12 ) *
Przejrzyj ten temat.

Zadbaj o dane które przychodzą do Ciebie. Gdzie sprawdzasz czy login w ogóle coś zawiera, czy w ogóle istnieje, a jak istnieje to w jakiej formie?

Ponieważ powinno Ci zależeć na bezpieczeństwie. poczytaj o SQL Injection raz jeszcze.
[MYSQL] pobierz, plaintext
  1. $sql = "SELECT * FROM users WHERE login = '$login'";
[MYSQL] pobierz, plaintext

Po co pobierasz wszystko? Ogranicz się tylko do loginu i daj limit na 1.

Nie prościej do statusu? Statusu i tak potrzebuje...

co do zapytania - zwal na stronę mysql porównanie również hasła smile.gif
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.