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

Já sabemos como popular um datagrid usando o AMFPHP, agora veremos como inserir, atualizar e excluir registros do banco de dados usando o AMFPHP. Usaremos o mesmo arquivo do artigo anterior.

Não precisaremos mudar em nada a nossa estrutura de banco de dados. Modificaremos somente a classe em PHP e o FLA.

A nossa classe em PHP esta assim:

  1. < ?php
  2. class query{
  3. var $host = "localhost";
  4. var $user = 'root';
  5. var $database = 'seubanco';
  6. var $pass = 'suasenha';
  7. function query(){
  8. $this->methodTable = array(
  9. "get_user"=>array(
  10. "description"=>"populando nosso datagrid",
  11. "access�=>"remote�
  12. )
  13. );
  14. $this->conexao = mysql_pconnect($this->host,$this->user,$this->pass);
  15. mysql_select_db($this->database);
  16. }
  17. function get_user(){
  18. $query = mysql_query("SELECT * FROM usuarios");
  19. if (!mysql_error()) {
  20. return $query;
  21. }else {
  22. return mysql_error();
  23. }
  24. }
  25. }?>

adicionaremos os metodos para inserir, atualizar e excluir os registros do banco de dados, respectivamente setRecords, updateRecords e delRecords.
É preciso adiciona-los na função construtora, na variável methodTable.
Nossa classe ficou assim:

  1. < ?php
  2.     class query{
  3.    var $host = "localhost";
  4.    var $user = 'root';
  5.    var $database = 'seubanco';
  6.    var $pass = 'suasenha';
  7.  
  8.     function query(){
  9.         $this->methodTable = array(
  10.         "get_user"=>array(
  11.         "description"=>"populando nosso datagrid",
  12.         "access"=>"remote"
  13.         ),
  14.         "setRecords"=> array(
  15.         "description"=> "Insere registros no banco de dados",
  16.         "access"=> "remote",
  17.         "arguments"=>array ("nome","email","telefone")
  18.         ),
  19.         "updateRecords"=> array(
  20.         "description"=> "Atualiza os registros do banco de dados",
  21.         "access"=> "remote",
  22.         "arguments"=>array ("id","nome","email","telefone")
  23.         ),
  24.         "delRecords"=> array(
  25.         "description"=> "exclui os registros do banco de dados",
  26.         "access"=> "remote",
  27.         "arguments"=>array ("id")
  28.         )
  29.         );
  30.         $this->conexao = mysql_pconnect($this->host,$this->user,$this->pass);
  31.         mysql_select_db($this->database);
  32.     }
  33.  
  34.     function get_user(){
  35.         $query = mysql_query("SELECT * FROM usuarios");
  36.         if (!mysql_error()) {
  37.             return $query;
  38.         }else {
  39.             return mysql_error();
  40.         }
  41.     }
  42.     function setRecords($nome,$email,$telefone){
  43.         $query = mysql_query("INSERT INTO usuarios (nome,email,telefone) VALUES ('$nome','$email','$telefone')");
  44.         if (!mysql_error()) {
  45.             return "sucesso";
  46.         }else{
  47.             return "error";
  48.         }
  49.     }
  50.     function updateRecords($id,$nome,$email,$telefone){
  51.         $query = mysql_query("UPDATE usuarios SET nome = '$nome',email = '$email', telefone = '$telefone' WHERE id = '$id'");
  52.         if (!mysql_error()) {
  53.             return "sucesso";
  54.         }else {
  55.             return "error";
  56.         }
  57.     }
  58.     function delRecords($id){
  59.         $query = mysql_query("DELETE FROM usuarios WHERE id = '$id' LIMIT 1");
  60.         if (!mysql_error()) {
  61.             return "sucesso";
  62.         }else{
  63.             return "error";
  64.         }
  65.     }
  66. }
  67. ?>

Agora vamos ao nosso arquivo em Flash, lembrando que ele somente conterá os códigos, os componentes (gerados dinamicamente via action script) deverão estar na biblioteca do filme.
Criaremos dinamicamente os campos de texto e os botões, usando o método createClassObject, sendo necessário especificar o caminho do componente.
Por exemplo para criar um botão dinamicamente.

ActionScript

  1. _root.createClassObject(mx.controls.Button, "Button", 1);

Um outro meio de fazer isso seria importar as classes do componente no começo do script

ActionScript

  1. import mx.controls.Button;

e no metodo

ActionScript

  1. _root.createClassObject(Button, " Button ", 1);

O Segundo parametro será o nome da instancia do objeto criado no caso “Button�
Entendido como os componentes são criados dinamicamente, precisaremos que quando a opção do datagrid for clicada, que ela apareça nos campos de textos para serem atualizadas ou excluídas. Para isso adicionaremos um objeto ouvinte que escutara a nossa datagrid. Faremos isso dentro da função user_Result.

