【问题标题】:how to fix json_encode return empty array or empty object如何修复 json_encode 返回空数组或空对象
【发布时间】:2021-07-30 08:16:25
【问题描述】:

我需要一些 PHP、JSON、AJAX 和 jQuery 高级用户的帮助。我需要在两个 if statemnts 之间的 foreach 循环中使用 json_encode,所以我在 google 上阅读了很多内容,我发现 $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/ all 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);

这是提交处理程序之后我的 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 的空对象,因此在此先感谢您的帮助。任何帮助将不胜感激。

【问题讨论】:

  • 尝试在php文件中最后添加die()
  • 那么你的 JSON 是什么样的?不将其包含在您的问题中似乎很奇怪,因为这就是问题所在
  • 亲爱的@Synchro,非常感谢您回答我。我在 PHP 文件中包含 JSON,请检查。但是,问题在于 $data['response'] 和 $data['content']。也许 JSON 不能在 foreach 中工作......
  • 您应该创建一个单独的数组,将其填充到您的 foreach 中,然后 foreach 之后,将其编码/回显为 json。然后它将成为一个数组,其中包含 json 中的对象。现在,您只是在循环内一个接一个地输出多个 json 对象,这将是无效的 json
  • 我不知道您在哪些网站上阅读或谁编写了它,但 {"foo": ""} 是完全有效的 JSON,因此您的 "responseText":"" 不会导致它无效。如果有人声称会这样做,那么他们实际上是错误的,或者您误解了该声明的上下文。但是,您已经得到了详细解释您的实际问题的答案。

标签: php jquery json ajax foreach


【解决方案1】:

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

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

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

{"readyState":4,"responseText":"","status":200,"statusText":"OK"}{"readyState":4,"responseText":"","status":200,"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,"responseText":"","status":200,"statusText":"OK"},
    {"readyState":4,"responseText":"","status":200,"statusText":"OK"}
]

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

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

【讨论】:

  • 那是 PHP 代码,它创建了一个稍后转换为 JSON 的数组;它不是 JSON 本身,也没有显示触发错误的实际内容。
  • 如果你只想要一个响应,不要在循环内累积东西,只要跟踪整体状态并在循环之后输出JSON。
  • 你读过我的回答吗?尽管被多次询问,您仍然没有发布您正在生成的 JSON。你真的没有帮助我们在这里帮助你。 responseText 很可能是空的,因为您返回的是无效的 JSON,因此它无法解析通常用于填充该数据的数据。这就是为什么我们一直要求您发布您的 JSON!独立于 JS 测试 PHP 是个好主意,因为您在两者之间感到困惑。
  • 好的,但不要只是随意更改内容并希望它有效,了解您在做什么以及为什么。
  • 请您现在检查我的正确 php 文件和 jQuery。我被包含在提交表单时返回的 JSON 中,这是 https://jsonlint.com/ 上的正确 JSON,但是在提交时它返回空数组或空对象。为什么?我想不通:(
猜你喜欢
  • 2013-07-22
  • 1970-01-01
  • 2018-07-13
  • 2016-06-02
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
相关资源
最近更新 更多