Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][PDO] Rejestracja
Forum PHP.pl > Forum > Przedszkole
Max Damage
Cześć, czytałem trochę dziś o PDO i postanowiłem użyć go w skryptach. Nie jestem jednak pewny czy dobrze wszystko zrozumiałem i napisałem, więc dobrze by było gdyby ktoś to sprawdził i poprawił, bądź pokazał jak napisać to lepiej. Przykładowy kod: rejestracja.
  1. function rejestruj($nick,$haslo,$haslo2,$email){
  2. $lacz=lacz();
  3. if(strlen($nick)<6)
  4. throw new Exception('Za krotki nick.');
  5. $wynik=$lacz->prepare("SELECT nick FROM user WHERE nick=:nick");
  6. $wynik->bindValue(':nick',$nick,PDO::PARAM_STR);
  7. $ilosc=$wynik->execute();
  8. if(count($ilosc) > 0)
  9. throw new Exception('podany nick juz istnieje.');
  10. if(strlen($haslo)<6)
  11. throw new Exception('Za krotkie haslo.');
  12. if($haslo!=$haslo2)
  13. throw new Exception('Hasla nie sa takie same.');
  14. if(!preg_match("/^[a-zA-Z0-9.-]+@[a-zA_Z0-9.-]+[a-zA-Z0-9.-]+$/",$email))
  15. throw new Exception('Adres email jest niepoprawny');
  16. $wynik=$lacz->prepare("SELECT email FROM user WHERE email=:email");
  17. $wynik->bindValue(':email',$email,PDO::PARAM_STR);
  18. $ilosc=$wynik->execute();
  19. if(count($ilosc) > 0)
  20. throw new Exception('podany email juz istnieje.');
  21. $sql="INSERT INTO user (nick,haslo,email) VALUES (:nick,:haslo,:email)";
  22. $wynik=$lacz->prepare($sql);
  23. $wynik->bindValue(':nick',$nick,PDO::PARAM_STR);
  24. $wynik->bindValue(':haslo',$haslo,PDO::PARAM_STR);
  25. $wynik->bindValue(':email',$email,PDO::PARAM_STR);
  26. $wynik->execute();
  27. if($wynik)
  28. echo 'Rejestracja pomyslna.';
  29. }

Z tego co wyczytałem używając bindValue nie muszę już używać na zmiennych innych funkcji typu: stripslashes itp., ponieważ ona sama przed tym zabezpiecza. Może ktoś dokładniej sprecyzować jak to jest?
erix
Daaawno było na przedszkolu cokolwiek z wyjątkami jako struktury kontrolne, na plus.

Cytat
Nie jestem jednak pewny czy dobrze wszystko zrozumiałem i napisałem, więc dobrze by było gdyby ktoś to sprawdził i poprawił, bądź pokazał jak napisać to lepiej. Przykładowy kod: rejestracja.

A nie działa? tongue.gif

Cytat
Z tego co wyczytałem używając bindValue nie muszę już używać na zmiennych innych funkcji typu: stripslashes itp., ponieważ ona sama przed tym zabezpiecza. Może ktoś dokładniej sprecyzować jak to jest?

Zgadza się.
Max Damage
To, że działa nie znaczy że jest dobrze : )
Przede wszystkim nie bardzo wiem jak mam zliczać ilość zwróconych wierszy w zapytaniu. Fakt, że w tamtym kodzie to działało i pokazywało, że np. taki nick jest już zajęty. Ale np. w tym fragmencie kodu już działa źle. Loguje każdego jak leci : )
  1. function logowanie($nick,$haslo)
  2. {
  3. $lacz=lacz();
  4. $sql="SELECT * FROM user WHERE nick=:nick AND haslo=:haslo";
  5. $wynik=$lacz->prepare($sql);
  6. $wynik->bindValue(':nick',$nick,PDO::PARAM_STR);
  7. $wynik->bindValue(':haslo',$haslo,PDO::PARAM_STR);
  8. $ilosc=$wynik->execute();
  9. if(count($ilosc)>0)
  10. return true;
  11. else
  12. return false;
  13. }
zegarek84
Cytat(Max Damage @ 19.08.2009, 20:59:38 ) *
  1. function logowanie($nick,$haslo)
  2. {
  3. $lacz=lacz();
  4. $sql="SELECT * FROM user WHERE nick=:nick AND haslo=:haslo";
  5. $wynik=$lacz->prepare($sql);
  6. $wynik->bindValue(':nick',$nick,PDO::PARAM_STR);
  7. $wynik->bindValue(':haslo',$haslo,PDO::PARAM_STR);
  8. $ilosc=$wynik->execute();
  9. if(count($ilosc)>0)
  10. return true;
  11. else
  12. return false;
  13. }

