segunda-feira, 27 de maio de 2013

Salvando Objeto no Banco - Parte 2

Continuando o post anterior: Salvando Objeto do Banco de Dados. Agora utilizaremos um formulário que submeterá os valores dos campos. Estes valores serão salvos no banco.

Primeiro criamos um novo arquivo, este arquivo será do uma página web do php com o nome cadastro_pessoa.php, segue código abaixo:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"$gt;
        Cadastro Pessoa
    </head>
    
        
        
</html>

Após criarmos o formulário precisamos tratar o retorno do formulário, conforme o código a seguir:

<?php
        //tratar o retorno do formulário
        if($_SERVER['REQUEST_METHOD'] == 'POST')
        {
            if(isset($_POST['salvar']))
            {
                $nome = $_POST['nome'];
                $endereco = $_POST['endereco'];
                
                $p = new pessoa(null, $nome, $endereco);
                $p->salvar();
            }
        }
?>

Não devemos esquecer de incluir a classe pessoa.php no início do arquivo cadastro_pessoa.php, conforme:

<?php
    include 'pessoa.php';
?>

Segue exemplo completo do arquivo cadastro_pessoa.php:
<?php

    include 'pessoa.php';
?>

<html>
    
        
        Cadastro Pessoa
    
    <body>
        <?php
        //tratar o retorno do formulário
        if($_SERVER['REQUEST_METHOD'] == 'POST')
        {
            if(isset($_POST['salvar']))
            {
                $nome = $_POST['nome'];
                $endereco = $_POST['endereco'];
                
                $p = new pessoa(null, $nome, $endereco);
                $p->salvar();
            }
        }
        ?>
        <form name="CadPessoa" action="" method="post">
            
            
            
            
            
            
        </form>
    </body>
</html>

Segue video tutorial:


Até a próxima!

domingo, 19 de maio de 2013

Salvando objeto no banco de dados.

Neste post vou explicar como salvar os dados do objeto. Vou utilizar o projeto anterior, onde criamos anteriormente a classe conexao responsável por conectar no banco de dados. Agora vamos criar uma nova classe chamada pessoa, no projeto escola.

<?php
class pessoa {
    
}
?>

Os atributos da classe pessoa semente para aprendizagem será id, nome e endereco. A visibilidade destes atributos serão protected.

<?php
class pessoa {
    //atributos
    protected $id;
    protected $nome;
    protected $endereco;
}
?>

Os atributos da classe pessoa possuem visibilidade protected, significa que precisamos criar os métodos get e set, para facilitar criamos estes métodos primeiro.

<?php
class pessoa {
    //atributos
    protected $id;
    protected $nome;
    protected $endereco;
}

    //métodos
    
    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getNome() {
        return $this->nome;
    }

    public function setNome($nome) {
        $this->nome = $nome;
    }

    public function getEndereco() {
        return $this->endereco;
    }

    public function setEndereco($endereco) {
        $this->endereco = $endereco;
    }
?>

Com os métodos get e set criados, agora criamos o método construtor. Neste método eu devo definir seus atributos como nulo, isso será útil quando explicarei o método selecionar, num post futuro. Eu crio primeiro os métodos set e get para beneficiar do code complete do NetBeans, isso é verificado no vídeo que disponibilizo no post. Note que o método construtor eu devo utilizar os métodos set's para atribuir os valores dos atributos.

<?php
class pessoa {
    //atributos
    protected $id;
    protected $nome;
    protected $endereco;
}

    //métodos
    public function __construct($id = null, $nome = null, $endereco = null) {
        $this->setId($id);
        $this->setNome($nome);
        $this->setEndereco($endereco);
    }

    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getNome() {
        return $this->nome;
    }

    public function setNome($nome) {
        $this->nome = $nome;
    }

    public function getEndereco() {
        return $this->endereco;
    }

    public function setEndereco($endereco) {
        $this->endereco = $endereco;
    }
?>

