eval 函数在 ajax post 中不起作用
eval function not working in ajax post
所以我使用 ajax 到 post 序列化表单到 php 脚本,然后在成功时提醒返回的数据。
我的代码在我的本地环境中运行良好,但是上传后,eval() 函数把一切都搞砸了。
这是我的代码:
function post_that_shit(formIdToSerialize, postUrl) {
var serializedData = $("#"+formIdToSerialize).serialize();
var post_url = postUrl+".php";
//alert(serializedData + "\n" + post_url);
$.ajax({
url: post_url,
type: "POST",
data: serializedData,
success: function(data){
data = eval('('+data+')' );
console.log(data.msg);
if(data.reload == 'yes'){
window.location.reload();
}
if(data.relocate != 'no'){
window.location.href = data.relocate;
//alert(data.relocate);
}
if(data.msg != 'no'){
$(".message").html(data.msg);
//alert(data.msg);
}
//alert('relocate: '+data.relocate);
}
});
}
所以这很简单。
php 回显出一个 json 编码数组,如下所示:
echo json_encode(array('msg' => $errors, 'relocate' => 'no'));
根据回显的内容,显示消息或重新定位用户。
为什么在线使用代码会出现SyntaxError: Unexpected token ')' 的错误?
在本地它工作得很好:(
感谢您的帮助
克里斯
您不需要使用 eval()
。只需将 dataType
选项设置为 'json'
,数据将被 jQuery
内部解析为 object
$.ajax({
url: post_url,
type: "POST",
dataType:'json',
data: serializedData,
success: function(data){
console.log(typeof data); // returns "object"
此外,在服务器上为 application/json
设置正确的内容类型 header 也有帮助
我不知道为什么你在那个地方需要 eval()
功能。这是一个错误的编码。您的解决方案是将数据类型设置为 JSON 并且 ajax 函数自动将其视为 json:
$.ajax({
url: post_url,
type: "POST",
dataType: 'json',
data: serializedData,
success: function(data){
console.log(data.msg);
if(data.reload == 'yes'){
window.location.reload();
}
if(data.relocate != 'no'){
window.location.href = data.relocate;
//alert(data.relocate);
}
if(data.msg != 'no'){
$(".message").html(data.msg);
//alert(data.msg);
}
//alert('relocate: '+data.relocate);
}
});
首先,eval
是邪恶的。不要使用它……永远不要!就像一颗准备引爆的炸弹
其次,解析 json 可以在 Javascript 中本地完成。不需要 eval
.
您可以使用 JSON.parse
,它将 return 您一个由包含 json 文本的字符串解析的对象。
eval
用于计算代码,换句话说,它执行的是javascript而不是json。当 eval
return 是一个对象时,它只是 JSON 作为 JavaScript 子集的副作用。换句话说,任何格式为 json 的字符串都可以计算为 JavaScript。但是JavaScript无法格式化为JSON。没有表示 Date
、Function
和许多更复杂的对象。也就是说,当使用 eval
时,您实际上是在执行 JavaScript,这就是这里的大问题。它可能会在解析时执行具有潜在危险的代码 JSON 只需要将数据解析为数据结构,仅此而已。
关于 JSON 的更多信息:https://fr.wikipedia.org/wiki/JavaScript_Object_Notation
所以它允许任何人添加一些 javascript 然后通过你使用 eval
来执行。它可以允许某人在其他用户的浏览器上执行代码。例如,它可用于窃取密码或窃取任何其他方式无法访问的私人信息。
另一方面,jQuery 允许您通过将 dataType
属性用作 'json' 来本地解析 json。像这样:
$.ajax({
url: post_url,
type: "POST",
dataType: 'json',
data: serializedData,
success: function(data){
console.log(data.msg);
或使用JSON.parse
$.ajax({
url: post_url,
type: "POST",
data: serializedData,
success: function(data){
data = JSON.parse(data)
console.log(data.msg);
也正如charlie
指出的,我们自己解析JSON意味着我们必须将它包装在try catch
中,因为如果json不是,解析可能会失败无效。
但使用 jQuery 为我们提供了一种轻松处理该问题的方法。
您可以像这样重写您的代码:
var req = $.ajax({
url: post_url,
type: "POST",
dataType: 'json',
data: serializedDate
});
req.done(function (data) {
// Success
});
req.fail(function () {
// Error something went wrong
});
使用 promise 形式的优点是您可以链接调用以获得干净的异步代码,而不是回调地狱和无限函数嵌套。
所以我使用 ajax 到 post 序列化表单到 php 脚本,然后在成功时提醒返回的数据。 我的代码在我的本地环境中运行良好,但是上传后,eval() 函数把一切都搞砸了。
这是我的代码:
function post_that_shit(formIdToSerialize, postUrl) {
var serializedData = $("#"+formIdToSerialize).serialize();
var post_url = postUrl+".php";
//alert(serializedData + "\n" + post_url);
$.ajax({
url: post_url,
type: "POST",
data: serializedData,
success: function(data){
data = eval('('+data+')' );
console.log(data.msg);
if(data.reload == 'yes'){
window.location.reload();
}
if(data.relocate != 'no'){
window.location.href = data.relocate;
//alert(data.relocate);
}
if(data.msg != 'no'){
$(".message").html(data.msg);
//alert(data.msg);
}
//alert('relocate: '+data.relocate);
}
});
}
所以这很简单。 php 回显出一个 json 编码数组,如下所示:
echo json_encode(array('msg' => $errors, 'relocate' => 'no'));
根据回显的内容,显示消息或重新定位用户。
为什么在线使用代码会出现SyntaxError: Unexpected token ')' 的错误? 在本地它工作得很好:(
感谢您的帮助
克里斯
您不需要使用 eval()
。只需将 dataType
选项设置为 'json'
,数据将被 jQuery
$.ajax({
url: post_url,
type: "POST",
dataType:'json',
data: serializedData,
success: function(data){
console.log(typeof data); // returns "object"
此外,在服务器上为 application/json
设置正确的内容类型 header 也有帮助
我不知道为什么你在那个地方需要 eval()
功能。这是一个错误的编码。您的解决方案是将数据类型设置为 JSON 并且 ajax 函数自动将其视为 json:
$.ajax({
url: post_url,
type: "POST",
dataType: 'json',
data: serializedData,
success: function(data){
console.log(data.msg);
if(data.reload == 'yes'){
window.location.reload();
}
if(data.relocate != 'no'){
window.location.href = data.relocate;
//alert(data.relocate);
}
if(data.msg != 'no'){
$(".message").html(data.msg);
//alert(data.msg);
}
//alert('relocate: '+data.relocate);
}
});
首先,eval
是邪恶的。不要使用它……永远不要!就像一颗准备引爆的炸弹
其次,解析 json 可以在 Javascript 中本地完成。不需要 eval
.
您可以使用 JSON.parse
,它将 return 您一个由包含 json 文本的字符串解析的对象。
eval
用于计算代码,换句话说,它执行的是javascript而不是json。当 eval
return 是一个对象时,它只是 JSON 作为 JavaScript 子集的副作用。换句话说,任何格式为 json 的字符串都可以计算为 JavaScript。但是JavaScript无法格式化为JSON。没有表示 Date
、Function
和许多更复杂的对象。也就是说,当使用 eval
时,您实际上是在执行 JavaScript,这就是这里的大问题。它可能会在解析时执行具有潜在危险的代码 JSON 只需要将数据解析为数据结构,仅此而已。
关于 JSON 的更多信息:https://fr.wikipedia.org/wiki/JavaScript_Object_Notation
所以它允许任何人添加一些 javascript 然后通过你使用 eval
来执行。它可以允许某人在其他用户的浏览器上执行代码。例如,它可用于窃取密码或窃取任何其他方式无法访问的私人信息。
jQuery 允许您通过将 dataType
属性用作 'json' 来本地解析 json。像这样:
$.ajax({
url: post_url,
type: "POST",
dataType: 'json',
data: serializedData,
success: function(data){
console.log(data.msg);
或使用JSON.parse
$.ajax({
url: post_url,
type: "POST",
data: serializedData,
success: function(data){
data = JSON.parse(data)
console.log(data.msg);
也正如charlie
指出的,我们自己解析JSON意味着我们必须将它包装在try catch
中,因为如果json不是,解析可能会失败无效。
但使用 jQuery 为我们提供了一种轻松处理该问题的方法。
您可以像这样重写您的代码:
var req = $.ajax({
url: post_url,
type: "POST",
dataType: 'json',
data: serializedDate
});
req.done(function (data) {
// Success
});
req.fail(function () {
// Error something went wrong
});
使用 promise 形式的优点是您可以链接调用以获得干净的异步代码,而不是回调地狱和无限函数嵌套。