php – Ajax表单有时只提交

在SO上有几个这样的问题,但没有一个答案对我有用.我试过了所有这些.

我试图最小化我粘贴的代码,但这个脚本很难

我有一个评论表单,通过ajax提交到php脚本,保存评论,然后获取所有评论并重新显示它们,以便可以显示新评论而无需刷新页面.

有时,评论会成功提交到数据库并正确重新显示.通常几乎所有其他提交评论都会被保存.每隔一段时间似乎都没有发生.

我真正的问题是每次提交时都没有保存评论.

这是javascript和ajax调用:

$(document).ready(function(){
    var working = false;

    $('#commentForm').submit(function(e){

        if(working) return false;

        working = true;
        $('#submitComment').val('Working..');
        $('span.error').remove();

        $.post('/ajax/comment.process.php',$(this).serialize(),function(msg){

            working = false;
            $('#submitComment').val('Submit');

            if(msg.status){

                $('#commentArea').slideDown().$(msg.html).prepend('#commentArea');
            $('#blogComment').val('');
            }
            else {

                $.each(msg.errors,function(k,v){
                    $('label[for='+k+']').append('<span class="error">'+v+'</span>');
                });
            }
        },'json');
    });
});

这是提交评论的功能:

public function addComment($user_id) {

    $validate = new data_validation;

    $_POST = $validate->sanitize($_POST);

    $newCom = $_POST['blogComment'];
    $blog_id = intval($_POST['blogID']);
    $photoSubmit = $_POST['comPhoto'];

    $newComQuery = $this->mysqli->query("INSERT INTO b_comments (blog_id, user_id, date, content, photo) VALUES ('".$blog_id."', '".$user_id."', Now(), '".$newCom."', '".$photoSubmit."')");

    if($newComQuery === false) {
        echo "Query failed";
    }else{

        $returnCom = $this->comMarkup($blog_id);
        echo $returnCom;

    }           
}

这是comMarkup()函数的一部分,它回应了注释(它只是重要的部分):

//  This method outputs the XHTML markup of the comment
public function comMarkup($blog_id) {

    $sql = $this->mysqli->query("SELECT * FROM b_comments WHERE blog_id = '".$blog_id."' ORDER BY date DESC");

    while($d = $sql->fetch_assoc()) {

        $d = $validate->sanitize($d);

        echo "

            <div class='comment-block'>
                <span class='com-img'><img src='".$photo_path."' /></span>
                <h3 style='display: inline;'><a href='".$profile."'>".$userName."</a></h3>
                <div class='com-date'>".$d['date']."</div>
                <p>".$comContent."</p>
            </div>
        ";
    }
}

编辑:这是请求的comment.process.php代码:

    session_start();

include_once('../classes/comment.class.php');
include_once('../classes/db.class.php');
include_once('../classes/user.class.php');

$user_id = $_SESSION['user_id'];

$db = new DBConnection;
$comments = new Comment($db);
$user = new User($db);

$blogID = intval($_POST['blogID']);

$addCom = $comments->addComment($user_id);

echo json_encode(array('status'=>1,'html'=>$addCom));

最佳答案 根据您的描述,我的猜测是它与您的工作变量有关,以及它在$.post()结尾处未设置为false的事实.

但是,您制定流程的方式存在一些逻辑,效率和可管理性问题.我建议看一下official jQuery docs for $.post(),特别是.done(),. fail()和.always()链式方法.

我还建议将PHP变量命名为$_POST以外的其他东西,这样就不会与PHP超级全局混淆.

最后,我建议将您的评论视为对象并使用PDO(这是PDO的链接:查询作为一种“沉浸式”方法,但一定要阅读所有文档).它将为您节省大量数据库交互的麻烦.

点赞