登录失败时发送消息

时间:2018-11-30 14:15:30

标签: php database login

我试图为正在创建的博客建立注册以获取php的经验,但是不幸的是,我似乎无法正常工作“错误”,而且我也没有找到任何对我有用的东西互联网。

使用这些功能,我想检查注册是否有效(用户名尚未使用,密码确认相同,每个字段均已填写)

public function isEmpty($username, $password, $pwagain){
 if (empty($username) OR empty($password) OR empty($pwagain)) {
   return true;
 } else {
    return false;
 }
}
public function isAssigned($username)
{
 if (!empty($this->userRepository- 
 >isUsernameAssigned($username))) {
   return true;
 } else {
   return false;
 }
}
public function isNotSame($password, $pwagain)
{
 if ($password != $pwagain) {
   return true;
 } else {
   return false;
 }
}
public function isValid($username, $password, $pwagain)
{
 $hashedpassword = password_hash($password, PASSWORD_DEFAULT);
 $newUser = $this->userRepository->newUser($username, 
 $hashedpassword);
 $_SESSION['login'] = $username;
 return $newUser;
}

这里是声明应该给出哪个错误的代码,我不知道如何将它们放在一起,以使$ errors不会被覆盖或类似的东西

public function sign()
{
 $categories = $this->categoryRepository->allCategories();
 $error = "";
 if(!empty($_POST['username']) AND !empty($_POST['password']) 
 AND !empty($_POST['pwagain'])) {
 $username = $_POST['username'];
 $password = $_POST['password'];
 $pwagain = $_POST['pwagain'];

 if ($this->signInService->isEmpty($username, $password, 
 $pwagain)) {
   $error = "Please fill in all fields.";
 }
 if ($this->signInService->isAssigned($username)) {
   $error = "Username provided is already in use.";
 }
 if ($this->signInService->isSame($password, $pwagain)) {
   $error = "The passwords do not match.";
 }  
  if ($this->signInService->isValid($username, $password, 
  $pwagain)) {
    header("Location: index");
    return;
  } else {
    $error = "";
  }
 }

 $this->render("user/sign", [
  'error' => $error,
  'categories' => $categories,
 ]);
}

那是我sign.php的开头,当注册无效时回显正确的错误。

<?php if(!empty($error)): ?>
<p class="error">
<?php echo e($error); ?>
</p>
<?php endif; ?>

我真的不知道如何使用if来使它正常工作,目前即使用户名已经使用或密码不匹配,它也会立即将用户放入数据库中。它还不显示任何错误(在声明的控制器中)。

函数(isAssigned等)应该没问题,因为它们以前已经工作过。

如果有人可以帮助我,我将非常感激。

1 个答案:

答案 0 :(得分:2)

看来,无论业务逻辑验证发生什么(电子邮件必须是新的,用户必须输入电子邮件,密码和密码验证都必须设置且不能为空),这并不会促使您对代码做出任何决定,以< em> not 调用实际上在数据库($this->signInService->isValid)中创建新用户的函数,因此,即使其中一个或多个验证失败,插入还是会完成。

上面提到了多个问题:

1.--如果电子邮件在数据库中必须是唯一的,但无论如何插入都成功,则应更改用户表,并将存储电子邮件的字段标记为UNIQUE(我假设是mySQL, postgres或类似名称。..不熟悉其他数据库引擎的工作方式)。即使其他所有内容保持不变,这也将阻止新记录的插入,新记录将与以下内容一起插入,从而产生显示错误:

if ($this->signInService->isValid($username, $password, 
  $pwagain))
{
    header("Location: index");
    return;
} 

else 
{
    $error = "Insertion aborted. Email was duplicated";
}

现在,以上内容只是重复电子邮件案例的附加保护层。您不应该只依赖于此:

2。-仅在所有验证均通过后才尝试插入。否则,直接跳到错误输出中

$abort = false;
$error = '';
if ($this->signInService->isEmpty($username, $password, 
 $pwagain)) 
 {
   $error .= "Please fill in all fields.";
   $abort = true;
 }

 if ($this->signInService->isAssigned($username)) 
 {
   $error .= "Username provided is already in use.";
   $abort = true;
 }

 if ($this->signInService->isSame($password, $pwagain)) 
 {
   $error .= "The passwords do not match.";
   $abort = true;
 }

 if ($abort == false)
 {
    if ($this->signInService->isValid($username, $password, 
      $pwagain))
    {
        header("Location: index");
        return;
    } 

    else 
    {
        $error = "Insertion aborted. Email was duplicated";
    }
 }

    $this->render("user/sign", [
     'error' => $error,
     'categories' => $categories,
    ]);

以上内容是: 一种。首先假定所有检查都将通过,因此默认设置为“不中止”并设置一个空错误消息(这可防止第一个串联出现PHP警告。如果将字符串串联到先前不存在的变量中,PHP将发出警告。 b。运行所有检查。如果这些检查中的任何一个失败,请通过设置$abort = true;来标记异常中止,并将特定消息连接到错误变量(因此,如果多个检查失败,则可以将所有检查通知给用户

c。检查中止标志是否设置为true,然后确定是尝试插入还是仅输出错误。这很重要,因为成功的插入操作会向用户发送重定向标头,该标头会停止执行该标头下的所有内容(这就是为什么您永远都看不到错误消息显示的原因)

d。最后,如果通过验证但插入失败,则退出最终的if后,您会将用户重定向到错误输出(请注意,我没有使用else子句来精确地允许该用户输入未标记为中止的输入可以重新加入本应带有中止标志的流