【问题标题】:FLEX database will not refresh after updating database unless browser is restartedFLEX 数据库在更新数据库后不会刷新,除非重新启动浏览器
【发布时间】:2011-08-31 15:31:51
【问题描述】:

编辑 - 我已更新 mxml 代码,只显示程序运行更新所需的代码。

我是 Flex 的新手,有一个问题希望大家能帮我解决。

我已经全面研究过这个问题,大多数人说在更新或添加新记录后使用 .refresh() 方法来更新数据网格。这没有任何作用。

所以,我的问题是这样的。我有一个托管在 000webhost.com 上的 mySQL 数据库,我通过 PHP 连接,我有 1 个 mxml 文件和 2 个 php 文件(我知道我只能使用 1 个,但我正在学习,这对我来说更容易用于故障排除)。问题是无论我在数据网格上进行什么更改,更新都不会显示在数据网格上,除非我关闭 IE 并重新打开它。我可以在另一个窗口中刷新或打开页面,但更新不显示。我必须完全退出并重新启动才能显示任何更新或添加。

这是我的代码。我希望有人可以提供帮助。

这是我的 licenseTracker.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
           initialize="doSend()"
           >

<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.controls.Alert;
        import mx.controls.List;
        import mx.controls.Text;
        import mx.events.CloseEvent;
        import mx.events.ListEvent;
        import mx.rpc.events.ResultEvent;

        //Create array collection to hold data for datagrid 
        [Bindable] 
        private var datalist:ArrayCollection = new ArrayCollection;
        private var objSend:Object = new Object;                                

        //call hosted data php  
        public function doSend():void {
            xmlFromDatabase.send();
        }           

        //function for updating existing records
        public function doUpdate():void {
            objSend.updateAssetId = dgAssetId.text; 
            objSend.updateProgramData = dgProgram.text;
            objSend.updateSerialData = dgSerial.text;
            objSend.updateUserData = dgUser.text;
            objSend.updateCostData = dgCost.text;
            objSend.updateStatusData = dgStatus.text;

            updateDatabase.send(objSend);

            xmlFromDatabase.send();
            doSend();
            datalist.refresh();
        }

        protected function xmlFromDatabase_resultHandler(event:ResultEvent):void
        {
            datalist = event.result.data.row;
        }           

        private function alertUpdateClickHandler(eventObj:CloseEvent):void
        {
            if(eventObj.detail==Alert.YES)
                doUpdate();
            else
            {
                //Do Nothing
            }
        }

        private function itemClickEvent(event:ListEvent):void
        {

            //apply selected datagrid to string to textbox
            dgAssetId.text=String(event.currentTarget.selectedItem.asset_id);
            dgProgram.text=String(event.currentTarget.selectedItem.program);
            dgSerial.text=String(event.currentTarget.selectedItem.serial);
            dgUser.text=String(event.currentTarget.selectedItem.user_id);
            dgCost.text=String(event.currentTarget.selectedItem.cost);
            dgStatus.text=String(event.currentTarget.selectedItem.status_id);
        }


    ]]>
</fx:Script>


<fx:Declarations>       

<s:HTTPService url="http://mypage.com/data.php"
                id="xmlFromDatabase" 
                showBusyCursor="true" 
                result="xmlFromDatabase_resultHandler(event)"
                method="POST" />

<s:HTTPService url="http://mypage/update.php"
               id="updateDatabase"
               showBusyCursor="true"
               method="POST"
               resultFormat="text"
               result='Alert.show("Record Successfully Updated. Record May Take A Minute To Update")'
               />

</fx:Declarations>


<s:VGroup paddingLeft="20" y="10" width="1000" horizontalAlign="center">
    <s:Label width="670" height="32" color="#FF0000" fontFamily="Georgia" fontSize="24"
             text="Software License Tracker " textAlign="center"/>

    <!--Add Data grid-->
    <mx:DataGrid id="dg" x="10" y="79" width="1000" dataProvider="{datalist}"
                 editable="false" itemClick="itemClickEvent(event)">
        <mx:columns>
            <mx:DataGridColumn headerText="Asset ID" dataField="asset_id" width="60"/>
            <mx:DataGridColumn headerText="Program" dataField="program" width="200"/>
            <mx:DataGridColumn headerText="Serial" dataField="serial" width="270"/>
            <mx:DataGridColumn headerText="User" dataField="user" width="125"/>
            <mx:DataGridColumn headerText="Cost" dataField="cost" width="50"/>
            <mx:DataGridColumn headerText="Status" dataField="description" width="190" />               
        </mx:columns>
    </mx:DataGrid>

