如何修复 json_encode 返回空数组或空对象

问题描述

我需要一些 PHP、JSON、AJAX 和 jQuery 高级用户的帮助。我需要在两个 if 语句之间的 foreach 循环中使用 json_encode,所以我在谷歌上阅读了很多,我找到了 $jsonData=[]; 需要的地方在第一个 if 语句之前声明,但在这种情况下,当提交表单时,如果我添加echo json_encode($jsonData,JSON_FORCE_OBJECT); 的 jsonData 的 var_dump 返回空数组或空对象此外,没有 JS 文件表单被正确提交,所有数据都插入到数据库中好。但是,这是我在提交表单时评论 JS 文件时返回的 JSON:{"0":{"response":"success","content":"Hvala Vam Testing! Va\u0161a poruka je uspje\u0161no poslata vlasniku objekta brod Ivana! Odgovor \u0107ete dobiti ubrzo!"}} 或者如果我只使用 echo json_encode($jsonData) 我得到连续的 JSON [{"response":"success","content":"Hvala Vam John Doe! Va\u0161a poruka je uspje\u0161no poslata vlasniku objekta brod Ivana! Odgovor \u0107ete dobiti ubrzo!"}] 但是在 https://jsonlint.com/ 上twoo JSON 它是有效的 JSON,但我无法弄清楚如何在 jQuery 中处理它以在网页上获取此数据。 Hier 它是带有部分 json_encode 的 PHP 文件

$query_m = "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`='M' AND `owner_type`='other' AND `pages_id` = ?";
    $dbstmt = $pdo->prepare($query_m);
    $dbstmt->bindParam(1,$pages_id);
    $dbstmt->execute();
    $emails_other = $dbstmt->fetchAll(PDO::FETCH_ASSOC);

    $jsonData=[];
    if(is_array($emails_other) && count($emails_other) > 0){
        foreach ($emails_other as $email_other){
        //var_dump($email_other['email_address']);
            $mailOwner->addAddress($email_other['email_address']);
                $body_other = "<p>Poštovani {$email_other['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>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_other;         
                try {
                    $mailOwner->send();
                    $mailOwner = "INSERT INTO visitneum.contact_owner (fname,tel,userMail,userMessage,email_address_id) VALUES (:fname,:tel,:userMail,:userMessage,:email_address_id)";
                    $stmt = $pdo->prepare($mailOwner);
                    $stmt->execute(['fname' => $fname,'tel' => $tel,'userMail' => $userMail,'userMessage' => $userMessage,'email_address_id' => $email_other['email_address_id']]);

                    $rez['response']="success";
                    $rez['content']="Hvala Vam ".ucwords($fname)."! Vaša poruka je uspješno poslata vlasniku objekta {$email_other['owner_property']}! Odgovor ćete dobiti ubrzo!";
                    $jsonData[] = $rez;
                }//end try mail send    
                catch (Exception $e) {
                    $rez['response'] = "error";
                    $rez['content'] = "Došlo je do greške! Pokušajte ponovo..." . $mailOwner->ErrorInfo;
                    $jsonData[] = $rez;
                }       
    }//end foreach for email addresses  (man owners of other properties(restaurants,ships etc.))
}//end if for array of emails
//echo str_replace("[]","{}",json_encode($jsonData));
echo json_encode($jsonData);
//var_dump($jsonData);

这是submitHandler之后我的JS文件的一部分

     submitHandler: function (form) {
      //Your code for AJAX starts    
      var formData = jQuery("#contactOwner").serialize();
      console.log(formData);
      jQuery.ajax({
        url: '/inc/Form_process.PHP',type: 'post',data: formData,dataType: 'json',//async: true,cache: false,success: function (rez) {
          jQuery("#responSEOwner").text(rez[0].content);
          console.log(rez[0].response);
          console.log(rez[0].content);
        },error: function (rez) {
         jQuery("#responSEOwner").text("An error occurred");
          console.log(rez[1].response);
          console.log(rez[1].content);
        }
      }); //Code for AJAX Ends
      // Clear all data after submit
      var resetForm = document.getElementById('contactOwner').reset();
      return false;
    } //submitHandler

我希望有人理解为什么 json_encode 只返回空数组或带有 JSON_FORCE_OBJECT 的空对象,所以提前感谢您的任何帮助。任何帮助将不胜感激。

解决方法

您确实应该在问题中包含实际的 JSON;没有它,我们就盲目地工作,但我能猜到问题是什么。当有多个记录时,您没有正确构建 JSON。当您只有一个收件人时,您的 JSON 可能如下所示:

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

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

{"readyState":4,"statusText":"OK"}{"readyState":4,"statusText":"OK"}

这是不是有效的 JSON。

我建议您在循环中积累 JSON 响应,然后以正确的格式输出它们。类似的东西:

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

这样你最终会得到这样的数据:

[
    {"readyState":4,"statusText":"OK"},{"readyState":4,"statusText":"OK"}
]

哪个 是有效的 JSON。如果没有数据,它也可以工作,因为它会返回一个空数组,这也是有效的 JSON。

除此之外,我非常怀疑你有 utf8ize 函数——这表明你在做其他 UTF-8 的事情是错误的,但这是另一个问题的主题。