如何解决如何修复 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 的事情是错误的,但这是另一个问题的主题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。