Agora crio o método salvar, este método será responsável por salvar os valores dos atributos definidos no objeto que eu instanciar. No método salvar precisamos instanciar um objeto da classe conexao que será responsável pela conexão ao banco. Com objeto da classe conexao criado, devemos chamar o método conectar. Este método irá chamar outros métodos que foram herdados da classe MySQLI, são eles:

  • stmt_init() - Inicializa uma declaração e retorna um objeto para uso com prepare();
  • prepare() - responsável para preparar o comando que será enviado para o SGBD;
  • bind_param() - responsável por substituir os ? (pontos de interrogação) do método prepare() pelos valores, também devemos definir os tipos de dados que serão substituídos;
  • execute() - enviar o comando para execução no SGBD;
  • close() - fechar a conexão com o banco. 

<?php
class pessoa {
    //atributos
    protected $id;
    protected $nome;
    protected $endereco;
}

    //métodos
    public function __construct($id = null, $nome = null, $endereco = null) {
        $this->setId($id);
        $this->setNome($nome);
        $this->setEndereco($endereco);
    }

    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getNome() {
        return $this->nome;
    }

    public function setNome($nome) {
        $this->nome = $nome;
    }

    public function getEndereco() {
        return $this->endereco;
    }

    public function setEndereco($endereco) {
        $this->endereco = $endereco;
    }

    public function salvar()
    {
        $con = new conexao('127.0.0.1', 'root', '', 'bdEscola');
        $con->conectar();
        
        $con->stmt_init();
        $stmt = $con->prepare('insert into tbpessoa(nome, endereco) values(?, ?)');
        $stmt->bind_param('ss', $this->getNome(), $this->getEndereco());
        if($stmt->execute())
            echo 'Registro salvo!';
        else
            echo 'Impossível salvar registro!';
        $con->close();
    }

?>

Agora para testar vamos incluir no início antes da declaração da classe pessoa o arquivo conexao. Isso é necessário pois vamos utilizar um objeto conexao, para conectar ao banco.
<?php
include 'conexao.php';
class pessoa {

Agora instanciamos um objeto da classe pessoa para realizar o teste. Agora basta abrir no navegar o endereço da classe pessoa no navegador.
$p = new pessoa(null, 'Gloria Pires', 'Av. Copacabana, 1054');
@$p->salvar();

?>
Bom pessoal, é isso, disponibilizo abaixo código completo da classe pessoa e vídeo. Bom estudo!

<?php
include 'conexao.php';
class pessoa {

    //atributos
    protected $id;
    protected $nome;
    protected $endereco;
    
    //métodos
    function __construct($id = null, $nome = null, $endereco = null) {
        $this->setId($id);
        $this->setNome($nome);
        $this->setEndereco($endereco);
    }
    
    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getNome() {
        return $this->nome;
    }

    public function setNome($nome) {
        $this->nome = $nome;
    }

    public function getEndereco() {
        return $this->endereco;
    }

    public function setEndereco($endereco) {
        $this->endereco = $endereco;
    }
    
    public function salvar()
    {
        $con = new conexao('127.0.0.1', 'root', '', 'bdEscola');
        $con->conectar();
        
        $con->stmt_init();
        $stmt = $con->prepare('insert into tbpessoa(nome, endereco) values(?, ?)');
        $stmt->bind_param('ss', $this->getNome(), $this->getEndereco());
        if($stmt->execute())
            echo 'Registro salvo!';
        else
            echo 'Impossível salvar registro!';
        $con->close();
    }
}

$p = new pessoa(null, 'Gloria Pires', 'Av. Copacabana, 1054');
@$p->salvar();

?>

Criando uma Classe de conexão com o Banco de Dados utilizando MySLQI

Hoje vou ensinar como criar uma classe de conexão com o banco de dados utilizando a classe MySQLI. Vamos criar um novo projeto no NetBeans chamado escola. Com o projeto criado, vamos agora criar uma classe chamada conexao (só para lembrar não colocamos acento, espaços e nenhum caractere especial no nome de nossa classe), essa classe vai herdar atributos e métodos da classe MySQLI.

<?php
class conexao extends mysqli {

}
?>

Esta classe possui os seguintes atributos: servidor, usuário, senha e banco. Esses atributos são obrigatórios para realizar uma conexão como o SGBD MiSQL. Nossa classe ficará assim:

<?php
class conexao extends mysqli {
    //atributos
    public $servidor;
    public $usuario;
    public $senha;
    public $banco;
}
?>

Como Classe conexao possui os atributos com visibilidade public, não precisamos criar os métodos get e set, isso significa que podemos atribuir valores diretamente em nossos atributos, então vamos criar o método construtor, logo abaixo dos nossos atributos.

<?php
class conexao extends mysqli {
    //atributos
    public $servidor;
    public $usuario;
    public $senha;
    public $banco;

