【问题标题】:Checking if the password is meeting the length condition检查密码是否满足长度条件
【发布时间】:2016-02-16 17:16:21
【问题描述】:

所以在我将这个新的if 语句添加到我的代码中检查字符串长度之前,它工作得非常好。我现在尝试添加一个额外的if 语句,以查看表单上的密码长度是否满足 6 到 32 个字符长的条件,但由于某种原因,我仍然收到错误消息(500 服务器错误)。

我试图一遍又一遍地阅读代码,但似乎无法发现是什么导致了我这个错误。我不确定是否是我放置此语句的位置可能导致此问题或比此更小和更简单的问题。

希望能对此提出一些建议。提前谢谢你。

<?php

ini_set('display_errors', 'On');
ini_set('html_errors', 0);
error_reporting(-1);

require 'connection.php';

$message = '';

$username = $_POST['username'];
$password = $_POST['password'];
$confirmpassword = $_POST['confirmpassword'];

if (!empty($_POST['username']) && !empty($_POST['password'])):
  //var_dump($password, $confirmpassword);
  if(strlen($password) < 6 || strlen($password) > 32):

    if($password == $confirmpassword):


    $sql = "INSERT INTO users (FirstName, LastName, Role, Email, Username, Password) VALUES (:firstname, :lastname, :role, :email, :username, :password)";
    $stmt = $conn->prepare($sql);
    $hashPassword = password_hash($password, PASSWORD_DEFAULT);

    $stmt->bindParam(':firstname', $_POST['firstname']);
    $stmt->bindParam(':lastname', $_POST['lastname']);
    $stmt->bindParam(':role', $_POST['role']);
    $stmt->bindParam(':email', $_POST['email']);
    $stmt->bindParam(':username', $_POST['username']);
    $stmt->bindParam(':password', $hashPassword);

    if ($stmt->execute()):
      echo 'Well done! You have successfully registered with us!';
      header('Location:loginPage.php');
    else:
      echo 'There seems to be an issue getting you registered.';
      //$message = 'There seems to be an issue getting you registered.';
    endif;
  else:
    echo 'Your password must be between 6 to 32 characters.';
  else:
    echo 'Your passwords do not match, please enter them correctly.';
    header('Location:registerPage.php');
  endif;
endif;
endif;

【问题讨论】:

标签: php passwords string-length


【解决方案1】:

快速浏览可能的错误原因:

  • 第 28 行有一个 else 语句,然后是第 30 行的另一个 else。
  • 第 32 行在回显后调用了 header(Location:),这将不起作用,因为 header() 在其之前无法输出/打印任何内容。

此外,通常内部错误 (500) 是由 Apache 的错误配置而不是代码错误引起的。您是否尝试过删除多余的 if() 语句并查看您的代码是否有效?

使用代码编辑:

ini_set('display_errors', 'On');
ini_set('html_errors', 0);
error_reporting(-1);

require 'connection.php';

$message = '';

$username = $_POST['username'];
$password = $_POST['password'];
$confirmpassword = $_POST['confirmpassword'];

if (!empty($_POST['username']) && !empty($_POST['password'])):
  //var_dump($password, $confirmpassword);
  if(strlen($password) < 6 || strlen($password) > 32):

    if($password == $confirmpassword):
      $sql = "INSERT INTO users (FirstName, LastName, Role, Email, Username, Password) VALUES (:firstname, :lastname, :role, :email, :username, :password)";
      $stmt = $conn->prepare($sql);
      $hashPassword = password_hash($password, PASSWORD_DEFAULT);

      $stmt->bindParam(':firstname', $_POST['firstname']);
      $stmt->bindParam(':lastname', $_POST['lastname']);
      $stmt->bindParam(':role', $_POST['role']);
      $stmt->bindParam(':email', $_POST['email']);
      $stmt->bindParam(':username', $_POST['username']);
      $stmt->bindParam(':password', $hashPassword);

      if ($stmt->execute()):
        echo 'Well done! You have successfully registered with us!';
        header('Location:loginPage.php');
      else:
        echo 'There seems to be an issue getting you registered.';
        //$message = 'There seems to be an issue getting you registered.';
      endif;
    else:
      echo 'Your password must be between 6 to 32 characters.';
    endif;

  // ========= You need to add `endif` (above) before starting another `else`
  else:
    echo 'Your passwords do not match, please enter them correctly.';
  endif;

  header('Location:registerPage.php');