</s:VGroup>

<!--Panel for adding new entries into datagrid-->
<s:Panel id="addFrame" x="10" y="263" width="443" height="210"
         textAlign="left" title="Add/Edit Record">

    <s:Label x="60" y="10" width="191" id="dgAssetId" />
    <s:TextInput x="60" y="30" width="191" id="dgProgram" />
    <s:TextInput x="60" y="58" width="191" id="dgSerial"/>
    <s:TextInput  x="60" y="84" width="191" id="dgUser" />
    <s:TextInput x="60" y="112" width="191" id="dgCost"/>
    <s:TextInput id="dgStatus" x="60" y="142" width="191"/>

    <s:Label x="6" y="10" text="Asset ID"/>
    <s:Label x="6" y="35" text="Program"/>
    <s:Label x="6" y="62" text="Serial"/>
    <s:Label x="6" y="89" text="User"/>
    <s:Label x="6" y="117" text="Cost"/>        
    <s:Label x="6" y="147" text="Status"/>      

    <s:Button id="changeSubmit" x="312" y="33" label="Update" click='Alert.show("Are you sure you want to update the selected record?", "Update Record", 3, this, alertUpdateClickHandler);'/>


</s:Panel>

</s:Application>

我的 data.php 文件从服务器请求数据:

<?php


//SQL Connection Info - update with your database, username & password

$host  = "hostsite";
$username = "username";
$password = "password";
$db_name = "database";

$mysql_connection = mysql_connect($host, $username, $password);
mysql_select_db($db_name);

//Change this query as you wish for single or multiple records
$result = mysql_query("SELECT a.asset_id, a.program, a.serial, u.user_id, concat(u.first_name ,' ', u.last_name) as user, a.cost, s.description, s.status_id
FROM assets a
JOIN status s ON a.status = s.status_id
JOIN users u ON a.user_id = u.user_id
order by 1
");  


//Get the number of rows
$num_row = mysql_num_rows($result);

//Start the output of XML
echo '<?xml version="1.0" encoding="iso-8859-1"?>';
echo "<data>";
echo '<num>' .$num_row. '</num>';
if (!$result) {
   die('Query failed: ' . mysql_error());
}    
/* get column metadata - column name -------------------------------------------------*/
        $i = 0;
        while ($i < mysql_num_fields($result)) {
              $meta = mysql_fetch_field($result, $i);
            $ColumnNames[] = $meta->name;                      //place col name into array
            $i++;
        }
$specialchar = array("&",">","<");                                         //special characters
$specialcharReplace = array("&amp;","&gt;","&lt;");            //replacement
/* query & convert table data and column names to xml ---------------------------*/

$w = 0;    
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
   echo "<row>";
    foreach ($line as $col_value){
        echo '<'.$ColumnNames[$w].'>';
        $col_value_strip = str_replace($specialchar, $specialcharReplace, $col_value);        
        echo $col_value_strip;
    echo '</'.$ColumnNames[$w].'>';
    if($w == ($i - 1)) { $w = 0; }
    else { $w++; }
   }
    echo "</row>";
}
if($num_row  == "1"){
     echo '<row></row>';
}
echo "</data>";
mysql_free_result($result);
mysql_close(); 
?>

这是我的 update.php

//SQL Connection Info - update with your database, username & password

$host  = "hostsite";
$username = "username";
$password = "password";
$db_name = "database";

$mysql_connection = mysql_connect($host, $username, $password);
mysql_select_db($db_name);


$id = $_POST["updateAssetId"];
$program = $_POST["updateProgramData"];
$serial = $_POST["updateSerialData"];
$user = $_POST["updateUserData"];
$cost = $_POST["updateCostData"];
$status = $_POST["updateStatusData"];

