【发布时间】: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