AJAX 启动错误作为警报,但在数组中作为来自 php json 的字符串响应良好



我尝试使用 AJAX 从 JavaScript 发送一些文本数据和一些文件到 PHPFormData.我也尝试将数组作为响应从PHP发送到JavaScript,所以我在PHP中使用json_encode(),在JavaScript中使用JSON.parse()。代码似乎有效,但 AJAX 在错误警报中向我显示了 PHP 的响应,尽管响应很好。这是我的代码: .JS:

var model = document.getElementById("model").value;
var numerfabryczny = document.getElementById("numer_fabryczny").value;
var data = document.getElementById("data_zakupu").value;
var imienazwisko = document.getElementById("imienazwisko").value;
var adres = document.getElementById("adres").value;
var tel = document.getElementById("numer_tel").value;
var email = document.getElementById("email").value;
var opis = document.getElementById("opis").value;
var zal1 = $("#zal1").get(0).files[0];
var zal2 = $("#zal2").get(0).files[0];
var zal3 = $("#zal3").get(0).files[0];

var zal = new FormData();
zal.append('rodzaj', rodzaj);
zal.append('marka', marka);
zal.append('model', model);
zal.append('kategoria', kategoria);
zal.append('numerfabryczny', numerfabryczny);
zal.append('data', data);
zal.append('adres', adres);
zal.append('imienazwisko', imienazwisko);
zal.append('tel', tel);
zal.append('email', email);
zal.append('opis', opis);
zal.append('lang', lang);
zal.append('zal1', zal1);
zal.append('zal2', zal2);
zal.append('zal3', zal3);

阿贾克斯:

$.ajax({
type: "POST",
dataType: "json",
url: "php/sprawdz-naprawa.php",
data: zal,
processData: false,
contentType: false,
success: function(data){
var returnedData = data;
rodzajerr.style.display = 'none';
markaerr.style.display = 'none';
kategoriaerr.style.display = 'none';
modelerr.style.display = 'none';
numererr.style.display = 'none';
dataerr.style.display = 'none';
imienazwiskoerr.style.display = 'none';
adreserr.style.display = 'none';
telerr.style.display = 'none';
emailerr.style.display = 'none';
opiserr.style.display = 'none';
zal1err.style.display = 'none';
zal2err.style.display = 'none';
zal3err.style.display = 'none';
if(returnedData=="ok")
{
alert("zgloszenie wysłano");
}
else
{
if(returnedData=="error")
{
alert("wystąpił error");
}
else
{
//returnedData=eval(data);
returnedData = JSON.parse(data);
//returnedData = JSON.stringify(data);
//returnedData = JSON.parse(JSON.stringify(data));
//returnedData=$.parseJSON(data);
if(returnedData['rodzaj']!=""){rodzajerr.style.display = 'block'; rodzajerr.innerHTML =returnedData['rodzaj'];}else{rodzajerr.style.display = 'none';}
if(returnedData['marka']!=""){markaerr.style.display = 'block'; markaerr.innerHTML =returnedData['marka'];}else{markaerr.style.display = 'none';}
if(returnedData['kategoria']!=""){kategoriaerr.style.display = 'block'; kategoriaerr.innerHTML =returnedData['kategoria'];}else{kategoriaerr.style.display = 'none';}
if(returnedData['model']!=""){modelerr.style.display = 'block'; modelerr.innerHTML =returnedData['model'];}else{modelerr.style.display = 'none';}
if(returnedData['numer']!=""){numererr.style.display = 'block'; numererr.innerHTML =returnedData['numer'];}else{numererr.style.display = 'none';}
if(returnedData['data']!=""){dataerr.style.display = 'block'; dataerr.innerHTML =returnedData['data'];}else{dataerr.style.display = 'none';}
if(returnedData['imie']!=""){imienazwiskoerr.style.display = 'block'; imienazwiskoerr.innerHTML =returnedData['imie'];}else{imienazwiskoerr.style.display = 'none';}
if(returnedData['adres']!=""){adreserr.style.display = 'block'; adreserr.innerHTML =returnedData['adres'];}else{adreserr.style.display = 'none';}
if(returnedData['tel']!=""){telerr.style.display = 'block'; telerr.innerHTML =returnedData['tel']; }else{ telerr.style.display = 'none'; }
if(returnedData['email']!=""){emailerr.style.display = 'block'; emailerr.innerHTML =returnedData['email'];}else{emailerr.style.display = 'none';}
if(returnedData['opis']!=""){opiserr.style.display = 'block'; opiserr.innerHTML =returnedData['opis'];}else{opiserr.style.display = 'none';}
if(returnedData['zal1']!=""){zal1err.style.display = 'block'; zal1err.innerHTML =returnedData['zal1'];}else{zal1err.style.display = 'none';}
if(returnedData['zal2']!=""){zal2err.style.display = 'block'; zal2err.innerHTML =returnedData['zal2'];}else{zal2err.style.display = 'none';}
if(returnedData['zal3']!=""){zal3err.style.display = 'block'; zal3err.innerHTML =returnedData['zal3'];}else{zal3err.style.display = 'none';}
}
}
},
error: function(msg){
alert(msg.responseText);
}
});