endif;

编辑 2,相同的代码,但有额外的可视块行(警告:会产生语法错误):

ini_set('display_errors', 'On');
ini_set('html_errors', 0);
error_reporting(-1);

require 'connection.php';

$message = '';

$username = $_POST['username'];
$password = $_POST['password'];
$confirmpassword = $_POST['confirmpassword'];

if (!empty($_POST['username']) && !empty($_POST['password'])):
  //var_dump($password, $confirmpassword);
  if(strlen($password) < 6 || strlen($password) > 32):
  | 
  |  if($password == $confirmpassword):
  |  |  $sql = "INSERT INTO users (FirstName, LastName, Role, Email, Username, Password) VALUES (:firstname, :lastname, :role, :email, :username, :password)";
  |  |  $stmt = $conn->prepare($sql);
  |  |  $hashPassword = password_hash($password, PASSWORD_DEFAULT);

  |  |  $stmt->bindParam(':firstname', $_POST['firstname']);
  |  |  $stmt->bindParam(':lastname', $_POST['lastname']);
  |  |  $stmt->bindParam(':role', $_POST['role']);
  |  |  $stmt->bindParam(':email', $_POST['email']);
  |  |  $stmt->bindParam(':username', $_POST['username']);
  |  |  $stmt->bindParam(':password', $hashPassword);

  |  |  if ($stmt->execute()):
  |  |    echo 'Well done! You have successfully registered with us!';
  |  |    header('Location:loginPage.php');
  |  |  else:
  |  |    echo 'There seems to be an issue getting you registered.';
  |  |    //$message = 'There seems to be an issue getting you registered.';
  |  |  endif;
  |  else:
  |    echo 'Your password must be between 6 to 32 characters.';
  |  endif;
  |
  // ========= You need to add `endif` (above) before starting another `else`
  else:
    echo 'Your passwords do not match, please enter them correctly.';
  endif;

  header('Location:registerPage.php');
endif;

【讨论】:

  • 没有关于字符串长度的额外if() 语句,它工作得很好。即使header(Location:) 放置在它正常工作的地方,我对它的位置没有任何问题,但只是额外的 if 语句,在检查错误日志后它说我的else 语句有问题第 42 行。
  • 您有一个else,后跟另一个else,然后是endif。为了清楚起见,我已更正您的代码以包含缩进,并将额外的 endif 从第 46 行移至第 40 行(请参阅我的答案的编辑)。请试一试。
  • 您好,非常感谢您的帮助。我已经尝试了您的代码并且它已经成功运行。我唯一的问题是它似乎完全忽略了我的if 语句,并且仍然允许将数据添加到数据库中,无论密码字符是小于 6 还是大于 32。
  • 我已经添加了一行来告诉你逻辑块的去向。当您浏览您的代码时,您将检查:如果长度不在 6 到 32 之间,则您的错误是“您的密码不匹配”,而如果 password != confirmpassword,您的错误是“您的密码必须在 6 之间到 32 个字符”。另外,我已经修改了代码以返回 registerPage.php,因为我认为无论遇到哪个错误,您都需要它。
  • 刚刚注意到您在哪里交换了错误消息的评论。无论如何,您的长度检查无法正常工作,因为您的长度不能同时小于 6 和超过 32 个字符。您需要检查密码是否长于 6 且短于 32:if (strlen($password) &gt; 6 &amp;&amp; strlen($password) &lt; 32)):
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 2020-12-16
  • 2023-03-21
  • 2021-04-25
  • 1970-01-01
  • 2017-02-09
相关资源
最近更新 更多