$query = "UPDATE `database`.`assets` SET 
`program` = '$program',
`serial` = '$serial',
`user_id` = '$user',
`cost` = '$cost',
`status` = '$status'
WHERE `asset_id` = '$id'"; 

if ( !mysql_query($query, $mysql_connection) ){
      die('ERROR: '. mysql_error() );
}
/* echo "id: " . $id;
echo "Program: " . $program;
echo "Serial: " . $serial;
echo "User: " . $user;
echo "Cost: " . $cost;
echo "Status: " . $status; */


echo "UPDATE SUCCESSFUL, 1 Record Updated";

mysql_close(); 



?>

我还有其他用于插入和其他功能的 php 文件,但解决此问题应该不需要它们。

【问题讨论】:

  • 如需说明;集合对象的 refresh() 方法——例如 Arraycollection 将更新使用集合作为其 dataProvider 的 DataGrid。但是,这与数据库更新没有直接关系。如果您需要更多帮助或细节,您真的应该考虑将代码压缩到最低限度来演示问题;这个网站上的许多人不想转换数百行代码。
  • 我缩短了代码。我希望这有帮助。谢谢
  • 在 Flex 代码中,您调用 refresh() 时并未实际更改 dataList 中的任何内容。
  • 我将文本框中的项目发送到数据库,然后刷新。我在“datalist.refresh()”之前调用“updateDatabase.send(objSend)”。我错过了什么吗?数据库确实得到了更新,但数据网格在不重新启动浏览器的情况下不会更新
  • 我添加了一个正式的答案。我怀疑——只是在这里猜测——你对同步和异步调用的工作方式感到困惑。

标签: php mysql database apache-flex refresh


【解决方案1】:

您似乎混淆了同步代码和异步代码的区别。从您的代码中获取这些行

        updateDatabase.send(objSend);
        xmlFromDatabase.send();
        doSend();
        datalist.refresh();

首先它调用 updateDatabase.send()。这会对您的服务发出远程请求。
然后它调用 xmlFromDatabase.send() 这也会向您的服务发出远程请求。

这两个都是异步调用。因此,在返回 updateDatabase 调用的结果之前触发了 xmlFromDatabase 调用。

然后你调用 dataList.refresh();本质上什么都不做,因为 dataList 还没有改变。

然后在某个时候,您的服务将返回。无法保证服务返回值的顺序。更新数据库结果处理程序只会显示一个警报。 xmlFromDatabase 结果处理程序将更新 dataList。

我猜你的 xmlFromDatabase 处理程序是在 updateDatabase 处理程序之前返回的,因此数据网格永远不会用新的/更新的数据更新,因为它永远不会获得新的或更新的数据。

xmlFromDatabase.send() 调用移至updateDatabase 结果处理程序,我怀疑您会看到不同的结果。

【讨论】:

  • 我将 xmlFromDatabase.send() 移至 updateDatabase 结果处理程序,但没有任何改变。仍然不刷新数据。重启浏览器仍然是查看更新的唯一方法。
  • 您是否检查过返回的数据以确保您获得的数据与当前网格中的数据不同?
  • 是的。数据库中的数据正在更新,但应用程序会忽略数据更改,除非重新启动。例如,我将使用程序进行更新,然后在 SQL 中查询数据库以验证更改。然后我将按 F5 刷新应用程序,更改不会显示。我必须完全退出 IE 并重新打开它才能看到变化。
  • 我没有问数据库是否正在更新;我询问 Flex 应用程序是否正在接收更新的数据。您是否使用过诸如 Flash Builder Network Monitor [或 ServiceCapture 或 Charles] 之类的工具来查看发送回 Flex 应用程序的数据包?您是否在调试模式下运行代码以查看更改 dataList 时的更改?
  • 我刚刚运行了服务捕获,并在第一次运行程序时加载并调用了 data.php。当我点击更新时 update.php 运行但 data.php 不再被调用。然后我按 F5 刷新。程序重新加载,但它不再调用 data.php。我不知道为什么它拒绝再次调用 data.php。
猜你喜欢
  • 1970-01-01
  • 2016-09-14
  • 2016-07-25
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
相关资源
最近更新 更多