2016-03-25 2 views
0

Я пытаюсь создать простую систему входа ООП для обучения.Задайте логическую задачу строк строк

Это класс Auth, который я использую для системы регистрации/входа.

<?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); 
    } 

} 

И это место, где я использую класс:

<?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']); 
    } 

Проблема заключается в том, что даже если неверный пароль или имя пользователя не существует, он не отображает сообщение об ошибке " Пользователь не найден!" поэтому кажется, что условие, когда я указал, что счетчик пользовательской переменной должен быть больше 0, не работает.

Я попытался найти альтернативу для простого count(), который я использовал, но это, похоже, не помогло. Я теряюсь в деталях ООП, и я думаю, что это скорее логическая проблема, чем синтаксическая.

Любые идеи, что я сделал не так? Кроме того, любой конструктивный обзор кода, который я написал, замечательно читать. :)

+1

Вы можете использовать 'var_dump' чтобы увидеть, что внутри '$ user' после вызова' select'. – PierreDuc

+1

Это не имеет ничего общего с ООП. Спроси себя, * что ты хочешь здесь сосчитать? Затем замените условие только 'if ($ user)'. В отношении обзора вы можете найти эту статью интересной, [ваши первые болезни базы данных базы данных] (https://phpdelusions.net/pdo/common_mistakes) –

+0

@PierreDuc с использованием var_dump возвращает 'bool (false)' –

ответ

1

Если сбой неудачи, он возвращает FALSE. Таким образом, вы заканчиваете подсчет FALSE при сбое выборки.

Поскольку FALSE не является счетным или массив функция возвращает 1.

count return values

Чтобы решить эту проблему, вы можете регулировать свое состояние:

if (!$user) 
Смежные вопросы