【问题标题】:javascript - stop refresh if error is returned from phpjavascript - 如果从 php 返回错误,则停止刷新
【发布时间】:2015-04-17 13:04:07
【问题描述】:

我想知道是否可以在我的 javascript 中添加一些内容,如果表单提交正常,则允许刷新,但如果从 PHP 返回错误,则不会刷新页面。

这可能吗?如果是这样,任何人都可以为我提供任何可以帮助我实现这一目标的指导。我已经设法让 javascript 在提交表单并返回消息时刷新。

这是js:

function addCall() {
  var data = $('#addForm').serialize();
  $.post('../Admin/ManageCourses_AddSubmit.php', data, function(response){

    $("#addForm").html(response);
    //'soft'reload parent page, after a delay to show message
    setTimeout(function(){
      $('#addModal').modal('hide')
      location.reload();
    },3500);

  }).fail(function(jqXHR, textStatus) {
    alert( "Request failed: " + textStatus );
  });
}

以及处理表单并对其进行验证的 php:

<?php

session_start();

if (empty($_POST['course_title'])) {
   $message = " Value is required";
} 

else {

    $course_title           = trim($_POST['course_title']);

    # Validate Course #

    if (!ctype_alpha($course_title)) {

        $message = '<p class="error">Course title should be alpha characters only.</p>';
    }

    elseif (strlen($course_title) < 3 OR strlen($course_title) > 50) {
        $message = '<p class="error">Course title should be within 3-50 characters long.</p>';
    }

    else {

        include "../includes/db_conx.php";

        try
        {
            $db_conx = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password);
            $db_conx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            $sql = $db_conx->prepare("INSERT INTO `insights`.`course_details` (`course_title`) VALUES (:course_title)");
            $sql->bindParam(':course_title', $course_title, PDO::PARAM_STR);
            $sql->execute();

            $message = "<p class='text-success'> Record Successfully Added <span class='glyphicon glyphicon-ok'/></p>";
        } 
        catch(Exception $e) {

            if( $e->getCode() == 23000)
            {
                $message = 'Course already exists in database';
            }
            else 
            {
                $message = $e->getMessage();
            }
        }
    }
}
die($message);
?>

能够对表单进行修改而不是重新全部重写对用户来说非常有用。

