2016-03-25 16 views
0

Ich versuche, ein einfaches OOP Login-System für Lernzwecke zu bauen.Graf Zeilen Problem

Dies ist die Auth-Klasse, die ich für das Registrierungs-/Anmeldesystem verwende.

<?php 

require_once 'Database.class.php'; 

class Auth extends Database 
{ 
    const DATEFORMAT = 'd/m/Y'; 
    const TIMEFORMAT = 'H:i:s'; 

    public function __construct($host, $username, $password, $database) 
    { 
     parent::__construct($host, $username, $password, $database); 
     $this->connect(); 
     $this->setTable('users'); 
    } 

    public function insert(array $data) 
    { 
     $username = $data['username']; 
     $password = $data['password']; 
     $repeat_password = $data['repeat_password']; 
     $last_login = date(self::DATEFORMAT . ' ' . self::TIMEFORMAT); 

     if ($password == $repeat_password) 
     { 
      $password = hash("sha256", $password); 
      $stmt = $this->connection->prepare("INSERT INTO {$this->table} (username, password, last_login) VALUES(:username, :password, :last_login)"); 

      $stmt->execute(array(':username' => $username, 
           ':password' => $password, 
           ':last_login' => $last_login 
           ) 
          ); 
     } 
     else 
     { 
      // do something 
     } 
    } 

    public function select(array $data) 
    { 
     $username = $data['username']; 
     $password = $data['password']; 
     $password = hash("sha256", $password); 

     $stmt = $this->connection->prepare("SELECT * FROM {$this->table} WHERE username=:username AND password=:password LIMIT 1"); 

     $stmt->execute(array(':username' => $username, 
          ':password' => $password 
          ) 
         ); 

     return $stmt->fetch(PDO::FETCH_ASSOC); 
    } 

} 

Und dies ist der Ort, an dem ich die Klasse verwenden:

<?php 

require_once 'Auth.class.php'; 

if ($_SERVER['REQUEST_METHOD'] === 'POST') { 

    $auth = new Auth('localhost', 'root', '', 'oop'); 

    $user = $auth->select($_POST); 

    if (count($user) === 0) { 
     echo 'User not found!'; 
    }else{ 
     echo 'Hello, ' . ucfirst($user['username']); 
    } 

Das Problem ist, dass selbst wenn das Passwort falsch oder der Benutzername nicht existiert es nicht die Fehlermeldung angezeigt werden " Benutzer nicht gefunden!" So scheint es, dass die Bedingung, wo ich angegeben, dass die Anzahl der Benutzervariablen größer als 0 sein sollte, nicht funktioniert.

Ich suchte nach einer Alternative für die einfache count(), die ich verwendete, aber das schien nicht zu helfen. Ich verliere mich in den Details von OOP und ich denke, das ist eher ein logisches Problem als ein Syntax-Problem.

Irgendwelche Ideen, was ich falsch gemacht habe? Außerdem ist jede konstruktive Überprüfung des Codes, den ich geschrieben habe, großartig zu lesen. :)

+1

Sie können 'var_dump' um nach dem Aufruf von 'select' zu sehen, was sich in $ $ user befindet. – PierreDuc

+1

Es hat nichts mit OOP zu tun. Frage dich, * was * willst du hier zählen? Dann ersetzen Sie die Bedingung mit nur 'if ($ user)'. In Bezug auf die Überprüfung, können Sie diesen Artikel interessant finden, [Ihre Kinderkrankheiten erste Datenbank-Wrapper] (https://phpdelusions.net/pdo/common_mistakes) –

+0

@PierreDuc mit var_dump gibt 'bool (false)' –

Antwort

1

Wenn Fetch fehlschlägt, gibt es FALSE zurück. Sie zählen also bei fehlgeschlagenem Abruf FALSCH.

Da FALSCH ist keine zählbaren oder ein Array die Funktion kehrt 1.

count return values

Um dies zu lösen, können Sie Ihren Zustand einstellen:

if (!$user)