【问题标题】:Preventing bootstrap modal from disappearing in case validation failure using PHP after submit button is clicked在单击提交按钮后使用 PHP 验证失败时防止引导模式消失
【发布时间】:2018-03-21 14:15:23
【问题描述】:

我的问题是,当用户单击注册按钮时,如何在两种情况下阻止模式关闭:

  • 如果输入无效?并显示 PHP 错误信息
  • 输入有效并在关闭模式前显示 PHP 成功消息几秒钟?

对于第一种情况,如果我重新打开模式,我可以看到 PHP 显示的验证错误消息。

I have checked this similar question 但还没有弄清楚如何在我的情况下做到这一点,所以任何帮助将不胜感激。我想完全了解发生了什么以及我在做什么。

到目前为止,在阅读了这里和那里之后,我注意到这可能可以通过以下方式实现:

  • JQuery / JavaScript 做表单验证而不使用 PHP
  • 有人建议使用 iframe

有没有办法使用下面的 PHP 代码并显示来自该代码的错误/成功消息?还是必须通过 JQuery/JS 来完成?

我的带有 HTML 代码的 PHP

<?php 
ob_start();
include('header.php');
include_once("db files/db_connect.php");

if(isset($_SESSION['user_id'])) {
    header("Location: index.php");
}
$error = false;
if (isset($_POST['signup'])) {
    $name = mysqli_real_escape_string($conn, $_POST['name']);
    $email = mysqli_real_escape_string($conn, $_POST['email']);
    $password = mysqli_real_escape_string($conn, $_POST['password']);
    $cpassword = mysqli_real_escape_string($conn, $_POST['cpassword']); 
    if (!preg_match("/^[a-zA-Z ]+$/",$name)) {
        $error = true;
        $uname_error = "Name must contain only alphabets and space";
    }
    if(!filter_var($email,FILTER_VALIDATE_EMAIL)) {
        $error = true;
        $email_error = "Please Enter Valid Email ID";
    }
    if(strlen($password) < 6) {
        $error = true;
        $password_error = "Password must be minimum of 6 characters";
    }
    if($password != $cpassword) {
        $error = true;
        $cpassword_error = "Password and Confirm Password doesn't match";
    }

    if (!$error) {
        if(mysqli_query($conn, "INSERT INTO users(user, email, pass) VALUES('" . $name . "', '" . $email . "', '" . md5($password) . "')")) {
            $success_message = "Successfully Registered!";
        } else {
            $error_message = "Error in registering...Please try again later!";
        }
    }

}
?>



<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="registrationFormLabel" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered" role="document">
    <div class="modal-content" >
      <div class="modal-header">
        <h5 class="modal-title" id="registrationFormLabel">Register</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
        <div class="modal-body">


<!-- REGISTRATION FORM -->
<div class="container">
<div class="form-row">
<div class="col">
    <form onsubmit="return validateForm()" role="form" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="signupform">
        <fieldset>
            <legend>Sign Up</legend>
            <div class="form-group">
                <label for="name">Name</label>
                <input type="text" name="name" placeholder="Enter Full Name" required value="<?php if($error) echo $name; ?>" class="form-control" />
                <span class="text-danger"><?php if (isset($uname_error)) echo $uname_error; ?></span>
            </div>                  
            <div class="form-group">
                <label for="name">Email</label>
                <input type="text" name="email" placeholder="Email" required value="<?php if($error) echo $email; ?>" class="form-control" />
                <span class="text-danger"><?php if (isset($email_error)) echo $email_error; ?></span>
            </div>
            <div class="form-group">
                <label for="name">Password</label>
                <input type="password" name="password" placeholder="Password" required class="form-control" />
                <span class="text-danger"><?php if (isset($password_error)) echo $password_error; ?></span>
            </div>
            <div class="form-group">
                <label for="name">Confirm Password</label>
                <input type="password" name="cpassword" placeholder="Confirm Password" required class="form-control" />
                <span class="text-danger"><?php if (isset($cpassword_error)) echo $cpassword_error; ?></span>
            </div>
            <div class="form-group text-center">
                <input id="modalSubmit" type="submit" name="signup" value="Sign Up" class="btn btn-primary" formnovalidate />
            </div>
        </fieldset>
    </form>
    <span class="text-success"><?php if (isset($success_message)) { echo $success_message; } ?></span>
    <span class="text-danger"><?php if (isset($error_message)) { echo $error_message; } ?></span>
