2017-04-12 51 views
0

我最近升級到了php 5.6和amfphp 2.2.2,我試圖修改數據在幾年前寫的Actionscipt 3動畫中的處理方式(我避開與AS3一起工作很長一段時間,所以這可能是問題的一部分)。在Amfphp,Actionscript 3數據集成中消失的子陣列

amfphp站點(Silex實驗室)說簡單地使用PDO爲您的數據和AS3和amfphp將妥善處理它,但是這不起作用。

AS3「Responder」類處理來自amfphp的傳入數據,它不再使用「responds.serverInfo.initialData」。因此AS3不能再像使用amfphp 1.9一樣處理數據。

所以我寫了一個腳本來解析數據。我顯然不明白amfphp爲AS3提供的數據對象的結構,但是我能夠從對象中提取數據並將其存儲在數組中。

我可以跟蹤AS3腳本中三重循環中的數據,但在循環之外,子陣列是未定義的。

我必須在AS3中做錯了事。任何人都可以看到它是什麼?

的PHP:

<?php 
function getConnection() { 
    return new PDO('mysql:host=localhost;dbname=db-name', 'root', '', 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 
} 

function getData() { 
    $pdo = getConnection(); 
    $tsql = "SELECT col0, col1, col2, col3, col4, col5, col6, col7 
      FROM somedata ORDER BY index_num ASC"; 

    $stmt = $pdo->prepare($tsql); 
    $stmt->execute(); 
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC); 
    return $results; 
} 

>

的AS3:

 public class GetSomeData extends Sprite { 
    private var gw:NetConnection = new NetConnection(); 
    private var getRes:Responder = new Responder(onResult, onFault); 
    private var someData:Array = new Array(); 
    private var colList:Array = new Array(); 

    public function GetSomeData() {} 

    public function refreshSomeData():void { 
     gw.connect("http://localhost/Amfphp/");   
     gw.call("GetSomeData.getData", getRes); 
    } 


    private function onResult(responds:Object):void { 
     /****** THIS IS OUTDATED AS OF amfphp 2.x *******/ 
     //responds is an arrayCollection which includes .serverInfo.initialData 
     //someData = responds.serverInfo.initialData; 

     //this is because amfphp returns the columns in the SELECT statement out of order 
     colList = ["col0", "col1", "col2", "col3", "col4", "col5", "col6", "col7"]; 

     for (var j:uint=0; j < colList.length; j++) { 
      for (var k:uint=0; k < responds.length; k++) { 
        for(var x in responds[k]){//put columns in correct order 
         if (x.toString() == colList[j]){ 
          someData[k] = new Array(); 
          someData[k][j] = responds[k][x]; 
          //this trace reports all of the data correctly 
          trace(someData[k][j].length);// 
         } 
        } 
      } 
     } 

     trace(someData.length);//49 
     trace(someData[0].length);//8 
     trace(someData[0][0].length);//undefined 

    } 
} 
+0

似乎像Charles Proxy這樣的數據包嗅探器會給你更多關於Amfphp返回到你的AS3的信息:https:// www。silexlabs.org/amfphp/documentation/using-a-packet-sniffer/ –

+0

我總是試圖自己發現amfphp在做什麼,我錯過了你的評論。好的建議,但。 – fuey

回答

0

我能得到我所有的工作AS3動畫,我想分享我發現了什麼關於使用PHP 5.6.2與Amfphp 2.2.2和AS3。我認爲我的AS3代碼看起來過分,但經過3天的努力之後,這是我能想到的最好的,並且它工作。

我的主要目標是將數據數組的結構恢復到當我使用php 5.2,amfphp 1.9和mysql_query()時的狀態。

Amfphp調用GetSomeData.php中的getData()函數,該函數顯然使用其SELECT語句。但是,Amfphp將數據以無序狀態返回給Actionscript,而不是按照SELECT語句中指定的順序。這種紊亂的狀態不是按照字母順序排列的列名,也不是按照最小字段大小排序。它似乎是隨機的。

但是,Amfphp確實以SELECT順序返回了列名getColumns()中的SELECTed。所以我使用getColumns()(在Actionscript中)的結果將getData()結果按我需要的順序排列。

