使用PDO进行PHP简单登录
这是我的控制器类登录检查部分 案例“checkLogin”:使用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
$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初始框架,但是您的代码需要工作。一些建议
我不会发布代码,因为我觉得你是在自学,就像我曾经做过的那样。。我们最不希望看到的是剪切粘贴解决方案。一些提示: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我明白了(你的回答带有一个罕见的标记,那就是我投的赞成票)。如果这不仅仅是无意识地背诵一些咒语,最终你会理解正确的错误处理。“加密”在这里不是正确的术语。这叫做“散列”。