</div><!-- / col -->
</div><!-- / form-row -->

<!-- already registered row -->
<div class="row">
<div class="col text-center">   
    Already Registered? <a href="login.php">Login Here</a>
</div>
</div>  <!-- / already registered row -->
</div><!-- / REGISTRATION FORM container-->

        </div><!-- / Modal body div -->
      </div>
  </div>
</div><!-- / Modal -->

当用户单击索引页面上的按钮时,我的模式打开,这是 JQuery 代码

$(document).ready(function(){
    $("#myBtn").click(function(){
        $("#myModal").modal();
    });
}); 

【问题讨论】:

  • 尝试将required更改为required="yes"
  • 它仍然消失了。可能需要更改为客户端验证
  • 问题在于结构,当您插入提交表单时,如果您保持默认行为,模式将始终关闭,因此在输入类型按钮中更改输入类型提交您也可以保持类型提交但必须进行 ajax 调用,因此 $.post(url) 或 event.preventDefault 以避免模式将关闭。
  • 你的function validateForm() { ... } 代码在哪里?

标签: javascript php jquery html bootstrap-4


【解决方案1】:

script 标签之前的文档结尾 (/html) 之后添加 PHP 脚本

<?php 
if ($error) {
    echo '<script>$("#myModal").modal("show");</script>';
} else {
    echo '<script>$("#myModal").modal("hide");</script>';
}
?>

【讨论】:

  • 谢谢!很好很简单。这就是我需要的。独处PC并没有帮助。社区中的权力
【解决方案2】:

无效: 如果输入无效,您可以停止提交按钮提交。

要停止提交,请使用代码

$(':input[type="submit"]').prop('disabled', true);

显示模态

$("#myModal").modal('show');

再次启用提交,当modal因错误关闭时,使用代码 (您需要再次启用它,以便用户重试)

$("#myModal").on('hidden.bs.modal', function (e) {
        $(':input[type="submit"]').prop('disabled', false);
    });

为了验证我会这样做(添加一个成功变量):

if (!$error) {
    if(mysqli_query($conn, "INSERT INTO users(user, email, pass) VALUES('" . $name . "', '" . $email . "', '" . md5($password) . "')")) {
        $success = 1;
    } else {
        $success = 2;
    }

然后这样称呼它:

<?php if($success == 1){ ?>
<script>
    $(document).ready(function() {
        $("#yoursuccessmodal").modal('show');
    });
</script> <?php } ?>

然后您可以选择为其添加淡入淡出,或让用户单击它离开。 模态将在提交后显示。

这个更好的工作,因为我在我的项目中也以这种方式使用它,它对我来说就像一个魅力。

【讨论】:

  • 谢谢。我还没有运行您的代码,但感谢您的回复。来自@user6016913 的简单 if 语句完成了这项工作。
  • 好的,我已经尝试过你的方法,但我遇到了一些麻烦 :( 有机会你能帮忙吗?我会稍后提交我的代码,因为这对我来说是一个漫长的夜晚提前谢谢
  • 所以要再次启用提交按钮,我可以使用 php 验证代码并检查成功变量吗?您还可以向我解释一下语法...我还是新手:( hidden.bs.modal 是做什么的?我已经设法让模态在单击按钮时购物并禁用提交按钮,但是当用户填写所有字段时,我正在努力启用按钮。我会在睡眠后尝试更多:)
猜你喜欢
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 2017-01-05
相关资源
最近更新 更多