Nesse post eu falei sobre o Lumine, um framework em PHP para persistência de dados (nos moldes do Hibernate para o Java e o DB_DataObjects do PEAR).
Resolvi dar uma para em uns projetos e realmente experimentar em algo que eu precisava, e me dediquei a abandonar as querys SQL. E funcionou.
Vou, abaixo, mostrar como fazer para persistir os dados postados por um formulário numa tabela de uma base (no caso, MySQL).
Vamos supor que você tenha uma tabela no banco chamada messages com as seguintes colunas:
id – tinyint, chave-primária e autoincrement
name – varchar, 64
email – varchar, 64
msg – varchar, 512
publishDate – date
Como seguinte script, cria-se a tabela:
CREATE TABLE `messages` ( `id` tinyint(4) NOT NULL auto_increment, `name` varchar(64) NOT NULL, `email` varchar(64) NOT NULL, `msg` varchar(512) NOT NULL, `parentId` tinyint(4) NOT NULL, `publishDate` date NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
O html que contém o formulário (no caso, um formulário em que um usuário posta o nome, e-mail e uma mensagem) é bem simples e já abordei essa técnica usando a biblioteca prototype (sinta-se livre pra usar qualquer outro framework, ou outra técnica; não influencia no resultado final) em outros posts(aqui e aqui):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Upload de mensagem</title> <script src="http://www.prototypejs.org/assets/2008/1/25/prototype-1.6.0.2.js"></script> <script type="text/javascript"> function upload() { $("message").update("<img src=´loader.gif´> aguarde, enviando mensagem..."); $("form_upload").request({ onComplete: function(transport){ if(transport.responseText=="") $("form_upload").reset(); $("message").update("Sua mensagem foi enviada com sucesso... obrigado!"); } }); return false; } </script> <link href="style.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="box"> <h1>Envio de mensagem</h1> <form action="saveMsg.php" method="post" enctype="application/x-www-form-urlencoded" id="form_upload" onsubmit="return upload();"> <label for="name">nome:</label><input type="text" id="name" name="name" class="field" /><br /><br /> <label for="email">e-mail:</label><input type="text" id="email" name="email" class="field" /><br /><br /> <label for="msg">mensagem:</label><textarea id="msg" name="msg"></textarea><br /> <input type="submit" value="enviar" class="submitButton" /> <span id="message"></span> </form> <div id="msgs_area"></div> </div> </body> </html>
Agora, o passo mais importante: modelar (exemplo: http://www.hufersil.com.br/documentacao/instanciando) uma classe seguindo a estrutura da sua tabela. No arquivo Message.php eu criei a classe, extendendo a classe do Lumine, mapeando os atributos relativos à tabela.
<?php class Message extends Lumine_Base{ protected $_tablename = ´messages´; protected $_package = ´entidades´; protected function _initialize() { $this->_addField(´id´, ´id´, ´tinyint´, 4, array(´primary´ => true, ´notnull´ => true, ´autoincrement´ => true)); $this->_addField(´name´, ´name´, ´varchar´, 64, array()); $this->_addField(´email´, ´email´, ´varchar´, 64, array()); $this->_addField(´publishDate´, ´publishDate´, ´date´,null , array()); $this->_addField(´msg´, ´msg´, ´varchar´, 512, array()); $this->_addField(´parentId´, ´parentId´, ´tinyint´, 4, array(´primary´ => false, ´notnull´ => true, ´autoincrement´ => false)); } } ?>
Então, o passo final é criar o arquivo que recebe o post do formulário (no caso, saveMsg.php).
Nesse arquivo, o que fazemos: chamamos a classe Lumine.php (que vem no pacote de instalação do Lumine), configuramos a aplicação (http://www.hufersil.com.br/documentacao/lumine_conf), depois atribuímos os valores recebidos por POST a cada parâmetro enviado pelo formulário (e pegamos a dataa atual para salvar no banco) e, por final, chamamos o método insert() que faz salvar os dados na tabela do banco.
Segue o código:
<?php require "../lumine/Lumine.php"; require "lumine_config.php"; $cfg = new Lumine_Configuration( $lumineConfig ); require "Message.php"; //cria classe Message $msg = new Message; //decodifica os pareâmetros enviados, para evitar problemas com acentuaçãao foreach ($_POST as $key => $valor ){ $_POST[$key] = utf8_decode($valor); } $msg->name = $_POST["name"]; $msg->email = $_POST["email"]; $msg->msg = $_POST["msg"]; $msg->publishDate=date(DATE_RFC822); $msg->insert(); ?>
Passei batido por alguns detalhes aqui relativos à configuração, mas a documentação oficial é muito boa – e o próprio ato de configurar é algo bem simples para quem está na área de desenvolvimento.
E, olhando assim por cima, parece que há muito trabalho para configurar tudo isso para fazer apenas uma inserção no banco; mas, imaginem só configurar uma vez só, e depois acabar com todas querys de inserts, updates, selects, etc… Muito bom, aprovado!
Site oficial: http://www.hufersil.com.br/documentacao/apresentacao