Javascript 在PHP中重写JSON数组,以便jQuery可以读取它?
我试图在PHP中创建一个JSON数组,jQuery可以使用和访问该数组,但由于某些原因,它不起作用。我在客户端和服务器日志中都没有收到错误消息,如果我直接访问enc.php,它确实可以工作,但我不确定输出是否正确(数组格式)。Javascript 在PHP中重写JSON数组,以便jQuery可以读取它?,javascript,php,jquery,json,ajax,Javascript,Php,Jquery,Json,Ajax,我试图在PHP中创建一个JSON数组,jQuery可以使用和访问该数组,但由于某些原因,它不起作用。我在客户端和服务器日志中都没有收到错误消息,如果我直接访问enc.php,它确实可以工作,但我不确定输出是否正确(数组格式)。 我想要什么: 我想使用jQuery访问数据,使用ID的数据[I][0]([I]因为它在循环中),消息的数据[I][1]等等 也许我试图用错误的方式来做这件事,如果是这样,请帮我指出正确的方向或提供一个例子 我的代码: 当前的PHP代码: $result = $stmt
我想要什么: 我想使用jQuery访问数据,使用ID的数据[I][0]([I]因为它在循环中),消息的数据[I][1]等等 也许我试图用错误的方式来做这件事,如果是这样,请帮我指出正确的方向或提供一个例子 我的代码: 当前的PHP代码:
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
$fetchedid = $row['id'];
$fetchedkey = $row['chat_key'];
$fetchednonce = $row['chat_nonce'];
$fetcheduser = $row['chat_user'];
$fetchedmsg = $row['chat_msg'];
$plainmsg = \Sodium\crypto_secretbox_open($fetchedmsg, $fetchednonce, $fetchedkey);
$out = array('id' => $fetchedid, 'msg' => $plainmsg, 'user' => $fetcheduser);
header('Content-Type: application/json');
ob_end_clean();
echo json_encode($out);
}
结果:
{"id":297,"msg":"test message","user":"john"}
$.ajax({
type: "GET",
url: "enc.php",
dataType: "json",
success: function(data) {
console.log('Update success called');
if (data == 2) {
// No messages to fetch
} else if (data == 3) {
// Cookie Tampering detected
} else if (data == 5) {
$("#chat").remove();
alert("Den här chatten är stängd (tiden har gått ut).");
window.location.href = "/?logout=safe";
}
else {
for (i = 0; i < data.length; ++i) {
var mid = data[i][0];
$.cookie("cmid", mid);
var from = data[i][1];
var msg = data[i][2];
$("#chat").append('<div class="left spotmsg"><div class="chat-avatar pull-left"><img src="/img/them.png" alt="avatar" width="48" height="48"></div><div class="message"><div class="arrow-left"></div><p><strong>@'+from+'</strong></p><p class="txt">'+msg+'</p></div></div>');
}
$('textarea').focus();
$(".chat_area").animate({ scrollTop: $(".chat_area")[0].scrollHeight}, 1000);
}
}
});
我的jQuery(Ajax)代码:
{"id":297,"msg":"test message","user":"john"}
$.ajax({
type: "GET",
url: "enc.php",
dataType: "json",
success: function(data) {
console.log('Update success called');
if (data == 2) {
// No messages to fetch
} else if (data == 3) {
// Cookie Tampering detected
} else if (data == 5) {
$("#chat").remove();
alert("Den här chatten är stängd (tiden har gått ut).");
window.location.href = "/?logout=safe";
}
else {
for (i = 0; i < data.length; ++i) {
var mid = data[i][0];
$.cookie("cmid", mid);
var from = data[i][1];
var msg = data[i][2];
$("#chat").append('<div class="left spotmsg"><div class="chat-avatar pull-left"><img src="/img/them.png" alt="avatar" width="48" height="48"></div><div class="message"><div class="arrow-left"></div><p><strong>@'+from+'</strong></p><p class="txt">'+msg+'</p></div></div>');
}
$('textarea').focus();
$(".chat_area").animate({ scrollTop: $(".chat_area")[0].scrollHeight}, 1000);
}
}
});
$.ajax({
键入:“获取”,
网址:“enc.php”,
数据类型:“json”,
成功:功能(数据){
log('updatesuccess called');
如果(数据==2){
//没有要获取的消息
}否则如果(数据==3){
//检测到Cookie篡改
}否则如果(数据==5){
$(“#聊天”).remove();
警报(“Den här chattenär stängd(tiden har gått ut)。”;
window.location.href=“/?注销=安全”;
}
否则{
对于(i=0;i@”+from+”“+msg+”
”);
}
$('textarea').focus();
$(.chat_区域”).animate({scrollTop:$(.chat_区域”)[0].scrollHeight},1000);
}
}
});
您可以使用符号访问对象。要访问值
请使用键
。例如,要访问id
请使用data.id
。如果有对象,则不能使用“长度”循环
var mid = data.id; //specify key to access id
$.cookie("cmid", mid);
var from = data.user;
var msg = data.msg;
$("#chat").append('<div class="left spotmsg"><div class="chat-avatar pull-left"><img src="/img/them.png" alt="avatar" width="48" height="48"></div><div class="message"><div class="arrow-left"></div><p><strong>@'+from+'</strong></p><p class="txt">'+msg+'</p></div></div>');
var mid=data.id//指定访问id的密钥
$.cookie(“cmid”,mid);
var from=data.user;
var msg=data.msg;
$(“#chat”).append(“@”+from+”“+msg+”
”);
您可以使用符号访问对象。要访问值
请使用键
。例如,要访问id
请使用data.id
。如果有对象,则不能使用“长度”循环
var mid = data.id; //specify key to access id
$.cookie("cmid", mid);
var from = data.user;
var msg = data.msg;
$("#chat").append('<div class="left spotmsg"><div class="chat-avatar pull-left"><img src="/img/them.png" alt="avatar" width="48" height="48"></div><div class="message"><div class="arrow-left"></div><p><strong>@'+from+'</strong></p><p class="txt">'+msg+'</p></div></div>');
var mid=data.id//指定访问id的密钥
$.cookie(“cmid”,mid);
var from=data.user;
var msg=data.msg;
$(“#chat”).append(“@”+from+”“+msg+”
”);
问题源于这样一个事实,即您的结果不是对象数组的json,而是一个简单的对象,因此
for (i = 0; i < data.length; ++i) {
这样,它也将容纳多个john;)
建议
因此,我认为您的php应该是:
$result = $stmt->get_result();
$out = array();
while ($row = $result->fetch_assoc()) {
//... your code doesn't change here
$plainmsg = \Sodium\crypto_secretbox_open($fetchedmsg, $fetchednonce, $fetchedkey);
//here we append to $out
$out[] = array('id' => $fetchedid, 'msg' => $plainmsg, 'user' => $fetcheduser);
header('Content-Type: application/json');
ob_end_clean();
//echo json_encode($out);// not yet...
}
echo json_encode($out);//but now!
问题源于这样一个事实,即您的结果不是对象数组的json,而是一个简单的对象,因此
for (i = 0; i < data.length; ++i) {
这样,它也将容纳多个john;)
建议
因此,我认为您的php应该是:
$result = $stmt->get_result();
$out = array();
while ($row = $result->fetch_assoc()) {
//... your code doesn't change here
$plainmsg = \Sodium\crypto_secretbox_open($fetchedmsg, $fetchednonce, $fetchedkey);
//here we append to $out
$out[] = array('id' => $fetchedid, 'msg' => $plainmsg, 'user' => $fetcheduser);
header('Content-Type: application/json');
ob_end_clean();
//echo json_encode($out);// not yet...
}
echo json_encode($out);//but now!
问题是您在while循环中输出单个JSON字符串,这是不正确的,因为组合输出是无效的JSON。解决方案是构建一个数组,然后在最后输出该数组
$arr = array();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
$fetchedid = $row['id'];
$fetchedkey = $row['chat_key'];
$fetchednonce = $row['chat_nonce'];
$fetcheduser = $row['chat_user'];
$fetchedmsg = $row['chat_msg'];
$plainmsg = \Sodium\crypto_secretbox_open($fetchedmsg, $fetchednonce, $fetchedkey);
$out = array('id' => $fetchedid, 'msg' => $plainmsg, 'user' => $fetcheduser);
$arr[] = $out;
}
header('Content-Type: application/json');
ob_end_clean();
echo json_encode($arr); // encode the final array
现在,您的输出可以包含多条聊天消息,并且是有效的JSON,例如:
[{"id":297,"msg":"test message","user":"john"}, {"id":300,"msg2":"test2 message","user":"john"}]
在JavaScript中,引用属性名称,而不是[0]
,[1]
等:
var mid = data[i].id;
$.cookie("cmid", mid);
var from = data[i].user;
var msg = data[i].message;
问题是您在while循环中输出单个JSON字符串,这是不正确的,因为组合输出是无效的JSON。解决方案是构建一个数组,然后在最后输出该数组
$arr = array();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
$fetchedid = $row['id'];
$fetchedkey = $row['chat_key'];
$fetchednonce = $row['chat_nonce'];
$fetcheduser = $row['chat_user'];
$fetchedmsg = $row['chat_msg'];
$plainmsg = \Sodium\crypto_secretbox_open($fetchedmsg, $fetchednonce, $fetchedkey);
$out = array('id' => $fetchedid, 'msg' => $plainmsg, 'user' => $fetcheduser);
$arr[] = $out;
}
header('Content-Type: application/json');
ob_end_clean();
echo json_encode($arr); // encode the final array
现在,您的输出可以包含多条聊天消息,并且是有效的JSON,例如:
[{"id":297,"msg":"test message","user":"john"}, {"id":300,"msg2":"test2 message","user":"john"}]
在JavaScript中,引用属性名称,而不是[0]
,[1]
等:
var mid = data[i].id;
$.cookie("cmid", mid);
var from = data[i].user;
var msg = data[i].message;
非常感谢。使用您提供的代码,我从jQuery得到了一个回复,但是,它说数据是未定义的?我是否也需要更改jQuery代码?我不希望这样。请尝试调用console.log(data)
查看返回的内容(或转到浏览器开发工具的“网络”选项卡)?忽略此问题。这确实适用于我的情况,唯一需要注意的是,我必须将数据[I][0]更改为数据[I].id!我之所以选择您的答案,是因为这适合我的情况,它允许我继续使用(I=0;I数据[I][0]
呼叫。很高兴它能工作!非常感谢。使用您提供的代码,我从jQuery得到了一个回复,但是,它说数据是未定义的?我是否也需要更改jQuery代码?我不希望这样。请尝试调用console.log(data)
查看返回的内容(或转到浏览器开发工具的“网络”选项卡)?忽略此问题。这确实适用于我的情况,唯一需要注意的是,我必须将数据[I][0]更改为数据[I].id!我之所以选择您的答案,是因为这适合我的情况,它允许我继续使用(I=0;I数据[I][0]
呼叫。很高兴它能工作!