amfphp传值 对象
一直在从事j2EE的开发,看着身边的人都在RIA的开发与应用上有了一点小成绩,没办法现在也开始flex的研究了!
我在写一个小程序时,发现flex通过amfphp传递VO对象到php并插入到mysql数据库时,插入成功却没有数据,只有自增长列ID,于是调试发现,VO对象在从flex到amfphp时数据没有丢失,但是到了php的后,用php对应的VO对象来接收并通过构造sql语句直接插入时,数据就为空,分析发现原来自己没有对传递过来的对象进行转换!转换后就成功了!这个是需要flex 与php开发初学者需要注意的!
我在写一个小程序时,发现flex通过amfphp传递VO对象到php并插入到mysql数据库时,插入成功却没有数据,只有自增长列ID,于是调试发现,VO对象在从flex到amfphp时数据没有丢失,但是到了php的后,用php对应的VO对象来接收并通过构造sql语句直接插入时,数据就为空,分析发现原来自己没有对传递过来的对象进行转换!转换后就成功了!这个是需要flex 与php开发初学者需要注意的!
主要原因是:php5对flex客户端的传递过来的自定义类型VO对象没有自动转换成服务器的自定义类型VO对象,需要手动实现它
1.在flex客户端建一个Message的AS3类。
该类有三个属性。
[RemoteClass(alias="")]元标签用来注册该类,服务器就可以根据注册名来查找对应的服务器类tutorials.Message。该元标签必须要有,但是别名alias可以任意,不过建议写成完整的限定名。
- package com.model.vo
- {
- [RemoteClass(alias="tutorials.Message")]
- [Bindable]
- public class Message
- {
- public var messageID:int;
- public var messageTitle:String;
- public var messageContent:String;
- }
- }
package com.model.vo { [RemoteClass(alias="tutorials.Message")] [Bindable] public class Message { public var messageID:int; public var messageTitle:String; public var messageContent:String; } }
2.php服务器端对应名为Message的PHP类。
该类也有三个属性与 flex端的Message类对应。
该类中有个属性$_explicitType用来和客户端的类对应起来。
如果你使用的版本是PHP5,那么这个属性其实是多余的。
- class Message {
- public $messageID;
- public $messageTitle;
- public $messageContent;
- //如果是php5不需要
- //public $_explicitType = "com.model.vo.Message";
- function currentVO($robject){
- $keys=array_keys($robject);
- foreach($keys as $me){
- $this->$me=$robject[$me];
- }
- }
- }
class Message { public $messageID; public $messageTitle; public $messageContent; //如果是php5不需要 //public $_explicitType = "com.model.vo.Message"; function currentVO($robject){ $keys=array_keys($robject); foreach($keys as $me){ $this->$me=$robject[$me]; } } }
3.在AMFPHP的services/tutorials目录下建立一个服务类MessageService 。
该类有一个方法addMessage,用来接受客户端的VO对象,并且返回一个布尔值。遗憾的是,客户端的自定义类型没有自动转换成服务器的自定义类型,我们需要手动实现它,PHP的VO对象类Message有个currentVO方法就是为了达到这个目的。$dbsql是一个数据库操作对象,有一个addMessage() 的方法,用来接受sql语句并插入对象数据。
- require_once 'Message.php';
- require_once 'conn.inc.php';
- class MessageService {
- public function addMessage($message){
- $mes=new Message();
- $mes->currentVO($message);//没做什么判断直接写了,哈哈,省点力!
- $sql="insert into message (messageTitle,messageContent) values('".$mes->messageTitle."','".$mes->messageContent.")";
- $dbsql=new DBSql();
- $result=$dbsql->addMessage($sql);
- if($result>0)
- return true;
- else
- return false;
- }
- }
require_once 'Message.php'; require_once 'conn.inc.php'; class MessageService { public function addMessage($message){ $mes=new Message(); $mes->currentVO($message);//没做什么判断直接写了,哈哈,省点力! $sql="insert into message (messageTitle,messageContent) values('".$mes->messageTitle."','".$mes->messageContent.")"; $dbsql=new DBSql(); $result=$dbsql->addMessage($sql); if($result>0) return true; else return false; } }
这样,从flex客户端的VO对象,通过MessageService的addMessage()方法就能插入数据库了