Php 解码JSON$\u POST
好的,我会再试一次,多次被问到,但我似乎没有说清楚 首先,我在网页上运行了一个AJAX脚本,它允许我从游戏中提取数据 然后使用POST方法将这些数据发送到PHP“api”页面 我可以在浏览器的控制台中看到数据实际上正在传输 以下是数据流示例: 现在我的问题是: 我可以看到数据正在被解析到PHP。PHP代码如下:Php 解码JSON$\u POST,php,mysql,arrays,http-post,Php,Mysql,Arrays,Http Post,好的,我会再试一次,多次被问到,但我似乎没有说清楚 首先,我在网页上运行了一个AJAX脚本,它允许我从游戏中提取数据 然后使用POST方法将这些数据发送到PHP“api”页面 我可以在浏览器的控制台中看到数据实际上正在传输 以下是数据流示例: 现在我的问题是: 我可以看到数据正在被解析到PHP。PHP代码如下: <?php // set headers for API header('Access-Control-Allow-Origin: '.$_SERV
<?php
// set headers for API
header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers: Content-Type');
header('Content-type: application/json');
$m = false;
if(preg_match('/http\:\/\/prodgame([0-9]+)\.lordofultima\.com/',$_SERVER['HTTP_ORIGIN'],$m))
{ $m = $m[1]; }
if(empty($m)) { die('Invalid Origin.'); }
if(!empty($_POST['data_type']))
{
$sender = $_POST['sender'];
$alliance = $_POST['alliance'];
$request = $_POST['data_type'];
$data = $_POST['data'];
// Response to Alliance Info Exporter
$json = array(
'message' => 'recieved.',
'data' => array(),
'error' => false
);
// handle data types
switch($request)
{
case 'connection_test': $json['message'] = 'Welcome to our server2. Your are connected!'; break;
case 'member' : /* Code for member request */ break;
case 'city' : /* Code for member request */ break;
case 'support' : /* Code for support request */ break;
default : $json['message'] = 'Nothing Done.'; break;
}
// Respond
die(json_encode($json));
}
die('No Access.');
?>
另一点信息——根据我所能理解的,javascript中的send to server函数调用如下:
// send to server
req = main.ajax.send({
alliance : {
id : a.id,
name : a.name,
members : a.members,
score : a.total_score
},
data_type:type,
data:json
});
if(req){
req.success(function(x){
main.aix.set_loading(tab.index,"Data sent to server!",1000);
main.aix.get_saved(id,type).sent = true;
});
}
});
}
else
{ main.aix.set_loading(tab.index,"This data has already been sent.",2000); }
}
if(typeof callback == "function")
{ callback(json); }
}
},
因此,对上面的更新:下面由Wayne提供的echo命令确实为$data变量提供了数据结构。接下来的问题是:如何将我获取的所有数据(发送方、数据数组等)转换到SQL表中?如果定期更新/刷新我创建的表,我将如何消除数据库中的重复数据?如果我理解您的问题,您就无法阅读$\u POST[]。您确定javascript正在发送正确的数据吗?如果没有,我将使用jquery:
$.post("script.php",$("#FormForExample").serialize());
这将发送正确的数据。如果这不是你的问题,请原谅。我想你有点困惑了。您正在尝试解码未在JSON中编码的POST变量。JSON将在脚本末尾输出:
// Respond
die(json_encode($json));
基本上,您担心的是JSON,即使您的脚本在所有处理完成后将JSON转储到页面上时才处理JSON
如果要处理传入数据,则应更仔细地查看$data数组:
$sender = $_POST['sender'];
$alliance = $_POST['alliance'];
$request = $_POST['data_type'];
$data = $_POST['data'];
顺便说一下,从您链接的POST数据来看,$data将是一个多维数组
执行以下操作,您应该了解您正在处理的结构类型:
$sender = $_POST['sender'];
$alliance = $_POST['alliance'];
$request = $_POST['data_type'];
$data = $_POST['data'];
echo '<pre>';
var_dump($data);
echo '</pre>;
$sender=$\u POST['sender'];
$alliance=$_POST['alliance'];
$request=$\u POST['data\u type'];
$data=$_POST['data'];
回声';
var_dump($数据);
回声';
或者试试这个:
$log_to_file = print_r($_POST,$return=true);
$f = fopen("/var/www/aix/data/member.txt", "w");
fwrite($f, $log_to_file);
fclose($f);
foreach($dataInfo形式的数据){
foreach($dataInfo作为$key=>$info){
回显$key.:.$info.
;
}
回声“
”;
}
经过一些实验后,我发现这很有效
Array
(
[alliance] => Array
(
[id] => 134
[name] => Alliance1
[members] => 9
[score] => 17187
)
[data_type] => city
[data] => Array
(
[0] => Array
(
[id] => 16515340
[owner_id] => 3475
[owner] => Player1
[coords] => '268:252
[name] => AC2013
[score] => 11863
[city_type] => castle
[location] => land
)
[1] => Array
(
[id] => 16515335
[owner_id] => 3475
[owner] => Player1
[coords] => '263:252
[name] => AC2013
[score] => 7
[city_type] => castle
[location] => water
)
[2] => Array
(
[id] => 17891610
[owner_id] => 3523
[owner] => Player2
[coords] => '282:273
[name] => City of Repoman9900
[score] => 1978
[city_type] => castle
[location] => water
)
[3] => Array
(
[id] => 10616856
[owner_id] => 73
[owner] => Player2
[coords] => '024:162
[name] => 1killer
[score] => 1308
[city_type] => castle
[location] => water
)
[4] => Array
(
[id] => 10813465
[owner_id] => 2862
[owner] => Player3
[coords] => '025:165
[name] => City of vuvuzea991
[score] => 1091
[city_type] => castle
[location] => land
)
[5] => Array
(
[id] => 17367317
[owner_id] => 84
[owner] => Player4
[coords] => '277:265
[name] => Dreadland
[score] => 776
[city_type] => castle
[location] => water
)
[6] => Array
(
[id] => 2162850
[owner_id] => 2989
[owner] => Player5
[coords] => '162:033
[name] => City of Dinoeyez
[score] => 157
[city_type] => castle
[location] => water
)
[7] => Array
(
[id] => 2818192
[owner_id] => 556
[owner] => Player6
[coords] => '144:043
[name] => City of wildfire123
[score] => 7
[city_type] => castle
[location] => water
)
)
[sender] => Array
(
[world] => Array
(
[id] => 232
[name] => Server 4
[number] => NaN
)
[alliance] => Array
(
[id] => 2
[name] => Alliance2
)
[player] => Array
(
[id] => 98
[name] => SuperUser
)
[browser] => Array
(
[type] => Chrome
[version] => 25.0.1364.160
)
[aix_version] => 1.00
)
)
通过运行此程序并使用已知的较小数据集,我能够提取正在解析的数组的完整结构。我不得不使用一个较小的数据集,因为print_r()有一个返回行的缓冲区,在该缓冲区之后,它将被切断。我相信有办法解决这个问题,但我现在得到了我所需要的,所以我不得不推迟进一步的实验
你在$data数组上做过var_转储吗?我试过了,但在黑暗中拍摄有点困难。如果我更改了PHP并且它没有将数据发送回客户端,那么我可以运行导出来测试catch 22。它不会将数据发送回客户端,因为任何输出都会破坏输出的JSON。如果您正在执行var_转储,则它应仅用于调试目的。在这些情况下,我临时更改了GET方法,以便查看发送的是什么,不是什么。您是对的,我无法读取$POST[]。但是,我可以合理地确定jquery是好的,因为PHP确实能够识别通过的数据,并将成功消息发送回客户端。我没有太多关于javascript的文档,因为创建者没有对javascript中的代码进行注释,但我会看一看。按照javascript的设置方式,我必须在客户端窗口中输入目标PHP地址,因此它是动态的。那里没有指向PHP文件的静态链接。尝试第二个链接,我会在浏览器的控制台窗口中返回此链接,只需在此处发布一些记录:id:10879179
所有者id:140
所有者:玩家1
coords:'203:166
名称:N23\u 00A
得分:11580
城市类型:城堡
位置:水
所有者id:10682590
所有者id:140
所有者:玩家1
坐标:222:163
名称:C23\u 0AC
得分:11425
城市类型:城堡
位置:土地
id:10748124
所有者id:140
所有者:robwiz
坐标:220:164
名称:C23\u 0AM
得分:10580
城市类型:城堡
位置:土地
谢谢,现在我有一个关于我正在处理的结构的完整输出转储。玩了它,所以我有一个更小的数据集,所以我可以拉一切$log\u to\u file=print\r($\u POST,$return=true);$f=fopen(“/var/www/aix/data/member.txt”,“w”);fwrite($f,$log_到_文件);外国法郎(f美元);将$log_回送到_文件;
$log_to_file = print_r($_POST,$return=true);
$f = fopen("/var/www/aix/data/member.txt", "w");
fwrite($f, $log_to_file);
fclose($f);
Array
(
[alliance] => Array
(
[id] => 134
[name] => Alliance1
[members] => 9
[score] => 17187
)
[data_type] => city
[data] => Array
(
[0] => Array
(
[id] => 16515340
[owner_id] => 3475
[owner] => Player1
[coords] => '268:252
[name] => AC2013
[score] => 11863
[city_type] => castle
[location] => land
)
[1] => Array
(
[id] => 16515335
[owner_id] => 3475
[owner] => Player1
[coords] => '263:252
[name] => AC2013
[score] => 7
[city_type] => castle
[location] => water
)
[2] => Array
(
[id] => 17891610
[owner_id] => 3523
[owner] => Player2
[coords] => '282:273
[name] => City of Repoman9900
[score] => 1978
[city_type] => castle
[location] => water
)
[3] => Array
(
[id] => 10616856
[owner_id] => 73
[owner] => Player2
[coords] => '024:162
[name] => 1killer
[score] => 1308
[city_type] => castle
[location] => water
)
[4] => Array
(
[id] => 10813465
[owner_id] => 2862
[owner] => Player3
[coords] => '025:165
[name] => City of vuvuzea991
[score] => 1091
[city_type] => castle
[location] => land
)
[5] => Array
(
[id] => 17367317
[owner_id] => 84
[owner] => Player4
[coords] => '277:265
[name] => Dreadland
[score] => 776
[city_type] => castle
[location] => water
)
[6] => Array
(
[id] => 2162850
[owner_id] => 2989
[owner] => Player5
[coords] => '162:033
[name] => City of Dinoeyez
[score] => 157
[city_type] => castle
[location] => water
)
[7] => Array
(
[id] => 2818192
[owner_id] => 556
[owner] => Player6
[coords] => '144:043
[name] => City of wildfire123
[score] => 7
[city_type] => castle
[location] => water
)
)
[sender] => Array
(
[world] => Array
(
[id] => 232
[name] => Server 4
[number] => NaN
)
[alliance] => Array
(
[id] => 2
[name] => Alliance2
)
[player] => Array
(
[id] => 98
[name] => SuperUser
)
[browser] => Array
(
[type] => Chrome
[version] => 25.0.1364.160
)
[aix_version] => 1.00
)
)