【问题标题】:decoding a JSON $_POST解码 JSON $_POST
【发布时间】:2013-03-30 18:56:27
【问题描述】:

好的,我会再试一次,问了很多次,但似乎没有让自己说清楚。

首先我有一个在网页上运行的 AJAX 脚本,它允许我从游戏中提取数据。

然后使用 POST 方法将这些数据发送到 PHP 'api' 页面。

我可以在浏览器的控制台中看到数据实际上正在传输。

这是数据流示例:https://docs.google.com/document/d/1FLHiWBSBqqm7N8LvzISmiedQKxsqYM572iAT4CQpjP8/edit?usp=sharing

现在这是我的问题:

我可以看到数据正在被解析为 PHP。 PHP代码如下:

<?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.');

?>

数据是从我在玩这个在线游戏时在本地运行的 .js 文件中解析出来的。创建者发布了 PHP 示例,显然是希望使用它的人将所需的代码添加到 switch/case 语句中以操作数据。

现在,我尝试使用带有各种选项($_POST 或 $POST('data' 或 PHP 中定义的变量)的 json_decode 提取数据作为测试,只是为了验证数据。没有任何效果。

var_dump 对我不起作用,因为客户端 js 的作用是我无法根据提供的内容修改服务器端 PHP 上的代码 - 客户端会在我触发发送到服务器功能之前寻找响应。

我可能做错了什么。正如您从正在传输的 google 链接数据中的 HTML POST 输出中看到的那样,is。如何访问和操作这些数据?我的最终目标是在数据进入 SQL 数据库时对其进行解析,但我需要确保首先处理它。

我的环境 - 现在在开发中我使用的是本地机器,在 Linux 操作系统上运行的 Apache 上的 PHP。我也加载了 mySql,但现在没有播放。所有最新版本,昨天刚刚安装开发环境。

更多信息 - 我尝试在 case 语句以及文档前面插入此代码,使用此或 var_export 获得的最佳输出是 0 字节文件或仅显示 NULL 的文件:

$data1 = json_decode($_POST, $assoc = null);
$f = fopen("/var/www/aix/data/alliance6.txt", "w");
fwrite($f, $data1);
fclose($f);

另一点信息 - 从我可以看出 javascript 中的发送到服务器函数的调用如下:

// 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); }
}
},

因此,对上述内容的更新:下面韦恩提供的 echo 命令确实为我提供了 $data 变量的数据结构。现在是一个后续问题:如何将我获取的所有数据(发送方、数据阵列等)转换为 SQL 表?如果定期更新/刷新我创建的表,我将如何对数据库中的数据进行重复数据删除?

【问题讨论】:

  • 你对 $data 数组做了 var_dump 吗?
  • 我试过了,但是在黑暗中拍摄有点可怕。如果我更改了 PHP 并且它没有将数据发送回客户端,那么我可以运行导出进行测试,以便捕获 22。
  • 它不会将数据发送回客户端,因为任何输出都会破坏输出的 JSON。如果你正在做一个 var_dump,它应该只用于调试目的。
  • 对于这些情况,我暂时将方法更改为 GET 以查看发送和未发送的内容。

标签: php mysql arrays http-post


【解决方案1】:

我觉得你有点搞糊涂了。您正在尝试解码未以 JSON 编码的 POST 变量。 JSON 在脚本末尾输出:

// Respond
die(json_encode($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>;

或者试试这个:

foreach($data as $dataInfo){
    foreach($dataInfo as $key => $info){
        echo $key . ': ' . $info . '<br>';
    }
    echo '<hr>';
}

【讨论】:

  • 尝试第二个让我回到浏览器的控制台窗口中,只是在此处发布了一些记录:id:10879179
    owner_id:140
    owner:player1
    coords: '203:166
    名称:N23_00A
    得分:11580
    城市类型:城堡
    位置:水

    id:10682590
    owner_id:140
    所有者:player1坐标:'222:163
    名称:C23_0AC
    得分:11425
    城市类型:城堡
    位置:土地

    id:10748124
    owner_id:140
    所有者:robwiz
    坐标:'220:164
    名称:C23_0AM
    得分:10580
    城市类型:城堡
    位置:土地

  • 谢谢,现在我有了我正在处理的结构的完整输出转储。玩弄它,所以我有一个较小的数据集,所以我可以提取所有内容。 $log_to_file = print_r($_POST,$return=true); $f = fopen("/var/www/aix/data/member.txt", "w"); fwrite($f, $log_to_file); fclose($f); echo $log_to_file;
【解决方案2】:

如果我理解您的问题,您将无法阅读 $_POST[]。您确定 javascript 正在发送正确的数据吗?如果没有,我会使用 jquery:

$.post("script.php",$("#FormForExample").serialize());

这将发送正确的数据。如果这不是您的问题,请原谅。

【讨论】:

  • 你说得对,我看不懂 $POST[]。但是我有理由确定 jquery 没问题,因为 PHP 确实可以识别通过的数据并将成功消息发送回客户端。我没有太多关于 javascript 的文档,因为创建者没有评论 javascript 中的代码,但我会看看。 javascript的设置方式,我必须在客户端窗口中输入目标PHP地址,所以它是动态的。那里没有指向 PHP 文件的静态链接。
【解决方案3】:

经过一些实验,我发现这很好用

$log_to_file = print_r($_POST,$return=true);
$f = fopen("/var/www/aix/data/member.txt", "w");
fwrite($f, $log_to_file);
fclose($f);

通过运行它并使用已知的较小数据集,我能够提取正在解析的数组的完整结构。我不得不使用一个较小的数据集,因为 print_r() 有一个它返回的行缓冲区,之后它会被切断。我确信有办法解决这个问题,但我现在得到了我需要的东西,所以必须推迟进一步的实验。

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
        )

)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 2017-03-26
    相关资源
    最近更新 更多