Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Ajax表单只是偶尔提交_Php_Javascript_Jquery_Mysql_Ajax - Fatal编程技术网

Php Ajax表单只是偶尔提交

Php Ajax表单只是偶尔提交,php,javascript,jquery,mysql,ajax,Php,Javascript,Jquery,Mysql,Ajax,有几个问题像这样,但没有一个答案对我有用。我都试过了 我试图最小化我粘贴的代码,但是这个脚本有点难 我有一个评论表单,它通过ajax提交给一个php脚本,该脚本保存评论,然后获取所有评论并重新显示它们,这样就可以在不刷新页面的情况下显示新评论 只有在某些时候,注释才能成功地提交到数据库并正确地重新显示通常几乎每隔一次提交评论将被保存。每隔一段时间,似乎什么都没有发生 我真正的问题是没有在每次提交评论时保存评论 下面是javascript和ajax调用: $(document).ready(fun

有几个问题像这样,但没有一个答案对我有用。我都试过了

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

我有一个评论表单,它通过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');
    });
});
下面是响应注释的
comMarkup()
函数的一部分(这只是重要的部分):


您正在使用json_encode()?如果不是所有的回显都将作为“文本”接收,而不是作为jquery中正在访问的json对象接收,那么根据您的描述,我猜这与您的
工作
变量有关,并且在
$.post()
末尾没有将其设置为
false

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

我还建议将PHP变量命名为
$\u POST
以外的名称,这样就不会与PHP超级全局变量混淆


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

我想您应该使用
encodeURIComponent($('#blogcoment').val())
somwhere将blogcoment值传递到PHP文件进行插入

编辑1:

如果
rawurlencode()
不起作用。使用以下功能:

function encodeURIComponentNew($str) {

    $revert = array('%21'=>'!', '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')');
    return strtr(rawurlencode($str), $revert);
}
(功能来自)

然后

public function addComment($user_id) {

    $validate = new data_validation;

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

    $newCom = encodeURIComponentNew($_POST['blogComment']);

我怀疑这是否相关,但我过去在函数中使用“echo”处理ajax内容,然后再次尝试回显返回值时遇到过问题

尝试将所有函数中的回声更改为“return”,如下所示:

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) {
        return "Query failed";
    }else{
        $returnCom = $this->comMarkup($blog_id);
        return $returnCom;
    }           
}

如果用户发送带有
的注释,则可能会发生错误。发送注释时,字符串将打断mmysqli_查询。也许它能帮助你

公共函数addComment($user\u id){


}

它可能会导致浏览器不可用。因此,在您的URL中,只需添加用于唯一URL模式的附加查询字符串

示例:

   $.post('/ajax/comment.process.php?random=randamnumber');

看起来您的比赛状态是由
工作
标志引起的。由于您只是使用该标志来显示“working…”消息,并在处理请求时阻止提交,因此我只需使用普通的
$.ajax
调用,并将“working”逻辑放在
beforeSend
选项中。下面是一个例子:

$(document).ready(function(){
    $('#commentForm').submit(function(e){
        $.ajax({
            type: 'POST'
            url: '/ajax/comment.process.php',
            dataType: 'json',
            beforeSend: function(jqXHR, settings) {
                $('#submitComment').val('Working..');
                $('span.error').remove();
            },
            data: $(this).serialize(),
            complete: function(jqXHR, textStatus) {
                var msg = jqXHR.responseText;
                $('#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>');
                    });
                }
            };
        });
    });
});
$(文档).ready(函数(){
$(#commentForm')。提交(函数(e){
$.ajax({
类型:“POST”
url:“/ajax/comment.process.php”,
数据类型:“json”,
发送前:函数(jqXHR,设置){
$(“#提交建议”).val('Working..);
$('span.error').remove();
},
数据:$(this).serialize(),
完成:函数(jqXHR,textStatus){
var msg=jqXHR.responseText;
$('提交建议').val('提交');
如果(消息状态){
$('#commentArea').slideDown().$(msg.html).prepend('#commentArea');
$('blogcoment').val('');
}
否则{
$.each(消息错误,函数(k,v){
$('label[for='+k+']')。追加('+v+'');
});
}
};
});
});
});

因此,如果我正确理解了问题,那么您提交的是注释,而不是插入到数据库中,也可能没有向您显示数据库错误或打印出您的
查询失败的字符串

您的PHP脚本似乎根本没有被执行

如果是这种情况,我通常会说,像这样的间歇性错误最有可能的罪魁祸首是浏览器缓存。您的浏览器正在查看该URL,认为它已经知道该URL包含哪些内容,并返回该内容,甚至不将您的信息发送到服务器。最简单的方法是在文件调用中添加随机查询字符串,例如:

cachebuster = new Date();
'/ajax/comment.process.php?cachebuster='.cachebuster.getTime();
。。。我说“正常”,因为您正在使用POST,在“正常”情况下,浏览器不会缓存POST请求。但这是可能的,而且战斗也很琐碎,所以试一试吧。如果你使用Chrome浏览器,点击f12,进入“网络”选项卡,然后运行表单,也可以诊断出这种情况。它应该告诉您结果是否是从缓存中检索到的

除此之外,如果您依赖于magic_引号(或者更糟糕的是,您不依赖magic_引号),那么您需要学习处理SQL注入的正确方法。决不能将不受信任的数据从浏览器直接插入数据库。转义它或使用参数化查询。如果您的查询遇到间歇性问题,可能与您的注释内容有关,在某些情况下,如上文所述,很可能是在收缩中包含撇号。通过背靠背提交两个表单进行诊断:
trythis
,然后
try'this
。如果第一个失败了,第二个失败了,你很可能找到了你
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) {
        return "Query failed";
    }else{
        $returnCom = $this->comMarkup($blog_id);
        return $returnCom;
    }           
}
$validate = new data_validation;

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

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

$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;

}           
   $.post('/ajax/comment.process.php?random=randamnumber');
$(document).ready(function(){
    $('#commentForm').submit(function(e){
        $.ajax({
            type: 'POST'
            url: '/ajax/comment.process.php',
            dataType: 'json',
            beforeSend: function(jqXHR, settings) {
                $('#submitComment').val('Working..');
                $('span.error').remove();
            },
            data: $(this).serialize(),
            complete: function(jqXHR, textStatus) {
                var msg = jqXHR.responseText;
                $('#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>');
                    });
                }
            };
        });
    });
});
cachebuster = new Date();
'/ajax/comment.process.php?cachebuster='.cachebuster.getTime();
$.post('/ajax/comment.process.php',$(this).serialize(),function(msg){
    // post stuff, REMOVING the working variable set, cuz it won't be necessary here...
},'json').always(function() { working = false; });