Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Logowanie [PDO] [PHP]
Forum PHP.pl > Forum > Przedszkole
jarek998
Witam, mam problem dotyczący logowania w PDO, jestem początkującym w tej bibliotece.

Tutaj wklejam kod który ma za zadanie sprawdzić czy dany gracz istnieje bądź też nie:
  1. $sprawdz_dane = $db->prepare("SELECT * FROM uzytkownicy WHERE email=:email AND haslo=:haslo");
  2.  
  3. $sprawdz_dane->bindValue(':email', $_POST['email'], PDO::PARAM_STR);
  4.  
  5. $sprawdz_dane->bindValue(':haslo', $_POST['haslo'], PDO::PARAM_STR);
  6.  
  7. $sprawdz_dane->execute();
  8.  
  9. if($sprawdz_dane->rowCount() > 0 ){
  10.  
  11. $_SESSION = array();
  12.  
  13. $_SESSION['gracz'] = $_POST['email'];
  14.  
  15. header("Location: start.php");
  16.  
  17.  
  18.  
  19. }else{
  20.  
  21. echo "<script type='text/javascript'>window.alert('Nie ma takiego użytkownika')</script>";


Nawet gdy wpisuje dobre dane pojawia się alert "Nie ma takiego gracza".

Z góry dziękuję za każdą pomoc !
markonix
Cytat(jarek998 @ 18.06.2015, 12:31:47 ) *
Nawet gdy wpisuje dobre dane pojawia się alert "Nie ma takiego gracza".

To masz gdzie indziej błąd bo z kodu wynika, że powinien się wyświetlić błąd "Nie ma takiego użytkownika".

A tak na poważnie to debuguj, może źle przekazujesz dane z formularza.

Albo zastosuj poradę z PHP.net:

Cytat
For most databases, PDOStatement::rowCount() does not return the number of rows affected by a SELECT statement. Instead, use PDO::query() to issue a SELECT COUNT(*) statement with the same predicates as your intended SELECT statement, then use PDOStatement::fetchColumn() to retrieve the number of rows that will be returned. Your application can then perform the correct action.
jarek998
Tylko w tym jest problem że przy rejestracji mam podobnie zrobione i dzała:

KOD:
  1. $sprawdz = $db->prepare("SELECT * FROM uzytkownicy WHERE nick=:nick OR email=:email");
  2.  
  3. $sprawdz->bindValue(':nick', $_POST['nick'], PDO::PARAM_STR);
  4.  
  5. $sprawdz->bindValue(':email', $_POST['email'], PDO::PARAM_STR);
  6.  
  7. $sprawdz->execute();
  8.  
  9.  
  10.  
  11. if($sprawdz->rowCount() > 0 ){
  12.  
  13. echo "<script type='text/javascript'>window.alert('Taki gracz już istnieje!')</script>";


PS. Formularz:
  1. <center><h2>Zaloguj się</h2></center>
  2. <form class="form-horizontal" action="index.php?act=log" method="POST">
  3.  
  4. <div class="form-group">
  5.  
  6. <label for="inputEmail3" class="col-md-2 control-label" >E-mail</label>
  7. <div class="col-md-8">
  8. <input type="email" class="form-control" id="inputEmail3" name="email" placeholder="E-mail">
  9. </div>
  10. </div>
  11. <div class="form-group">
  12. <label for="inputPassword3" class="col-md-2 control-label" >Hasło</label>
  13. <div class="col-md-8">
  14. <input type="password" class="form-control" id="inputPassword3" name="haslo" placeholder="Hasło">
  15. </div>
  16. </div>
  17. <div class="form-group">
  18. <div class="col-md-offset-2 col-md-8">
  19. <div class="checkbox">
  20. <input type="checkbox"> Zapamiętaj mnie
  21. </label>
  22. </div>
  23. </div>
  24. </div>
  25. <div class="form-group">
  26. <div class="col-md-offset-2 col-md-8">
  27. <button type="submit" name="logo" class="btn btn-danger">Wchodzę do gry</button>
  28. </div>
  29. </div>
  30.  
  31. </form>
markonix
Odnieś się do mojej drugiej części, która wg mnie jest bardziej kluczowa.
jarek998
Hymm, ale skoro mam w rejestracji tak zrobione, a w logowaniu tak samo to też powinno działać, heh dziwne ohno-smiley.gif

viking
A wyświetl sobie jakie rekordy ten select zwraca. Może jakiś warunek nie jest spełniony? Poza tym nie trzymaj gołych haseł w bazie. Użyj choćby najprostszego sha1, albo http://php.net/manual/en/function.password-hash.php
jarek998
md5 nie wystarczy?
nospor
Trzymanie hasła w postaci md5 juz od dawien dawna jest jednoznaczne z trzymaniem hasła w postaci jawnej
jarek998
Dzięki za podpowiedź.

PS. Zmieniłem troszkę kod i teraz nie zwraca mi zawsze że nie ma takiego użytkownika, ale znów pojawił się problem ponieważ nie przenosi do strony po zalogowaniu.

  1. if(empty($_POST['email']) || empty($_POST['haslo'])){
  2.  
  3. echo "<script type='text/javascript'>window.alert('Uzupełnij wszystkie dane')</script>";
  4.  
  5. }else{
  6.  
  7. $haslo = md5($_POST['haslo']);
  8.  
  9. $sprawdz = $db->prepare("SELECT * FROM uzytkownicy WHERE email=:email OR haslo=:haslo");
  10.  
  11. $sprawdz->bindValue(':email', $_POST['email'], PDO::PARAM_STR);
  12.  
  13. $sprawdz->bindValue(':haslo', $haslo, PDO::PARAM_STR);
  14.  
  15. $sprawdz->execute();
  16.  
  17.  
  18.  
  19. if($sprawdz->rowCount() > 0 ){
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26. header("Location: start.php");
  27.  
  28.  
  29.  
  30. }else{
  31.  
  32. echo "<script type='text/javascript'>window.alert('Nie ma takiego użytkownika')</script>";
  33.  
  34. }
Turson
Włacz raportowanie wszystkich bledow a na 99,9% (o ile zapytanie ok) ujrzysz "Headers already sent by..."
jarek998
Hymm, nigdy tego nie robiłem jak tą włączyć ? ohno-smiley.gif
Comandeer
http://php.net/manual/en/errorfunc.configuration.php
Heh, fajnie, że mam domyślnie rumuński manual biggrin.gif
nospor
Tu masz napisane
Temat: Jak poprawnie zada pytanie
jarek998
Dodałem na początku swojego skryptu
  1. ini_set('display_errors','1');
lecz nic się nie pojawia - jestem w tym kompletnie zielony ;/
Bobek1910
Na samej górze pliku, od razu zaraz po "<?php" wstaw sobie ob_start();

Tak to ma wyglądać:
  1. <?php


A jak zadziała, to naucz się, jak robić aplikację, tak, żeby to nie było potrzebne. tongue.gif
jarek998
Nie zadziałało - ale fakt zapomniałem o tym smile.gif

W konsoli też nie pojawia się żaden błąd (CRTL + SHIFT + J). :/
Bobek1910
Żadnego błędu nie pokazuje, nic?

Na pierwszy rzut oka w zapytaniu zamień OR na AND, bo mogą dziwne wyniki wychodzić.

A może zadziałało, ale ten start.php ma jakiegoś headera, który wywala Cię z powrotem na... główną?
jarek998
Miałeś racje, był tam przekierowanie na index.php, ale to dlatego że sesja się nie ustalała, i dalej się nie ustala - gdy skasowałem przeniosło na start.php.

Ustalanie sesji :
  1. $_SESSION = array();
  2.  
  3. $_SESSION['gracz'] = $_POST['nick'];


Tutaj wyrzucało
  1. <?php
  2. if(empty($_SESSION['gracz'])){
  3. echo("<script type='text/javascript'>window.alert('Twoja sesja wygasła.');document.location.href = 'index.php';</script>");
  4. die();
  5. }
  6. ?>


Sesja powinna się ustalać a tego nie robi.. ohno-smiley.gif
nospor
A masz tam session_start ?
jarek998
mam

  1. if($_GET['act'] == 'log'){
  2.  
  3.  
  4. //pobieramy zawartość pliku ustawień
  5. require_once('inc/config.php');
  6.  
  7. //startujemy lub przedłużamy sesję


Temat do zamknięcia smile.gif

Mój błąd przy ustalaniu sesji
  1. $_SESSION['gracz'] = $_POST['email'];
zamiast 'email' wpisałem 'nick'.

Dziękuję wszystkim ! headsetsmiley.png
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.