.PHP:

$errors = array();
$naprawa = $_POST['rodzaj']; (i will do it for all data, but its work, when i echo this it is show in alert in error, so that code see value of variable)
$errors['rodzaj']="";
if($naprawa == '---')
{$errors['rodzaj'] = $f01[$j];} (here i fill my errors array and do something like this for all variables)

填充数组的另一个示例:

$errors['tel']="";
if (empty($telefon))
{$errors['tel'] = $f14[$j];}
else if ((strlen($telefon) > 20) && (!empty($telefon)))
{$errors['tel'] = $f05[$j];}
else if ((!preg_match('/^[0-9-s()/]{1,20}+$/', $telefon)) && (!empty($telefon)) && (strlen($telefon) < 21))
{$errors['tel'] = $f15[$j];}

填充数组工作,因为在 ajax 中的警报中的字符串是很好的文本 我在那里发送回复:

echo json_encode($errors);

以下是警报显示的内容:

{"rodzaj":"Prosimy wybrau0107 typ naprawy.","marka":"Prosimy wybrau0107 marku0119.","kategoria":"Prosimy wybrau0107 kategoriu0119 sprzu0119tu.","model":"Prosimy wprowadziu0107 model.","numer":"Prosimy wprowadziu0107 numer fabryczny.","data":"","imie":"Prosimy wprowadziu0107 imiu0119.","adres":"Prosimy wprowadziu0107 adres.","tel":"Prosimy wprowadziu0107 numer telefonu.","email":"Prosimy wprowadziu0107 adres email.","opis":"","zal1":"","zal2":"","zal3":""} 

我们看到字段和值的名称,例如:name -> rodzaj; value -> Prosimy wybra\u0107 typ naprawy。所以反应还可以。但是问题可能出在 ajax 中的解析上。顺便说一句。我想在div 中将此值设置为文本,但是当我尝试不使用 JSON 而是日期类型 text/html 时,我得到的div 文本就像未定义一样。当我在浏览器中的控制台中评论数据类型 i 时,我得到:

"语法错误:缺少;在声明之前">

有人看到一些缺陷吗?

当你在jQuery Ajax选项中设置dataType: "json",时,jQuery将为你解析响应。它为你运行 JSON.parse()。

因此,当您执行returnedData = JSON.parse(data);时,您正在尝试解析和对象而不是字符串。

不需要解析数据,因为它已经被jQuery从字符串转换为对象。

当您将数据类型更改为其他数据类型时,它之所以有效,是因为其他数据类型返回一个字符串,而不是一个对象,因此可以分析该字符串。

现在看看为什么触发 Ajax 处理程序,这通常是由响应之前或之后输出的其他字符引起的。检查的一种方法是转义输出。

console.log(escape(msg.responseText));

您将在{之前或之后看到转义序列}

因此,您需要查看PHP代码,看看哪些字符可以写到响应中。

最新更新