2013-03-30 45 views
1

好的,我會再試一次,問多次,但似乎沒有讓自己清楚。

首先,我在網頁上運行了一個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的確如此,以至於我無法修改服務器端的代碼 - 從提供的內容 - 客戶端查找響應,然後才能觸發發送到服務器功能。

我能做些什麼錯誤正如你可以從谷歌鏈接數據中的HTML POST輸出中看到的,正在被轉移,我如何訪問和操作這些數據?最終目標是在數據進入SQL數據庫時解析數據,但我需要確保首先處理數據。

我的環境 - 現在在開發中我使用的是本地機器,Apache運行在Linux操作系統上的PHP。我也有mySql加載,但現在不在場。所有最新版本,昨天剛剛安裝了dev環境。

更多信息 - 我嘗試在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命令下面確實給了我的數據結構e $數據變量。現在有一個後續問題:我如何將所有我得到的數據(sender,data arrray等)轉換爲SQL表?在更新/刷新我定期創建的表格時,如何刪除數據庫中的數據?

+0

你在$ data數組上做了var_dump嗎? –

+0

我試過了,但在黑暗中拍攝了一下。如果我更改了PHP並且它不會將數據發送回客戶端,那麼我可以運行導出來測試,以便捕獲22. – MSM

+0

它不會將數據發送回客戶端,因爲任何輸出都會打破輸出的JSON。如果你正在做一個var_dump,它應該只用於調試目的。 –

回答

0

我想你已經迷惑了一下自己。您正試圖解碼未在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數據來看,$數據將一個多維數組。

執行以下操作,你應該看到你處理什麼樣的結構:

$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>'; 
} 
+0

嘗試第二個讓我這早在我的瀏覽器的控制檯窗口剛剛張貼在這裏的幾個記錄: ID:10879179
owner_id:140
業主:PLAYER1
座標:「203:166
名稱:N23_00A
得分:11580
city_type:城堡
位置:水


ID:10682590
owner_id:140
業主:PLAYER1
座標:「222:163
名稱:C23_0AC
得分:11425
city_type:城堡
位置:土地

ID:10748124
owner_id:140
店主:robwiz
座標:「220:164
名稱:C23_0AM
得分:10580
city_type:城堡
位置:土地

MSM

+0

感謝,現在我有我處理的是什麼結構的完整輸出轉儲。玩了它,所以我有一個較小的數據集,所以我可以拉一切。 $ log_to_file = print_r($ _ POST,$ return = true); $ f = fopen(「/ var/www/aix/data/member.txt」,「w」); \t \t \t \t \t fwrite($ f,$ log_to_file); \t \t \t \t \t fclose($ f); \t \t \t \t \t echo $ log_to_file; – MSM

0

如果我理解你的問題的權利,你不能讀取$ _POST []。你確定JavaScript正在發送正確的數據嗎?如果沒有我會使用jQuery:

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

這將發送正確的數據。如果這不是你的問題,請原諒。

+0

你是對的我無法讀取$ POST []。不過,我相當肯定jquery是好的,因爲PHP確實能夠識別數據並將成功消息發送回客戶端。我沒有太多關於javascript的文檔,因爲創作者沒有評論JavaScript中的代碼,但我會看看。 javascript設置的方式,我必須在客戶端窗口中輸入目標PHP地址,因此它是動態的。那裏沒有到PHP文件的靜態鏈接。 – MSM

0

我發現,這之後進行一些試驗工作很好

$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 
     ) 

)