    //métodos
    function __construct($servidor, $usuario, $senha, $banco) {
        $this->servidor = $servidor;
        $this->usuario = $usuario;
        $this->senha = $senha;
        $this->banco = $banco;
    }
}
?>

Mas nosso método construtor apenas irá atribuir os valores quando instanciarmos o objeto conexao, isso não estabelece a conexão com o SGBD. Para estabelecer a conexão, devemos criar um método conectar. O método conectar utiliza o construtor da classe pai, ou seja, o método construtor da classe MySQLI. Para chamar o método construtor da classe MySQLI utilizamos o comando parent.

<?php
class conexao extends mysqli {
    //atributos
    public $servidor;
    public $usuario;
    public $senha;
    public $banco;

    //métodos
    function __construct($servidor, $usuario, $senha, $banco) {
        $this->servidor = $servidor;
        $this->usuario = $usuario;
        $this->senha = $senha;
        $this->banco = $banco;
    }

    public function conectar()
    {
        parent::__construct($this->servidor, $this->usuario, $this->senha, $this->banco);
    }
}
?>

Nosso método conectar já possibilita a conexão com o SGBD, mas caso aconteça algum erro? As boas práticas de programação exigem que os erros de tratados na aplicação, isso chama-se tratamento de Exceções. Somente para lembrar, já expliquei tratamentos de exceções na postagem Introdução a Orientação a Objetos no PHP - parte 3 .

<?php
class conexao extends mysqli {
    //atributos
    public $servidor;
    public $usuario;
    public $senha;
    public $banco;

    //métodos
    function __construct($servidor, $usuario, $senha, $banco) {
        $this->servidor = $servidor;
        $this->usuario = $usuario;
        $this->senha = $senha;
        $this->banco = $banco;
    }

    public function conectar()
    {
        try
        {
            parent::__construct($this->servidor, $this->usuario, $this->senha, $this->banco);
            if(mysqli_connect_errno() != 0)
            {
                throw new Exception('Erro ao conectar!');
            }
        }
        catch(Exception $e)
        {
            echo $e->getMessage();
        }
    }
}
?>
Agora vamos testar nossa classe conexao, para isso, vamos instanciar um objeto conexao no mesmo arquivo PHP, depois do fechamento da última chave da classe conexao. Após instanciarmos essa classe, o nosso exemplo estará completo. Observação: na linha 36 colocamos o @ na frente da chamado do método conectar para não exibir as mensagens de alerta do MySQL.

<?php
class conexao extends mysqli {
    //atributos
    public $servidor;
    public $usuario;
    public $senha;
    public $banco;

    //métodos
    function __construct($servidor, $usuario, $senha, $banco) {
        $this->servidor = $servidor;
        $this->usuario = $usuario;
        $this->senha = $senha;
        $this->banco = $banco;
    }

    public function conectar()
    {
        try
        {
            parent::__construct($this->servidor, $this->usuario, $this->senha, $this->banco);
            if(mysqli_connect_errno() != 0)
            {
                throw new Exception('Erro ao conectar!');
            }
        }
        catch(Exception $e)
        {
            echo $e->getMessage();
        }
    }
}

    //testar a conexão
    $con = new conexao('127.0.0.1', 'root', '', 'bdEscol');
    @$con->conectar();
?>
Disponibilizo o vídeo referente a esta aula. Qualquer dúvida ou comentário é só postar. Bom estudo!