与PDO

2013-10-02 37 views
0

PHP简单的登录这是我的控制器类登录检查部分与PDO

案 'checkLogin':

 $username = isset($_REQUEST['username']) ? trim($_REQUEST['username']) : ""; 
     $password = isset($_REQUEST['password']) ? trim($_REQUEST['password']) : ""; 


     try{ 

      $login = $user->login($username,$password); 

      if ($login === false) { 
       throw new Exception("username or password is wrong"); 
      }else { 

       $_SESSION['id'] = $login; 
       header('Location: index.php'); 

      } 

     } 
     catch(Exception $ex){ 

      $errMsg = $ex->getMessage(); 

      $view->render('view/login.php', array('errMsg' => $errMsg)); 
     } 

     break; 

的usermodel功能

这是我的检查用户模型功能用户名和密码。

public function login($username,$password){ 

    $username = strip_tags(stripslashes(mysql_real_escape_string($username))); 

    $password = strip_tags(stripslashes(mysql_real_escape_string($password))); 


    $stmt = $this->db->con->prepare("SELECT `password`, `id` FROM `user` WHERE `username` = ?"); 
    $stmt->bindValue(1, $username); 

    try{ 

     $stmt->execute(); 
     $data    = $stmt->fetch(); 

     $stored_password = $data['password']; 
     $id     = $data['id']; 


     if($stored_password === md5($password)){ 
      return $id; 
     }else{ 
      return false; 
     } 

    }catch(PDOException $e){ 
     echo $e->getMessage(); 
    } 

} 

请告诉我,这是正确的。此代码为我工作。 我正在使用它来实现基本的MVC模式登录。

我有一些代码从这里 http://www.sunnytuts.com/article/login-and-registration-with-object-oriented-php-and-pdo

+0

一些提示:MySQL扩展已过时。删除对'mysql_real_escape_string()','strip_tags()'和'stripslashes()'的函数调用。他们是不必要的,也限制了用户的密码!无论如何,您正在使用准备好的语句的PDO,所以您不需要转义。 MD5不应该用于密码散列。切换到bcrypt或scrypt。你也应该用盐。 – ComFreek

+0

这与MVC无关。除了@ComFreek列出的问题之外,您还完全违反了[SoC](https://en.wikipedia.org/wiki/Separation_of_concerns),特别是关于表示层和模型层之间的鸿沟。用户之间的分离请求响应处理与表示层。 –

+0

关于“如何在MVC中登录用户”,可能[this](http://stackoverflow.com/a/16650437/727208)或[this](http://stackoverflow.com/a/16997200/727208)可能一些启发。 –

回答

1

如果摆脱一切变成了这个样子

public function login($username, $password) 
{ 
    $stmt = $this->db->prepare("SELECT password, id FROM user WHERE username = ?"); 
    $stmt->execute(array($username)); 
    $row = $stmt->fetch(); 
    if(crypt($password, $row['password']) == $row['password']) 
    { 
     return $id; 
    } 
} 

注意无用和错误的东西,登录()更好的密码散列算法

其他代码部分必须做类似的事情:

$login = $user->login($_POST['username'], $_POST['username']); 
    if ($login) 
    { 
      $_SESSION['id'] = $login; 
      header('Location: index.php'); 
      exit; 
    } 
    $view->render('view/login.php', array('errMsg' => "Wrong credentials")); 
    break; 

是的,它与MVC很少有关系

+0

是的,删除所有*无用*错误检查。 – Sammitch

+0

代码中有* no *错误检查。 –

+1

人们应该停止将SO中的代码视为* copy-paste-able *件。您在本网站上看到的代码通常用于说明** EXAMPLE **,并且不应该用于生产。 –

-1

这是一个很好的MVC初始框架,但是你的代码需要工作。一些建议。

  1. 我会在密码上使用更好的加密方法,现在MD5已经有点过时了。
  2. 你正在制作一个框架,所以继续以模块化的方式思考,试着压缩和简化你的代码,以便它基本上接受请求并返回结果,处理其他地方的无关内容。例如,当你处于“check check check”状态时,你的应用程序应该已经处理了该帖子并检查了该帖子是否已设置。

我没有发布代码,因为我的想法是,你正在教你自己,就像我曾经做过的一样..而最后我们要找的东西是剪切和粘贴解决方案。

+1

'加密'在这里不是正确的术语。它被称为“哈希”。 – ComFreek