ActionScript

  1. var listenerObject:Object = new Object();

criando a função que responderar ao objeto ouvinte, nela pegaremos a opção que for escolhida no datagrid para preencher os campos de textos, note que o id da datagrid será armazenado numa variável para ser posteriormente usada nos metodos de atualizar e excluir as informações do banco de dados. Estamos incluindo as ações (onRelease)que serão usadas nos botões de atualizar e excluir os registros. Note que não está sendo incluída a ação do botão de inserir pois ele não dependerá da datagrid.
Quando o botão de atualizar for clicado ele mandará para o servidor os parâmetros que estiverem no campo de texto e na variável “idâ€? pelo metodo updateRecords(id, campo_nome.text, campo_email.text, campo_tel.text); (o mesmo para exclusão) e por ultimo adicionando tudo isso a datagrid com o metodo addEventListener(“change”, listenerObject);

ActionScript

  1. listenerObject.change = function(evt) {
  2. var id:Number = evt.target.selectedItem.id;
  3.         campo_nome.text = evt.target.selectedItem.nome;
  4.         campo_email.text = evt.target.selectedItem.email;
  5.         campo_tel.text = evt.target.selectedItem.telefone;
  6.         trace(evt.target.selectedItem.id);
  7.         bot_update.onRelease = function() {
  8.             var pcs:PendingCall = conexao.updateRecords(id, campo_nome.text, campo_email.text, campo_tel.text);
  9.             pcs.responder = new RelayResponder(_root, "updateRecords_Result", "updateRecords_Fault");
  10.         };
  11.         bot_excluir.onRelease = function() {
  12.             trace(id);
  13.             var pcs:PendingCall = conexao.delRecords(id);
  14.             pcs.responder = new RelayResponder(_root, "delRecords_Result", "delRecords_Fault");
  15.         };
  16.     };
  17. grid.addEventListener("change", listenerObject);

Usaremos também o componente “Alert� para confirmar que a inserção, atualização e exclusão de um registro foi feita com sucesso. Ela será chamada dentro das funções setRecords_Result, updateRecords_Result e delRecords_Result, sendo que assim que for clicado o botão ok do alert, será invocado o método update_Dg que atualizará os dados da nossa datagrid.

ActionScript

  1. var dialog_obj:Object = Alert.show("Sucess", "Sucess!!!", Alert.OK, null, update_Dg);

O código completo:

