Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在PHP中重写JSON数组,以便jQuery可以读取它?_Javascript_Php_Jquery_Json_Ajax - Fatal编程技术网

Javascript 在PHP中重写JSON数组,以便jQuery可以读取它?

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

我试图在PHP中创建一个JSON数组,jQuery可以使用和访问该数组,但由于某些原因,它不起作用。我在客户端和服务器日志中都没有收到错误消息,如果我直接访问enc.php,它确实可以工作,但我不确定输出是否正确(数组格式)。

我想要什么: 我想使用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]
呼叫。很高兴它能工作!