【问题标题】:Validating the form and password-hash in php在 php 中验证表单和密码哈希
【发布时间】:2015-01-31 23:29:42
【问题描述】:

我的验证和密码哈希注册有问题。

问题是我创建了一个验证并且它可以工作,然后我创建了密码哈希部分并且它也可以工作......但是现在验证不起作用。

它似乎跳过了验证并将信息保存在数据库中并对密码进行哈希处理。 如何验证和散列密码并将信息保存在数据库中?

我不知道如何解释更多,但如果您不明白或需要更多信息,请告诉我。

用户在表单中插入信息,然后进入验证并通过验证,如果验证中没有错误,则进入 try/catch 并将信息插入数据库并“散列”密码。

这两个部分(验证和使用哈希密码插入数据库)完全分开工作,但是当我将这两个部分放在一起时,验证不起作用,它会跳过它。

html 格式

<form action="index.php" method="post">
                                <table>
                                    <tr><td>
                                        <label for="fullname">Fullname<span class="req">*</span></label>
                                        </td>
                                    <td><input type="text" name="fullname" value="<? echo $fullname ?>"><span class="error"><?php echo $fullnameErr; ?></span>
                                        </td></tr>
                                    <tr><td>
                                        <label for="email">Email<span class="req">*</span></label></td>
                                    <td><input type="email" name="email" value="<? echo $email ?>"><span class="error"><?php echo $emailErr; ?></span>
                                        </td></tr>
                                    <tr><td>
                                        <label for="user">Username<span class="req">*</span></label>
                                        </td>
                                    <td><input type="text" name="user" value="<? echo $user ?>"><span class="error"><?php echo $userErr; ?></span>
                                        </td></tr>
                                    <tr><td>
                                        <label for="pass">Password</label><span class="req">*</span</td>
                                        <td><input id="pass" name="pass" type="password" value=""><span class="error"><?php echo $passErr; ?></span>
                                        </td></tr>
                                    <tr><td>
                                        <label for="rePass">Re-Password</label><span class="req">*</span</td>
                                        <td><input id="rePass" name="rePass" type="password" value=""><span class="error"><?php echo $rePassErr; ?></span>
                                        </td></tr>
                                    <tr><td><input type="submit" name="submit" value="Sign Up">
                                        </td></tr>   
                                </table>
                            </form>

这里是 php 验证并使用哈希密码保存到数据库中。

    <?php
    $fullname = $user = $email = $pass = $rePass = "" ;
    $fullnameErr = $userErr = $emailErr = $passErr = $rePassErr = "";
?>

    <?php
    if(isset($_POST["submit"])){

        $fullname = trim($_POST["fullname"]);
            $email  = trim($_POST["email"]);
            $user   = trim($_POST["user"]);
            $pass   = trim($_POST["pass"]);
            $rePass = trim($_POST["rePass"]);

            if (!preg_match("/^[A-Za-z ]*$/", $fullname)) {
                $fullnameErr = "Only letters are allowed"; 
            }
            if (!preg_match("/^[A-Za-z0-9]*$/",$user)) {
                $userErr = "Only letters and numbers are allowed"; 
            }
            if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $emailErr = "Invalid email format"; 
            }
            if (!strlen($pass) > 8) {
                $passErr = "Password at least 8 characters";
            }

            if (empty($_POST["fullname"])) {
                $fullnameErr = "Fullname is required";
            }
            if (empty($_POST["email"])) {
                $emailErr = "Email is required";
            } 
            if (empty($_POST["user"])) {
                $userErr = "Username is required";
            }
            if (empty($_POST["pass"])) {
                $passErr = "Password is required";
            }
            if (empty($_POST["rePass"])) {
                $rePassErr = "re-enter password is required";
            }
            if ($_POST["rePass"] != $_POST["pass"]) {
                $rePassErr = "The re-entered password don't match";
            }

        try{            
            require_once("db_connect.php"); 

            $options = [
            'cost' => 12,
            ];

            $hashedPass = password_hash($pass, PASSWORD_BCRYPT, $options);

            $query  = "INSERT INTO users (fullname, email, user, pass) ";
            $query .= "VALUES (:fullname, :email, :user, :pass)";
            $ps = $db->prepare($query);

            $result = $ps->execute(
                array(
                    'fullname' => $fullname,
                    'email' => $email,
                    'user'  => $user,
                    'pass'  => $hashedPass
                ));

            if($result){
                header("Location: index.php?signup=true");
            }else { 
                echo "Signup failed";                           
            }

        }catch(Exception $exception) {
            echo "Query failed, see below: <br><br>";
            echo $exception."<br /><br />";
        }
    }