ActionScript

  1. //classes do Flash Remoting
  2. import mx.remoting.Service;
  3. import mx.services.Log;
  4. import mx.rpc.RelayResponder;
  5. import mx.rpc.FaultEvent;
  6. import mx.remoting.DataGlue;
  7. import mx.rpc.ResultEvent;
  8. import mx.remoting.PendingCall;
  9. import mx.remoting.RecordSet;
  10. import mx.controls.Alert;
  11. //criando a conexão do flash remoting para o AMFPHP
  12. //coloque o endereço do seu servidor e a sua classe
  13. var conexao = new Service("http://localhost/flashservices/gateway.php", new Log(), "query", null, null);
  14. //chamando o metodo get_user()
  15. var pcs:PendingCall = conexao.get_user();
  16. pcs.responder = new RelayResponder(this, "user_Result", "user_Fault");
  17. function user_Result(res:ResultEvent) {
  18.     var grid = _root.createClassObject(mx.controls.DataGrid, "dg", 1, {_x:200, _y:0});
  19.     grid.setSize(350, 300);
  20.     grid.dataProvider = res.result;
  21.     var total = res.result.length;
  22.     var listenerObject:Object = new Object();
  23.     listenerObject.change = function(evt) {
  24.         var id:Number = evt.target.selectedItem.id;
  25.         campo_nome.text = evt.target.selectedItem.nome;
  26.         campo_email.text = evt.target.selectedItem.email;
  27.         campo_tel.text = evt.target.selectedItem.telefone;
  28.         trace(evt.target.selectedItem.id);
  29.         bot_update.onRelease = function() {
  30.             var pcs:PendingCall = conexao.updateRecords(id, campo_nome.text, campo_email.text, campo_tel.text);
  31.             pcs.responder = new RelayResponder(_root, "updateRecords_Result", "updateRecords_Fault");
  32.         };
  33.         bot_excluir.onRelease = function() {
  34.             var pcs:PendingCall = conexao.delRecords(id);
  35.             pcs.responder = new RelayResponder(_root, "delRecords_Result", "delRecords_Fault");
  36.         };
  37.     };
  38.     grid.addEventListener("change", listenerObject);
  39. }
  40. function user_Fault(fault:FaultEvent) {
  41.     trace(fault.fault.faultstring);
  42. }
  43. function setRecords_Result(res:ResultEvent) {
  44.     trace(res.result);
  45.     var dialog_obj:Object = Alert.show("Sucess", "Sucess!!!", Alert.OK, null, update_Dg);
  46. }
  47. function setRecords_Fault(fault:FaultEvent) {
  48.     trace(fault.fault.faultstring);
  49. }
  50. function updateRecords_Result(res:ResultEvent) {
  51.     trace(res.result);
  52.     var dialog_obj:Object = Alert.show("Sucess", "Sucess!!!", Alert.OK, null, update_Dg);
  53. }
  54. function updateRecords_Fault(fault:FaultEvent) {
  55.     trace(fault.fault.faultstring);
  56. }
  57. function delRecords_Result(res:ResultEvent) {
  58.     trace(res.result);
  59.     var dialog_obj:Object = Alert.show("Sucess", "Sucess!!!", Alert.OK, null, update_Dg);
  60. }
  61. function delRecords_Fault(fault:FaultEvent) {
  62.     trace(fault.fault.faultstring);
  63. }
  64. var label_nome = _root.createClassObject(mx.controls.Label, "label_nome", _root.getNextHighestDepth(), {_x:2, _y:5, text:"Nome:"});
  65. var campo_nome = _root.createClassObject(mx.controls.TextInput, "campo_nome", _root.getNextHighestDepth(), {_x:60, _y:5});
  66. var label_email = _root.createClassObject(mx.controls.Label, "label_email", _root.getNextHighestDepth(), {_x:2, _y:30, text:"Email:"});
  67. var campo_email = _root.createClassObject(mx.controls.TextInput, "campo_email", _root.getNextHighestDepth(), {_x:60, _y:30});
  68. var label_tel = _root.createClassObject(mx.controls.Label, "label_tel", _root.getNextHighestDepth(), {_x:2, _y:55, text:"Telefone:"});
  69. var campo_tel = _root.createClassObject(mx.controls.TextInput, "campo_tel", _root.getNextHighestDepth(), {_x:60, _y:55});
  70. var bot_inserir:Button = _root.createClassObject(mx.controls.Button, "bot_inseir", _root.getNextHighestDepth(), {_x:2, _y:100, label:"Inserir Registros"});
  71. var bot_update:Button = _root.createClassObject(mx.controls.Button, "bot_update", _root.getNextHighestDepth(), {_x:2, _y:130, label:"Atualizar Registro"});
  72. var bot_excluir:Button = _root.createClassObject(mx.controls.Button, "bot_excluir", _root.getNextHighestDepth(), {_x:2, _y:160, label:"Excluir Registro"});
  73. bot_inserir.onRelease = function() {
  74.     var pcs:PendingCall = conexao.setRecords(campo_nome.text, campo_email.text, campo_tel.text);
  75.     pcs.responder = new RelayResponder(_root, "setRecords_Result", "setRecords_Fault");
  76. };
  77. function update_Dg():Void {
  78.     var pcs:PendingCall = conexao.get_user();
  79.     pcs.responder = new RelayResponder(_root, "user_Result", "user_Fault");
  80. }

veja a aplicação funcionando

AMFPHP
http://www.amfphp.org/

Flash Remoting
http://www.macromedia.com/devnet/flashremoting/

AMFPHP, Flash, Flash Platform, Flash Remoting, PHP, Principal, RIA

2 comments


  1. Olá Leonardo!

    Estou com algumas dúvidas! Procurei fazer de acordo com o seu tutorial, porém…

    Fiz a instalação do AMFPHP no servidor.

    Foi tudo OK!

    Quando finalizei o tutorial acima ocorreu um erro:

    – o Flash 8, 7 e 6 não reconhece alguns AS do código acima.

    O que posso ter feito de errado?

    Desde já agradeço a atenção!

    Abraços e sucesso!

  2. Olá Leonardo,
    Muito bom o seu tutorial, estudei ele para usar em um site que estou fazendo, tudo funcionol perfeitamente, mesmo com muitas adaptações que fiz. Quando o filme é rodado sosinho tudo funciona, mas em meu site o filme é carregado dentro do componente ScrollPane que esta em outro filme. Tudo funciona perfeitamente, ele inclui, exclui e atualiza os dados, porem o componente Alerte não funciona, como consequencia a função update_Dg tambem não funciona. Tentei desvincular a função update_Dg do componente Alert, mas não funcionou.
    Gostaria de uma luz para solucionar o problema.
    Muito Obrigado.
    Abraços e Sucesso!

Leave a Reply