w zapytaniu daj jeszcze limit 1 to szybciej zwróci wynik jeśli znajdzie takiego urzytkownika a i tak ma być jeden...
po wykonaniu zapytania [$wynik->execute();] obiekt $wynik ma w odpowiedzi jakiś wynik...
i np.:
$wynik=$wynik->fetch(); jeśli bedziesz miał zalogowanego urzytkownika zwróci Ci tablicę asocjacyjną oraz odpowiednio pola numeryczne kolejno do asocjacyjnej - ja u siebie akurat mam na tablicy asocjacyjnej ale patrząc na Twoje zapytanie bedzie lepiej skożystać z numerycznej i wracając do tego co napisałem wcześniej:
  1. $wynik->execute();
  2. $wynik=$wynik->fetch();
  3. return isset($wynik[0])?true:false;

erix
Sposób z wyciąganiem jednego rekordu przy sprawdzaniu są dane/nie jest tu najlepszy.

Ale jeśli chcesz najszybciej sprawdzać ilość rekordów z zapytania, to wykonaj dodatkowe FOUND_ROWS - poczytaj, co do czego. Swoją drogą, lepiej dla Ciebie najpierw zwalidować formularz i dopiero wtedy katować bazę. ;]
Cysiaczek
A nie lepiej po prostu samo COUNT(id)?
  1. SELECT COUNT(id) AS number_of_users FROM users WHERE nick=:nick AND haslo=:haslo
Max Damage
Brakuje mi tu po prostu funkcji typu mysql_num_rows(), ale wyczytałem wczoraj, że wcale nie jest ona tak dobra jak się z początku wydaje. W sumie mogę, więc zliczać ilość zwróconych wierszy na kilka sposobów:
  1.  
  2. $lacz=lacz();
  3. $sql=$lacz->query("SELECT SQL_CALC_FOUND_ROWS * FROM user");
  4. $sql2=$lacz->query("SELECT FOUND_ROWS() AS total");
  5. $wynik=$sql2->fetch();
  6. echo 'Suma: '.$wynik['total'].'<br/>';
  7. $sql2->closeCursor();
  8.  
  9. $ilosc=0;
  10. while($tab=$sql->fetch()){
  11. echo $tab['nick'].'<br/>';
  12. echo $tab['haslo'].'<br/>';
  13. echo $tab['email'].'<br/>';
  14. $ilosc++;echo '<br/>';
  15. }
  16. echo 'Suma: '.$ilosc.'<br/>';
  17. $sql->closeCursor();
  18.  
  19. echo '<br/>';
  20. $sql4=$lacz->query("SELECT *,COUNT(id) AS suma FROM user");
  21. foreach($sql4->fetchAll() as $wynik){
  22. echo $wynik['nick'].'<br/>';
  23. echo $wynik['haslo'].'<br/>';
  24. echo $wynik['email'].'<br/>';
  25. }
  26. echo 'Suma: '.$wynik['suma'];
  27. $sql4->closeCursor();

I znów nie pasuje mi kilka rzeczy:
Podobno nie da się wykonać drugiego zapytania bez zamknięcia pierwszego za pomocą closeCursor(). A ja mam dwa zapytania pod rząd i to działa. Więc jak to w końcu jest?
Chciałbym aby zapytanie oprócz tego że zlicza mi wybrane rekordy, zwracało mi także inne pola. Niby mógłbym wykonać dwa zapytania: jedno z COUNT, a drugie pobierające wszystkie rekordy, ale jak to zrobić w jednym zapytaniu? Teraz wyświetla mi tylko dane z pierwszego wiersza (nie wiem dlaczego) i oczywiście sumę, a ja chciałbym dane z wszystkich wierszy.
erix
Cytat
Podobno nie da się wykonać drugiego zapytania bez zamknięcia pierwszego za pomocą closeCursor(). A ja mam dwa zapytania pod rząd i to działa. Więc jak to w końcu jest?

:
Cytat
PDOStatement::closeCursor() frees up the connection to the server so that other SQL statements may be issued, but leaves the statement in a state that enables it to be executed again.


Cytat
Niby mógłbym wykonać dwa zapytania: jedno z COUNT, a drugie pobierające wszystkie rekordy, ale jak to zrobić w jednym zapytaniu? Teraz wyświetla mi tylko dane z pierwszego wiersza (nie wiem dlaczego) i oczywiście sumę, a ja chciałbym dane z wszystkich wierszy.

Wyciąga tak dlatego, gdyż count jest funkcją agregującą. Hmm, a found_rows Ci nie pasuje...?
Max Damage
Cytat
Wyciąga tak dlatego, gdyż count jest funkcją agregującą. Hmm, a found_rows Ci nie pasuje...?

Może być, o count pytałem tak z ciekawości. Dzięki za pomoc.
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.