PDO nie zwraca rekordów z prawidłowego zapytania

Odpowiedz Nowy wątek
2015-02-05 08:10
0

Witam, stworzyłem prosty skrypt do logowania użytkowników, niestety kod nie zwraca mi żadnych wyników z bazy danych. Wydaje mi się że nieumiejętnie korzystam z PDO, moglibyście zerknąć?

<?php
/**
 * Created by PhpStorm.
 * User: Piotrek
 * Date: 2015-02-02
 * Time: 23:03
 */

session_start();

class UserAuthentication{
    private $user;
    private $password;

   function authentication($username, $password)
   {
       require("DatabaseData.php");

       $this->user = $username;
       $this->password = $password;

       try {
           $pdo = new PDO('mysql:host='.$mysql_host.';dbname='.$database.';port='.$port, $username, $password );
           $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
           $stm = $pdo->prepare("SELECT * FROM uzytkownicy where Login =?");
           $stm->bindValue(1,  $this->user, PDO::PARAM_STR);
           $stm->execute();
           while ($user = $stm->fetch()) {
               echo $user['idUzytkownika'];
               if($user['Haslo'] == $this->password){
                   $_SESSION["logged"] = $user['IdUzytkownika'];
                   header("Location: ../index.php");
               }
               else{
                   echo"cids";
                   header("Location: ../login.php");
               }
           }
       } catch (PDOException $e) {
           echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
       }
       $stm = null;
   }
}

function checkAuthentication(){
    if (isset($_POST['submit'])){
        if(!empty($_POST['login'])){
            if(!empty($_POST['password'])){
                $a = new UserAuthentication();
                $a->authentication($_POST['login'], sha1($_POST['password']));
            }
        }
    }
}

Dodam tylko, że aplikacja nie wchodzi w ogóle do pętli while()

edytowany 1x, ostatnio: piotrekphp, 2015-02-05 08:14

Pozostało 580 znaków

2015-02-05 11:13
1

Dodaj sobie var_dump($this->user) - zobacz czy zmienna na pewno wypełniona jest oczekiwaną wartością.
Zajrzyj do bazy - czy na pewno jest user o takim loginie?
Warto zbadać też czy execute zwróciło true czy false (choć po PDO spodziewam się zawsze rzucenia wyjątku, ale wtedy w sumie nie byłoby jak zwrócić false).


Pozostało 580 znaków

2015-02-05 13:19

Może trzeba dokonać pewnych zmian w kodzie...np tak:


           $stm=$this->pdo->prepare("SELECT login, password FROM uzytkownicy WHERE login = :login AND password = :password ");
           $stm->bindParam(':login', $login, PDO::PARAM_STR);
           $stm->bindParam(':password', $password, PDO::PARAM_STR);
           $result = $stm->execute();
           $rows = $stm->fetchAll();
           $n = count($rows);
           if($n==1)
           {
                  // dalsza część kodu

i może jeszcze trim


          function authentication(trim($username), trim($password))
         {
                // twoja funkcja...

Pozostało 580 znaków

2015-02-05 19:28
0
dzek69 napisał(a):

var_dump($this->user)

Okazało się, że tworząc nowy obiekt i wysyłając parametry w konstruktorze, nie były one przypisywane do zmiennych. Po dodaniu seterów, problem zniknął (nie mam pojęcia o co chodzi).

bus45 napisał(a):

Może trzeba dokonać pewnych zmian w kodzie...

Dzięki za wskazówki, kilka z nich wykorzystałem, kod pisałem na szybko na zaliczenie, nie przyłożyłem się zbytnio:)

Pozostało 580 znaków

2015-02-05 19:30
0

@piotrekphp pokaż ten konstruktor


Pozostało 580 znaków

2015-02-05 19:44
0

<code class="code><?php
/**

  • Created by PhpStorm.
  • User: Piotrek
  • Date: 2015-02-02
  • Time: 23:03
    */

session_start();

class UserAuthentication{
private $user;
private $password;

function setUsername($user){
    $this->user = $user;
}
function setPassword($password){
    $this->password = $password;
}
function authentication()

{
require("DatabaseData.php");
$pdo = new PDO('mysql:host='.$mysql_host.';dbname='.$database.';port='.$port, $username, $password );
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

   try {

       $stm= $pdo->prepare("SELECT * FROM uzytkownicy WHERE Login = :login AND Haslo = :password ");
       $stm->bindParam(':login', $this->user, PDO::PARAM_STR);
       $stm->bindParam(':password', $this->password, PDO::PARAM_STR);
       $stm->execute();
       $rows = $stm->fetchAll();
       $n = count($rows);
       if ($n > 0){
           $stm ->execute();
           while($user = $stm->fetch()){
               $_SESSION["logged"] = 1;
               $_SESSION["IdUzytkownika"] = $user['IdUzytkownika'];
               $_SESSION["Login"] = $user["Login"];
               $_SESSION["Email"] = $user["Email"];
               header("Location: index.php");
           }
       }
       else{
          echo ("Nieprawidłowe hasło lub nazwa użytkownika");
       }
   } catch (PDOException $e) {
       echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
   }
   $stm = null;

}
}

function checkAuthentication(){
if (isset($_POST['submit'])){
if(!empty($_POST['login']) && !empty($_POST['password'])){
$a = new UserAuthentication();
$a->setUsername($_POST['login']);
$a->setPassword(sha1($_POST['password']));
$a->authentication();
}
}
}
?>



Funkcję checkAuthentication(); wywołuję w pliku logowania;
edytowany 1x, ostatnio: piotrekphp, 2015-02-05 19:45

Pozostało 580 znaków

2015-02-06 00:02
0

Ja tu nie widzę konstruktora ;)

Druga ciekawostka (bo problem z tego co wiem rozwiązany) - hashowaniem hasła powinna się zajmować funkcja setPassword, a nie oczekiwać, że dostanie zahashowane hasło.


Pozostało 580 znaków

2015-02-06 13:42
0

Masz rację, chodziło mi o parametry przekazywane w funkcji authentication(); Czy jest jakiś konkretny powód, żeby funkcja setPassword() hashowała hasło, czy po prostu ma to ułatwić przyszłą rozbudowę skryptu?

Pozostało 580 znaków

2015-02-06 13:58
1

Tak jest po prostu logicznie. Zamiast w każdym wywołaniu funkcji hashować parametr - hashować go wewnątrz, skoro i tak musi to zostać zrobione. Jak zechcesz zmienić hashowanie (np. dodać sól, zmienić algorytm) to zmieniasz w jednej funkcji, a nie w dwudziestu jej wywołaniach.


Tak jak funkcja PostawKlocka() w parametrze przyjmuje osobe, a nie osobe ze sciagnietymi gaciami, bo kiedys zapomnisz sciagnac gacie przed wejsciem i bedzie nieprzyjemnie:P - szalonyfacet 2015-02-06 14:03

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0