Inserindo, editando e excluindo registros no banco de dados usando AMFPHP e FLEX 2.0

Agora que sabemos como passar argumentos do Flex para o AMFPHP, ficou bem facil adaptar o meu artigo escrito anteriormente sobre como inserir, editar e excluir registros do banco dados usando o AMFPHP com Flash e comparar como ficou a versão em FLEX 2.0 e FLASH

Na versão para Flex 2.0, o que faremos simplesmente é adicionar algumas funções para mandar os parametros para o AMFPHP e recebe-los de volta para preencher a datagrid usando basicamente esse modelo:
[as]
public function nomeFunction(arg:*):void{
var arg:Array = new Array();
gateway.call(“classe do AMFPHP.método a ser invocado no AMFPHP”,new Responder(nomeResult,onFault),arg);
}
public function nomeResult(re:*):void{
//result
}
[/as]
Ou seja, uma função para “enviar dados” e outra para “receber dados”.

Quando clicamos em alguma linha da Datagrid com id “dg”, os dados da linha devem aparecer nos campos de textos. Para pega-los faremos algo parecido como é feito no Flash.
No Flash seria o seguinte:
[as]
var listenerObject:Object = new Object();
listenerObject.change = function(evt) {
var id:Number = evt.target.selectedItem.id;
campo_nome.text = evt.target.selectedItem.nome;
campo_email.text = evt.target.selectedItem.email;
campo_tel.text = evt.target.selectedItem.telefone;
trace(evt.target.selectedItem.id);
}
dg.addEventListener(“change”, listenerObject);
[/as]
No Flex faremos assim:
[as]
< mx :TextInput id="nome" text="{dg.selectedItem.nome}"/>
< mx :TextInput id="email" text="{dg.selectedItem.email}"/>
< mx :TextInput id="telefone" text="{dg.selectedItem.telefone}"/>
[/as]
Segue a nossa classe em PHP a ser utilizada pelo AMFPHP. Lembrando que estamos utilizando o mesmo modelo de banco de dados deste artigo.
[php]
< ?php //arquivo flex.php //devera ser salvo do diretorio flashservices/services class flex{ var $host = 'localhost'; var $user = 'root'; var $database = 'banco'; var $pass = ''; function flex(){ $this->methodTable = array(
“getUsers” => array(
“description” => “Return a list of users”,
“access” => “remote”
),
“setRecords”=> array(
“description”=> “Insere registros no banco de dados”,
“access”=> “remote”,
“arguments”=>array (“nome”,”email”,”telefone”)
),
“updateRecords”=> array(
“description”=> “Atualiza os registros do banco de dados”,
“access”=> “remote”,
“arguments”=>array (“id”,”nome”,”email”,”telefone”)
),
“delRecords”=> array(
“description”=> “exclui os registros do banco de dados”,
“access”=> “remote”,
“arguments”=>array (“id”)
)
);
$this->conexao = mysql_connect($this->host,$this->user,$this->pass);
mysql_select_db($this->database);
}
function getUsers() {
$query = “SELECT id,nome,email,telefone FROM usuarios”;
$result = mysql_query($query);
while ($row = mysql_fetch_object($result)) {
$ArrayOfUsers[] = $row;
}
return($ArrayOfUsers);
}
function setRecords($arg=array()){
$nome = $arg[0];
$email = $arg[1];
$telefone = $arg[2];
$query = mysql_query(“INSERT INTO usuarios (nome,email,telefone) VALUES (‘$nome’,’$email’,’$telefone’)”);
if (!mysql_error()) {
return “sucesso”;
}else{
return “error”;
}
}
function updateRecords($arg=array()){
$id = $arg[0];
$nome = $arg[1];
$email = $arg[2];
$telefone = $arg[3];
$query = mysql_query(“UPDATE usuarios SET nome = ‘$nome’,email = ‘$email’, telefone = ‘$telefone’ WHERE id = ‘$id'”);
if (!mysql_error()) {
return “sucesso”;
}else {
return mysql_error();
}
}
function delRecords($arg=array()){
$id = $arg[0];
$query = mysql_query(“DELETE FROM usuarios WHERE id = ‘$id’ LIMIT 1”);
if (!mysql_error()) {
return “sucesso”;
}else{
return “error”;
}
}
}
?>
[/php]
Sem misterios, teste você mesmo a aplicação em Flash e em Flex

O código fonte do mxml pode ser encontrado no meu LABS

8 thoughts on “Inserindo, editando e excluindo registros no banco de dados usando AMFPHP e FLEX 2.0

  1. Alexandre

    Muito bom o artigo. Tinha tentado, sem sucesso, adaptar o seu artigo anterior para conseguir este mesmo resultado.

    Obs: porque aparece, no fim da tela, as informações do array? Dá pra ocultar isto?

    Obs2: tive que modificar no deleteRegistros, tanto no flex quanto no php, a variável id, mudando de array para int, senão não funcionava a função.

    É isso.

    Valeu!

    Alexandre.

  2. Alexandre

    Cara, desculpe estar te amolando…

    Como disse anteriormente, estou tentando adaptar o teu exemplo, incluindo novas funcionalidades, etc..

    Supondo que eu quero “duplicar” o que você fez, trabalhando com duas tabelas diferentes no bd (tabelas que possuem campos diferentes uma da outra) posso fazer algo como:

    public var dataProvider:*;
    public var dataProvider2:*;
    public var gateway:RemotingConnection;
    public var gateway2:RemotingConnection;
    public function initApplication():void{
    gateway = new RemotingConnection(“http://localhost/amfphp/gateway.php”);
    gateway.call(“flex.getDataSite”,new Responder(onResult,onFault));

    }

    public function initApplicationCat():void{
    gateway2 = new RemotingConnection(“http://localhost/amfphp/gateway.php”);
    gateway2.call(“flex.getCategorias”,new Responder(onResult2,onFault2));
    }

    public function onResult(result:*):void{
    trace(“> onResult(result) “);
    trace(result);
    dataProvider = result;
    //output.text = ObjectUtil.toString(result);
    trace(” onFault(fault) “);
    trace(fault);
    //output.text = ObjectUtil.toString(fault);
    trace(” onResult(result) “);
    trace(result);
    dataProvider2 = result;
    //output.text = ObjectUtil.toString(result);
    trace(” onFault(fault) “);
    trace(fault);
    //output.text = ObjectUtil.toString(fault);
    trace(“

  3. Leonardo França Post author

    Não seria necessario setar duas variaveis para o RemotingConnection, bastaria chamar na mesma variavel, por exemplo:

    public function initApplication():void{
    gateway = new RemotingConnection(�http://localhost/amfphp/gateway.php�);
    gateway.call(�flex.getDataSite�,new Responder(onResult,onFault));
    gateway.call(�flex.getCategorias�,new Responder(onResult2,onFault2));
    }

  4. jf.sal

    Caro Leonardo

    Muito Obrigado pelo teu post, trabalha na perfeição ando a algum tempo treinando com o post do Mike Potter mas estava incompleto, e estava com dificuldades em gravar dados na BD usando por isso HTTPservice mas agora tenho muita matéria para evoluir atravês do teu post.

    Mil vezes obrigado.

    PS.
    Qual é a forma de gravar multiplos records ao mesmo tempo, como se fosse um shoppingCart?

  5. wendel

    jf.sal, caso você esteja usando HTTPService, você pode enviar o nome dos objetos como teste[], o ‘[]’, faz o php interpretar como array.

  6. matias

    Como implemento segurança no amfphp ? ja tentei a opção Roles mas mesmo assim o metodo consegue ser acessado. obrogado

Leave a Reply