如何修复AJAX错误:parsererror:SyntaxError:JSON输入意外结束 [英] how to fix AJAX error: parsererror : SyntaxError: Unexpected end of JSON input

查看:88
本文介绍了如何修复AJAX错误:parsererror:SyntaxError:JSON输入意外结束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

向多个收件人发送邮件时,我需要在PHPMailer中使用JSON和AJAX.但是,无论尝试什么,都行不通,只是在控制台中,我收到消息"AJAX错误:parseerror,语法错误:JSON输入意外结束".我知道这意味着我的JSON不是有效的JSON,但是如果我仅对一个收件人使用某些代码,则效果很好,所以我认为问题在于在foreach循环中使用JSON从数据库中获取电子邮件收件人时.也许,如果没有JSON,此代码会很好地工作,在每个页面上都可以正确发送电子邮件,因此我不知道此错误在哪里?!在php文件或js文件中?这是我的使用JSON的PHP代码的一部分:

I need to use JSON and AJAX with PHPMailer when send mail to multiple recipients. However, whatever try, doesn't work, just in console I get message "AJAX error: parseerror, Syntax error: Unexpected end of JSON input". I know this mean that my JSON is not a valid JSON, but if I use the some code for just one recipient this work very well, so I think that the problem is when using JSON inside foreach loop for get email recipients from database. Perhaps, without JSON this code work very well, on each page send email correctly, so I can not figure out where is this error?! In php file or in js file?! This is part of my PHP code which use JSON:

$sql_f="SELECT owners_email.email_address_id, email_address, owner_name, owner_property, owner_sex, owner_type FROM visitneum.owners_email INNER JOIN visitneum.pages ON (pages.email_address_id = owners_email.email_address_id) WHERE `owner_sex`='F' AND `owner_type`='rooms' AND `pages_id` = ?";
    $dbstmt = $pdo->prepare($sql_f);
    $dbstmt->bindParam(1,$pages_id);
    $dbstmt->execute();
    //get emails from db via pdo
    $emails_room_f = $dbstmt->fetchAll(PDO::FETCH_ASSOC);
    if(is_array($emails_room_f) && count($emails_room_f) > 0){
        foreach ($emails_room_f as $email_room_f){
            //var_dump($email_room_f['email_address']);
            $mailOwner->addAddress($email_room_f['email_address']);
            $body_room_f = "<p>Poštovana {$email_room_f['owner_name']}, <br>" . "Upravo ste primili poruku sa sajta <a href='https://www.visit-neum.com'>visit-neum.com</a><br>Detalji Vaše poruke se nalaze ispod:</p><p><strong>Od: </strong>" . ucwords($fname) . "<br><strong>Telefon: </strong>" . $tel . "<br><strong>Datum dolaska: </strong>" . $txtFrom . "<br><strong>Datum odlaska: </strong>" . $txtTo . "<br><strong>E-mail: </strong>" .strtolower($userMail)."<br><strong>Poruka: </strong>" . $userMessage . "<br><br><strong>Napomena: </strong>Molimo Vas da na ovu poruku ne odgovarate. Vaš odgovor pošaljite na: " . strtoupper($userMail) . "</p>";
            $mailOwner->Body = $body_room_f;
            if($mailOwner->send()){
            $mailOwner = "INSERT INTO visitneum.contact_owner (fname, tel, txtFrom, txtTo, userMail, userMessage, email_address_id) VALUES (:fname, :tel, :txtFrom, :txtTo, :userMail, :userMessage, :email_address_id)";
            $stmt = $pdo->prepare($mailOwner);
            $stmt->execute(['fname' => $fname, 'tel' => $tel, 'txtFrom' => $txtFrom, 'txtTo' => $txtTo, 'userMail' => $userMail, 'userMessage' => $userMessage, 'email_address_id' => $email_room_f['email_address_id']]);
            if($error==false){
                $data=array();
                $data['response']='success';
                $data['content']="Hvala Vam ".ucwords($fname)."! Vaša poruka je uspješno poslata vlasniku objekta {$email_room_f["owner_property"]}! Odgovor ćete dobiti ubrzo!";
            }//end if $error==false
            }//end if mail send
            else {
                $data['response']="error";
                $data['content']="Došlo je do greške! Pokušajte ponovo..." . $mailOwner->ErrorInfo;
            }
                //header('Content-Type: application/json');
                //ob_clean();
                header("Content-Type: application/json; charset=utf-8", true);
                echo json_encode(utf8ize($data));
                //ob_flush();
    }//end foreach for email addresses  (woman owners of rooms)
}//end if for array of emails

这是我的AJAX JS文件的一部分.