下面是現在的工作的PHP(是的,我知道有沒有錯誤檢查,將有晚一點):

<?php 
    class GetSomeData{ 
     public static function getConnection() { 
      return new PDO('mysql:host=localhost;dbname=exampleDB', 'root', '' 
     } 

     function getColumns() { 
      $pdo = getConnection(); 
      $sql = "SELECT COLUMN_NAME 
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_SCHEMA='exampleDB' 
        AND TABLE_NAME='sometable'"; 

      $stmt = $pdo->prepare($sql); 
      $stmt->execute(); 
      $results = $stmt->fetchAll(PDO::FETCH_ASSOC); 
      return $results; 
     } 

     function getData() { 
      $pdo = getConnection(); 
      $tsql = "SELECT col1, col2, col3, col4, col5, col6, col7 
        FROM sometable"; 
      $stmt = $pdo->prepare($tsql); 
      $stmt->execute(); 
      $results = $stmt->fetchAll(PDO::FETCH_ASSOC); 
      return $results; 
     } 
    } 
?> 

如果從這個腳本刪除「類GetSomeData」和「公共靜態」並在getColumns()中使用print_r($ results)並從網頁運行它,您將以SELECT順序看到列: Array([0] => Array([col1] => 1.01 [col2] => 1.23 [COL3] => 2.23 [COL4] => 1.31 [COL5] => 2.44 [COL6] => 1.33 [COL7] => 1.76))

而這裏的AS3:

package { 
    import flash.display.Sprite; 
    import flash.events.*; 
    import flash.net.*; 

    public class GetStrokeData extends Sprite { 
     private var gw:NetConnection = new NetConnection(); 
     private var getRes:Responder = new Responder(onResult, onFault); 

     private var someStrings:Array = new Array(); 
     private var someData:Array = new Array(); 
     private var colNames:Array = new Array(); 
     private var arraysLoaded:Boolean = false; 

     public function GetSomeData() {} 

     public function refreshData():void { 
      if(colNames[0] == undefined){ 
       gw.connect("/Amfphp/");   
       gw.call("GetSomeData.getColumns", getRes); 
      } else { 
       gw.connect("/Amfphp/");   
       gw.call("GetSomeData.getData", getRes); 
      } 
     } 

     public function loadArrays():void { 
      for(var i:uint = 0; i < someData.length; i++){ 
       someStrings[i] = new Array(); 

       //in some cases I had to use .toString().split(",") to get my data 
       //into the same state that it was in when I was using 
       //mysql_query with amfphp 1.9 
       someStrings[i][0] = someData[i][0].toString().split(","); 
       someStrings[i][1] = someData[i][1].toString().split(","); 
       someStrings[i][2] = someData[i][2].toString().split(","); 
       someStrings[i][3] = someData[i][3].toString().split(","); 
       someStrings[i][4] = someData[i][4].toString().split(","); 
       someStrings[i][5] = someData[i][5].toString().split(","); 
       someStrings[i][6] = someData[i][6].toString().split(","); 
       someStrings[i][7] = someData[i][7].toString().split(","); 

       if(i == someData.length - 1){ 
        arraysLoaded = true; 
       } 
      } 
     } 

     private function onResult(responds:Object):void { 
      //load column names from php getColumns() 
      if(colNames[0] == undefined){ 
       var i:uint=0; 
       for (var j:uint=0; j < responds.length; j++) { 
        for(var y in responds[j]){ 
         colNames[i++] = responds[j][y]; 
        } 
        if(j == responds.length - 1){ 
         refreshData(); 
        } 
       } 
      } else { 
       //load someData with arrays 
       for (var k:uint=0; k < responds.length; k++) { 
        someData[k] = new Array(); 
       } 

       //load data from php getData() and 
       //turn amfphp disordered associative array into ordered 
       //indexed array 
       for (var m:uint=0; m < responds.length; m++) { 
        for (var n:uint=0; n < colNames.length; n++) { 
         for(var x in responds[m]){ 

          //ensure that column name in responds is next in colNames 
          if (x.toString() == colNames[n]){ 
           someData[m][n] = new Array(responds[m][x]); 
          } 
         } 

        } 

        if(m == responds.length - 1){ 
         loadArrays(); 
        } 
       } 
      } 
     } 

    } 
}