形式:

                <div class="modal fade" id="addModal" tabindex="-1" role="dialog" aria-labelledby="addModalLabel" aria-hidden="true">
                    <div class="modal-dialog">
                        <div class="modal-content">
                            <div class="modal-header">
                                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                                <h4 class="modal-title">Add New Record: </h4>
                            </div>
                            <div class="modal-body">
                                <form id="addForm" class="addForm">
                                    <div class="form-group">

                                        <label class="control-label" for="forename">Forename:</label>
                                        <div class="controls">
                                            <input id="forename" name="forename" type="text" placeholder="Enter forename(s)" class="form-control" maxlength="100" required="">

                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <label class="control-label" for="surname">Surname:</label>
                                        <div class="controls">
                                            <input id="surname" name="surname" type="text" placeholder="Enter surname" class="form-control" maxlength="100" required="">

                                        </div>
                                    </div>

                                    <!-- Text input-->
                                    <div class="form-group">
                                        <label class="control-label" for="email">Email:</label>
                                        <div class="controls">
                                            <input id="email" name="email" type="email" placeholder="Enter a valid email" class="form-control" maxlength="255" value="" required="">

                                        </div>
                                    </div>


                                    <div class="form-group">

                                        <label class="control-label" for="username">Username:</label>
                                        <div class="controls">
                                            <input id="username" name="username" type="text" placeholder="username" class="form-control" value="" maxlength="50" required="">

                                        </div>

                                    </div>
                                    <div class="form-group">

                                        <label class="control-label" for="password">Password:</label>
                                        <div class="controls">
                                            <input id="password" name="password" type="password" placeholder="password" class="form-control" maxlength="40" required="">

                                        </div>

                                    </div>

                                    <div class="form-group">

                                        <label class="control-label" for="confirm_password">Confirm Password:</label>
                                        <div class="controls">
                                            <input id="confirm_password" name="confirm_password" type="password" placeholder="retype password" class="form-control" maxlength="40" required="">

                                        </div>

                                    </div>

                                    <?php

                                    include "../includes/db_conx.php";

                                    try {

                                        $db_conx = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password);

                                        $db_conx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                                        $stmt2 = $db_conx->prepare('SELECT * FROM role_type');
                                        $stmt2->execute();
                                        $roles = $stmt2->fetchAll(PDO::FETCH_ASSOC);
                                    }

                                    catch(Exception $e)
                                    {
                                        die ("Could not connect to the database $mysql_dbname :" . $e->getMessage());
                                    }
                                    ?>

                                    <div class="control-group">
                                        <label class="control-label" for="role_type">Select User Type:</label><p></p>
                                        <select name="role">
                                            <option value=''>Select One</option>";
                                            <?php foreach($roles as $role): ?>
                                            <option value="<?php echo $role['role_type_code'] ?>"><?php echo $role['role_title'] ?></option>
                                        <?php endforeach ?>
                                    </select>
                                </div>
                                <p></p>

                                <?php

                                    include "../includes/db_conx.php";

                                    try {

                                        $db_conx = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password);

                                        $db_conx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                                        $stmt3 = $db_conx->prepare('SELECT * FROM course_details ORDER BY course_title');
                                        $stmt3->execute();
                                        $courses = $stmt3->fetchAll(PDO::FETCH_ASSOC);
                                    }

                                    catch(Exception $e)
                                    {
                                        die ("Could not connect to the database $mysql_dbname :" . $e->getMessage());
                                    }
                                    ?>

                                    <div class="control-group">
                                        <label class="control-label" for="course_details">Select Course:</label><p></p>
                                        <select name="course">
                                            <option value=''>Select One</option>";
                                            <?php foreach($courses as $course): ?>
                                            <option value="<?php echo $course['course_code'] ?>"><?php echo $course['course_title'] ?></option>
                                        <?php endforeach ?>
                                    </select>
                                </div>
                                <input type="hidden" name="form_token" value="<?php echo $form_token; ?>" />
                            </form>
                            </div>
                            <div class="modal-footer">
                                <div class="btn-toolbar">
                                    <button type="button" class="btn btn-default" class="pull-right" data-dismiss="modal">Close</button>

                                    <button type="button" class="btn btn-success" class="pull-right" onclick="addUCall();">Submit <span class="glyphicon glyphicon-saved"></button>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

提前谢谢你。

【问题讨论】:

  • 嗯.. 自从我上次使用 PHP 以来已经有很长时间了。但是,我认为您可以从 PHP 返回提交的数据,并在您的 js 回调中检查它是否返回成功。对吧?

标签: javascript php jquery forms


【解决方案1】:

您的消息变量包含错误和成功消息。每次收到响应时都会重新加载页面。
在 $("#addForm").html(response); 之后添加这个-

var n = response.search("class=\'text-success\'");
if(n!=-1){
      //reload success
}
else{
     //stay on page, errors
}

【讨论】:

  • 谢谢,我试试看!
  • 这很好用但是我刚刚意识到表单显示的模式仍然会在单击提交时删除所有表单字段。我已将模态表单附加到原始问题。你知道我怎样才能将回复放入表单而不是删除表单输入
  • 写这个$("#addForm").prepend(response);而不是$("#addForm").html(response);
  • 您还应该在点击表单后禁用提交按钮,因为您将在 3.5 秒后重新加载页面,如果用户在此时间再次点击提交按钮,那么您将获得重复的条目。 $(".btn-success").attr('disabled','disabled');
  • $(".error").remove(); $(".text-success").remove(); 在函数顶部添加这些。这将删除以前的消息并添加新消息
【解决方案2】:

当您在响应中返回错误消息时,请检查错误类并在必要时重新加载。

    $.post('../Admin/ManageCourses_AddSubmit.php', data, function(response){

        if(response.contains("text-success")) {
           // put your logic here for success
        } else {
          // logic for errors
        }
   });

【讨论】:

  • 谢谢,我也试试看!
猜你喜欢
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 2010-12-29
相关资源
最近更新 更多