Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][PDO] Rejestracja
Max Damage
post 19.08.2009, 19:08:49
Post #1





Grupa: Zarejestrowani
Postów: 246
Pomógł: 19
Dołączył: 14.06.2007

Ostrzeżenie: (0%)
-----


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?


--------------------
"Wszyscy wiedzą, że czegoś nie da się zrobić, i przychodzi taki jeden, który nie wie, że się nie da, i on właśnie to robi." - Albert Einstein
Go to the top of the page
+Quote Post
erix
post 19.08.2009, 19:12:58
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Max Damage
post 19.08.2009, 19:59:38
Post #3





Grupa: Zarejestrowani
Postów: 246
Pomógł: 19
Dołączył: 14.06.2007

Ostrzeżenie: (0%)
-----


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


--------------------
"Wszyscy wiedzą, że czegoś nie da się zrobić, i przychodzi taki jeden, który nie wie, że się nie da, i on właśnie to robi." - Albert Einstein
Go to the top of the page
+Quote Post
zegarek84
post 19.08.2009, 20:57:44
Post #4





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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;



--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
erix
post 19.08.2009, 21:47:46
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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ę. ;]


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Cysiaczek
post 19.08.2009, 22:22:16
Post #6





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




A nie lepiej po prostu samo COUNT(id)?
  1. SELECT COUNT(id) AS number_of_users FROM users WHERE nick=:nick AND haslo=:haslo


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
Max Damage
post 20.08.2009, 10:27:17
Post #7





Grupa: Zarejestrowani
Postów: 246
Pomógł: 19
Dołączył: 14.06.2007

Ostrzeżenie: (0%)
-----


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.


--------------------
"Wszyscy wiedzą, że czegoś nie da się zrobić, i przychodzi taki jeden, który nie wie, że się nie da, i on właśnie to robi." - Albert Einstein
Go to the top of the page
+Quote Post
erix
post 20.08.2009, 11:57:59
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Max Damage
post 20.08.2009, 12:29:27
Post #9





Grupa: Zarejestrowani
Postów: 246
Pomógł: 19
Dołączył: 14.06.2007

Ostrzeżenie: (0%)
-----


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.


--------------------
"Wszyscy wiedzą, że czegoś nie da się zrobić, i przychodzi taki jeden, który nie wie, że się nie da, i on właśnie to robi." - Albert Einstein
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.04.2024 - 09:31