Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PDO进行PHP简单登录_Php_Pdo - Fatal编程技术网

使用PDO进行PHP简单登录

使用PDO进行PHP简单登录,php,pdo,Php,Pdo,这是我的控制器类登录检查部分 案例“checkLogin”: $username = isset($_REQUEST['username']) ? trim($_REQUEST['username']) : ""; $password = isset($_REQUEST['password']) ? trim($_REQUEST['password']) : ""; try{ $login = $user-&g

这是我的控制器类登录检查部分

案例“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;
用户模型功能

这是我的用户模型函数,用于检查用户名和密码

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模式登录

我这里有一些代码

如果去掉所有无用和错误的东西,login()就会变成这样

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几乎没有关系这是一个很好的MVC初始框架,但是您的代码需要工作。一些建议

  • 我会对密码使用更好的加密方法,MD5现在有点过时了
  • 您正在创建一个框架,因此继续以模块化的方式进行思考,尝试压缩和简化代码,以便它基本上接收请求并返回结果,在其他地方处理无关的内容。例如,当您在“case checklogin”时,您的应用程序应该已经处理了帖子并检查了帖子是否已设置
    我不会发布代码,因为我觉得你是在自学,就像我曾经做过的那样。。我们最不希望看到的是剪切粘贴解决方案。

    一些提示:MySQL扩展已经过时了。删除对
    mysql\u real\u escape\u string()
    strip\u tags()
    stripslashes()
    的函数调用。它们是不必要的,并且限制用户的密码!不管怎样,您使用的是PDO和准备好的语句,因此不需要转义。MD5不应用于密码哈希。切换到bcrypt或scrypt。你也应该使用salt。这与MVC无关。除了@ComFreek列出的问题之外,您还完全崩溃了,特别是关于表示层和模型层之间的划分。用户请求和响应处理在表示层之间的分离。关于“如何在MVC中登录用户”,可能或可能会有一些启示。人们应该停止在中处理代码,以便复制粘贴的片段。您在本网站中看到的代码通常用于演示示例,不应在生产中使用。@tereško别误会我的意思。我的代码已经准备好了复制粘贴,甚至可以用于生产。那么,对于PDO异常,您会将try/catch块称为什么呢?@Sammitch问得好。我认为这是PHP世界上最糟糕的迷信之一。大多数PHP人员不知道什么是异常以及它们的用途。这个问题的代码就是一个很好的例子。@Sammitch我明白了(你的回答带有一个罕见的标记,那就是我投的赞成票)。如果这不仅仅是无意识地背诵一些咒语,最终你会理解正确的错误处理。“加密”在这里不是正确的术语。这叫做“散列”。