And this is part of my JS file with AJAX.

 submitHandler: function(form) {
 //Your code for AJAX starts    
         var formData = jQuery("#contactOwner").serialize();
            console.log(formData);
            jQuery.ajax({
              url: '/classes/Form_process.class.php',
              type: 'post',
              //contentType: "application/json",
              //data: JSON.stringify(formData),
              data: formData,
              //async: false,
              dataType: 'json',
              //processData: false,
              cache: false,
              success: function (data) {
                //alert("success");
                //console.log(escape(data));
                /*try {
                  var output = JSON.parse(data);
                  alert(output);
              } catch (e) {
                  alert("Output is not valid JSON: " + data);
              }*/
                jQuery("#responseOwner").text(data.content);
                //console.log(JSON.stringify(data));
                //console.dir("Response: " + text);
                console.log(data);
             },
             error: function(jqXHR, textStatus, errorThrown) {
              //console.log(JSON.stringify(data));
              console.log(JSON.stringify(jqXHR));
              console.log("AJAX error: " + textStatus + ' : ' + errorThrown);
       }
/*
              error: function (data){
                  //alert("error");
                  jQuery("#responseOwner").text("An error occurred");
                  //console.log(JSON.stringify(data));
            //console.dir("Response: " + data);
                  console.log(data);
              }*/
              /*error: function(jqXHR, exception) {
                if (jqXHR.status === 0) {
                  console.log('Not connect.\n Verify Network.');
                } else if (jqXHR.status == 404) {
                  console.log('Requested page not found. [404]');
                } else if (jqXHR.status == 500) {
                  console.log('Internal Server Error [500].');
                } else if (exception === 'parsererror') {
                  console.log('Requested JSON parse failed.');
                } else if (exception === 'timeout') {
                  console.log('Time out error.');
                } else if (exception === 'abort') {
                  console.log('Ajax request aborted.');
                } else {
                  console.log('Uncaught Error.\n' + jqXHR.responseText);
                }
              }*/
          
          
            }); //Code for AJAX Ends
            // Clear all data after submit
            var form = document.getElementById('contactOwner').reset();
            return false;
          } //submitHandler

您如何通过评论看到我尝试了许多不同的解决方案,但是AJAX响应始终存在一些问题,我不知道为什么吗?!这是否意味着不能在foreach循环中使用JSON或什么,我无法理解?谢谢您的帮助.

How you can see by comments I was try so many different solutions, but AJAX response is allways the some and I can not figure out why?! Does it mean that can not use JSON inside foreach loop or what, I can not understand more?! Thank you for any kind of your help.

推荐答案

您确实应该在问题中包含实际的JSON.没有它,我们就会盲目工作,但是我可以猜到问题出在哪里.有多个记录时,您无法正确构建JSON.当您只有一个收件人时,您的JSON可能如下所示:

You really should include the actual JSON in your question; without it we are working blind, but I can guess what the problem is. You are not constructing your JSON properly when there are multiple records. When you have a single recipient, your JSON might look like this:

{"readyState":4,"responseText":"","status":200,"statusText":"OK"}

那很好,并且是完全有效的JSON –将空字符串作为值没有问题.当您有多个记录时,就会出现问题,它将在第一条记录之后立即追加它们:

That is fine, and perfectly valid JSON – and there is no issue having an empty string as a value. The problem arises when you have more than one record, when it will append them immediately after the first:

{"readyState":4,"responseText":"","status":200,"statusText":"OK"}{"readyState":4,"responseText":"","status":200,"statusText":"OK"}

这不是有效的JSON.

This is not valid JSON.

我建议您在循环内累积JSON响应,然后以正确的格式输出它们.像这样:

I suggest you accumulate your JSON responses inside the loop and then output them afterwards, in the correct format. Something like:

$jsonData = [];
foreach ($emails_room_f as $email_room_f){
    //set your content in $data as you are now, then:
    $jsonData[] = $data;
}
header("Content-Type: application/json; charset=utf-8", true);
echo json_encode($jsonData);

这样,您最终将获得如下数据:

This way you will end up with data like this:

[
    {"readyState":4,"responseText":"","status":200,"statusText":"OK"},
    {"readyState":4,"responseText":"","status":200,"statusText":"OK"}
]

有效的JSON.如果没有数据,它也将起作用,因为它将返回一个空数组,这也是有效的JSON.

Which is valid JSON. It will also work if there is no data as it will return an empty array, which is also valid JSON.

与此不同,我非常怀疑您具有 utf8ize 函数-这是您做其他UTF-8错误的标志,但这是另一个问题的主题.

Separately from this, I am extremely suspicious of you having a utf8ize function – that is a sign you're doing other UTF-8 stuff wrong, but that's a subject for another question.

这篇关于如何修复AJAX错误:parsererror:SyntaxError:JSON输入意外结束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