geometria
@geometria

Как настроить авторизацию в MVC PHP?

В этом коде у меня отображается переменная из инпута, а не из БД после проверки логина и пароля. А хотелось бы именно чтоб работала проверка, как и предполагает логика авторизации.
Подскажите как настроить правильно авторизацию?

routes.php
//в этой части кода прописана реакция на клик по кнопке с именем add
switch($action) {
        case 'index':
        if (isset($_POST['add'])) {
          $name = $_POST['name'];
          $password = $_POST['password'];
          $login = new Auth($name, $password);
          $insertId = $login->login($name, $password);
          //отображает имя из формы а не из БД
          echo $login->name;
          }
        break;


views/auth.php
<form name="frmAdd" method="post" action="" id="frmAdd"
    onSubmit="return validate();">
<div id="mail-status">

<div>
    <label style="padding-top: 20px;">Name</label> <span
        id="name-info" class="info"></span><br />
        <input type="text"
        name="name" id="name" class="demoInputBox">
</div>
<div>
    <label>Password</label> <span id="password" class="info"></span><br />
    <input type="password" name="password" id="password" class="demoInputBox">
</div>
<div>
    <input type="submit" name="add" id="btnSubmit" value="Login" />
</div>
</div>

</body>
</html>


controllers/authController.php
<?php
  class AuthController {
    public function index() {
        require_once('views/auth.php');
    }
}


models/Auth.php
<?php
  class Auth {
    public $name;
    public $password;

public function __construct($name, $password) {
      $this->name          = $name;
      $this->password   = $password;
    }

    public static function login($name, $password) {
      $db = Db::getInstance();
      $name = intval($name);
      $password = intval($password);
      $req = $db->prepare('SELECT * FROM users WHERE name = :name AND password = :password');
      $req->execute(array('name' => $name, 'password' => $password));
      $login = $req->fetch();

      return new Auth($login['name'], $login['password']);
    }


}
  • Вопрос задан
  • 492 просмотра
Решения вопроса 1
@asmodeusta
PHP Developer (Laravel, Wordpress)
Давайте пройдемся по коду:
1. Нужно исправить метод login в классе Auth
public static function login($name, $password) {
      $db = Db::getInstance();
      $name = intval($name);
      $password = intval($password);
      $req = $db->prepare('SELECT * FROM users WHERE name = :name AND password = :password');
      $req->execute(array('name' => $name, 'password' => $password));
      $login = $req->fetch();

      //return new Auth($login['name'], $login['password']); - Зачем здесь возвращать новый инстанс этого же класса?
      return $login; // - возможно вам это нужно
    }

2. В контроллере нужно выводить полученные данные
$loginData = $login->login($name, $password);
 //отображает имя из формы а не из БД
echo $loginData->name;


Это только то что можно исправить чтобы заработало, но в остальном весь код нужно переделать:
Это уберите немедленно -
$name = intval($name);
$password = intval($password);

Это тоже не нужно
<?php
  class AuthController {
    public function index() {
        require_once('views/auth.php');
    }
}

Вместо этого используйте автозагрузку (в идеале composer)
Переделайте модель авторизации, не используйте публичные свойства, вместо них private & getters
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Причина в том, что этот код - полная бессмыслица.
Если просто случайным образом писать операторы РНР, и то получится лучше.

Надо на пару лет забыть про красивые слова OOP и MVC, и поучиться просто писать код, который делает то, что требуется.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы