2011-09-28 142 views
0

嘿所以我最近开始使用Flash Builder 4.5,所以在构建移动应用程序时,特别是在将应用程序连接到后端服务器时,我面临着许多愚蠢的问题。使用PHP和MySQL填充Flex 4.5 DataGrid

我目前工作的东西应该更新一个DataGrid,这个数据是从MySQL数据库中检索的。

该代码在浏览器上清晰显示数据,但数据网格未更新。相反,它会抛出以下错误。

TypeError: Error #1034: Type Coercion failed: cannot convert mx.utils::[email protected] to mx.collections.IList. 
    at views::connectPHPHomeView/userRequest_resultHandler()[C:\Documents and Settings\s4710935\Adobe Flash Builder 4.5\connectPHP\src\views\connectPHPHomeView.mxml:17] 
    at views::connectPHPHomeView/__userRequest_result()[C:\Documents and Settings\s4710935\Adobe Flash Builder 4.5\connectPHP\src\views\connectPHPHomeView.mxml:29] 
    at flash.events::EventDispatcher/dispatchEventFunction() 
    at flash.events::EventDispatcher/dispatchEvent() 
    at HTTPOperation/http://www.adobe.com/2006/flex/mx/internal::dispatchRpcEvent()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\http\HTTPService.as:993] 
    at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::resultHandler()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:318] 
    at mx.rpc::Responder/result()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\Responder.as:56] 
    at mx.rpc::AsyncRequest/acknowledge()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:84] 
    at DirectHTTPMessageResponder/completeHandler()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\messaging\channels\DirectHTTPChannel.as:451] 
    at flash.events::EventDispatcher/dispatchEventFunction() 
    at flash.events::EventDispatcher/dispatchEvent() 
    at flash.net::URLLoader/onComplete() 

有人可以引导我通过这个吗?

编辑

这里是PHP代码:

<?php 

    // ----------------------------------------------------------------------------- 
    // Initialization of the sql server 
    // ----------------------------------------------------------------------------- 


    // hostname or ip of server (for local testing, localhost should work) 
    $dbServer='localhost'; 

    // username and password to log onto db server 
    $dbUser='root'; 
    $dbPass='password'; 

    // name of database 
    $dbName='test'; 

    mysql_connect("$dbServer", "$dbUser", "$dbPass") or die(mysql_error()); 
    mysql_select_db("$dbName") or die(mysql_error()); 


    //Creating the table and inserting the values in it... 



    mysql_query("CREATE TABLE IF NOT EXISTS mariah_transaction_log(
    id INT NOT NULL AUTO_INCREMENT, 
     PRIMARY KEY(id), 
     date DATE, 
     details VARCHAR(150), 
     debit DOUBLE, 
     credit DOUBLE, 
     balance DOUBLE)") 
    or die(mysql_error()); 


    mysql_query("INSERT INTO mariah_transaction_log 
     (date, details, debit, credit, balance) VALUES('2011-08-08','Zellers','12.56','0.00','12343.54') ") 
    or die(mysql_error()); 


    $username = $_GET["username"]; 

    // $namedGreeting = mysql_query("SELECT * FROM customer_list WHERE username='$username'") or die(mysql_error()); 
    // $row = mysql_fetch_array($namedGreeting); 

    // echo "Hello ".$row['name']."!"; 


    $Query = "SELECT * from mariah_transaction_log"; 
    $Result = mysql_query($Query); 

    $Return = "<users>"; 

    while ($User = mysql_fetch_object($Result)) 
    { 
    $Return .= "<user><date>".$User->date."</date><details>". 
       $User->details."</details><debit>". 
       $User->debit."</debit><credit>". 
       $User->credit."</credit><balance>". 
       $User->balance."</balance></user>"; 
    } 
    $Return .= "</users>"; 
    mysql_free_result($Result); 
    print ($Return) 



    ?> 

这里是MXML和AS3部分我的代码:注意刚刚添加示例XML结果为了简单起见

<?xml version="1.0" encoding="utf-8"?> 
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView"> 

    <fx:Script> 
     <![CDATA[ 
      import mx.collections.IList; 
      import mx.collections.XMLListCollection; 
      import mx.rpc.events.ResultEvent; 






      protected function callService(event:ResultEvent):void 
      { 
       var results:XML = sampleResult; 
       var resultsList:XMLListCollection = results.users as XMLListCollection; 
       showTransactions_dg.dataProvider = resultsList; 


      } 

     ]]> 
    </fx:Script> 


    <fx:Declarations> 


     <fx:XML id="sampleResult" xmlns=""> 
      <users> 
       <user> 
        <date>2011-08-07</date> 
        <details>Camello Shop</details> 
        <debit>67.32</debit> 
        <credit>0.00</credit> 
        <balance>1233.42</balance> 
       </user> 

       <user> 
        <date>2011-08-07</date> 
        <details>Deposit</details> 
        <debit>0.00</debit> 
        <credit>600.00</credit> 
        <balance>1833.42</balance> 
       </user> 

      </users> 



     </fx:XML> 

     <s:HTTPService id="userRequest" url="{phpFile}" 
         method="GET" resultFormat="e4x" 
         result="callService(event)" useProxy="false"> 
      <s:request xmlns=""> 
       <username>{username_txt.text}</username> 
      </s:request> 
     </s:HTTPService> 


     <!-- The link to the php file --> 
     <fx:String id="phpFile">http://localhost:8080/connectPHP/phpFile.php </fx:String>  

    </fx:Declarations> 


    <s:TextInput id="username_txt" x="11" y="78"/> 
    <s:Label x="11" y="55" text="Username"/> 
    <s:Button id="getData_button" x="10" y="122" label="Done?" 
       click="userRequest.send()"/> 
    <s:Label id="showName_lbl" x="13" y="173" text="show name here"/> 


    <s:DataGrid id="showTransactions_dg" x="10" y="218" width="300" height="86"> 
     <s:columns> 
      <s:ArrayCollection> 
       <s:GridColumn dataField="date" headerText="Date" /> 
       <s:GridColumn dataField="details" headerText="Details"/> 
       <s:GridColumn dataField="debit" headerText="Debit"/> 
       <s:GridColumn dataField="credit" headerText="Credit"/> 
       <s:GridColumn dataField="balance" headerText="Balance"/> 

      </s:ArrayCollection> 
     </s:columns> 
    </s:DataGrid> 
    <s:Label id="testLbl" x="13" y="334" width="266" height="90" text="Label"/> 




</s:View> 
+0

由于Flex中发生错误,因此应该在问题中包含MXML/ActionScript代码。 –

+0

@LarsBlåsjö对不起,完全跳过了我的脑海!我现在已经添加了MXML组件... – BurninatorDor

回答

1

spark DataGrid中,dataProvider必须实现iList接口。看起来您正在返回XML并将其存储在通用对象中。通用对象不支持IList接口。

而不是绑定到DataGrid的dataProvider远程调用的结果,你应该添加一个结果处理到的HTTPService:

<s:HTTPService id="userRequest" url="{phpFile}" 
       method="GET" resultFormat="object" useProxy="false" result="onResult(event)"> 

然后投你的数据结果处理的东西,实现IList。在这种情况下,我推荐一个XMLListCollection。

protected function onResult(event:ResultEvent):void{ 
var resultsXML : XML = event.results as XML 
showTransactions_dg.dataProvider = new XMLListCollection(resultsXML); 
} 

这个代码写在浏览器中可能不是完美的。

+0

嘿,这个onResult函数显示错误....它说“类型 1067:隐式强制将XML类型的值强加到不相关的类型XMLList”。你能解释为什么吗? – BurninatorDor

+0

我认为这个错误很自我解释。 XML和XMLList不是一回事。您必须将XML转换为XMLList,然后使用该XMLList变量作为XMLListCollection的源。 – JeffryHouser

+0

所以我尝试使用这一行而不是上面的行:“var results:XMLList = event.result as XMLList;”幸运的是,它不再显示任何错误,但不幸的是DataGrid也没有显示任何值。就像我说过的,我对flex有点新兴,那么你介意如何解释如何从XML转换到XMLList? – BurninatorDor