?>

感谢您的帮助!

【问题讨论】:

  • 好吧,你的代码收集了错误,但它对这些错误没有任何作用。它只存储值,无论是否有任何错误。
  • @martinstoeckli ,是的,这就是问题所在,但我找到了一个解决方案,通过添加“ if(empty($fullnameErr) && empty($emailErr) && empty($userErr) && empty($ passErr) && empty($rePassErr)) {" 在 try/catch 之前并在之后关闭它。

标签: php validation hash


【解决方案1】:

如果您的某个验证失败,您将需要一些方法来停止脚本的执行。

例如

if (empty($_POST["user"])) {
    $userErr = "Username is required";
    return $userErr;
}

否则它将继续运行,并且无论验证是否失败,都会发生散列和数据库插入。

【讨论】:

  • 是的,我有它,在 html 表单中,在“span 类错误”之后。
  • 调用“echo”不会停止脚本的执行。
【解决方案2】:

我找到了答案,呵呵..但我会发布它,以便您查看是否有人有同样的问题..

 if(empty($fullnameErr) && empty($emailErr) && empty($userErr) && empty($passErr) &&  empty($rePassErr)) { THE CODE OF TRY/CATCH }

<?php
    if(isset($_POST["submit"])){

        $fullname = trim($_POST["fullname"]);
            $email  = trim($_POST["email"]);
            $user   = trim($_POST["user"]);
            $pass   = trim($_POST["pass"]);
            $rePass = trim($_POST["rePass"]);

            if (!preg_match("/^[A-Za-z ]*$/", $fullname)) {
                $fullnameErr = "Only letters are allowed"; 
            }
            if (!preg_match("/^[A-Za-z0-9]*$/",$user)) {
                $userErr = "Only letters and numbers are allowed"; 
            }
            if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $emailErr = "Invalid email format"; 
            }
            if (!strlen($pass) > 8) {
                $passErr = "Password at least 8 characters";
            }

            if (empty($_POST["fullname"])) {
                $fullnameErr = "Fullname is required";
            }
            if (empty($_POST["email"])) {
                $emailErr = "Email is required";
            } 
            if (empty($_POST["user"])) {
                $userErr = "Username is required";
            }
            if (empty($_POST["pass"])) {
                $passErr = "Password is required";
            }
            if (empty($_POST["rePass"])) {
                $rePassErr = "re-enter password is required";
            }
            if ($_POST["rePass"] != $_POST["pass"]) {
                $rePassErr = "The re-entered password don't match";
            }

        if(empty($fullnameErr) && empty($emailErr) && empty($userErr) && empty($passErr) &&  empty($rePassErr)) {

        try{            
            require_once("db_connect.php"); 

            $options = [
            'cost' => 12,
            ];

            $hashedPass = password_hash($pass, PASSWORD_BCRYPT, $options);

            $query  = "INSERT INTO users (fullname, email, user, pass) ";
            $query .= "VALUES (:fullname, :email, :user, :pass)";
            $ps = $db->prepare($query);

            $result = $ps->execute(
                array(
                    'fullname' => $fullname,
                    'email' => $email,
                    'user'  => $user,
                    'pass'  => $hashedPass
                ));

            if($result){
                header("Location: index.php?signup=true");
            }else { 
                echo "Signup failed";                           
            }

        }catch(Exception $exception) {
            echo "Query failed, see below: <br><br>";
            echo $exception."<br /><br />";
        }
      }
    }
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多