Larback - Retornando conhecimento



Agenda WEB - Parte dois - Cadastro de contatos - Inserção de dados via PDO

Continuando nosso sistema (http://www.larback.com.br/aula/265/Agenda-WEB---Parte-um---Controle-de-acesso---Login-utilizando-PDO), agora faremos o cadastro de contatos. Para isso criamos em nosso banco de dados a tabela de contatos:
create table contatos (codigo int primary key auto_increment, nome varchar(100), email varchar(200), telefone varchar(50), responsavel varchar(100));
Feita as alterações no banco, criaremos a classe Contato. Esta classe conterá todos os métodos necessários para a manipulação da tabela contatos. Para esta parte, precisaremos de um método para adicionar um novo registro na tabela.
ARQUIVO: Contato.class.php
<?php
class Contato {
  const USUARIO = "root";
  const SENHA = "SENHA_DO_BANCO";
  public function conectar() {
    $con = new PDO("mysql:host=localhost;dbname=agenda", self::USUARIO,self::SENHA);
    $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    return $con;
  }
  public function novo($nome,$email,$telefone,$responsavel){
    $con = $this->conectar();
    $stm = $con->prepare("insert into contatos (nome,email,telefone,responsavel) values (?,?,?,?)");
    $stm->bindParam(1,$nome);
    $stm->bindParam(2,$email);
    $stm->bindParam(3,$telefone);
    $stm->bindParam(4,$responsavel);
    $stm->execute();
    
  }
}
?>
O método conectar é exatamente igual ao da classe Usuario (inclusive, deveríamos ter criado uma classe separada para isso, mas deixei repetir de propósito para ajudar na memorização dos comandos).
O método novo é bastante simples, passamos para ele os parâmetros que deverão ser salvos na tabela, o método chama o método conectar(), cria um objeto prepare statement que pré-compila os comandos SQL que serão executados. Repare que na instrução inicial os valores são substituídos por ? - indicando que estamos utilizando parâmetros não nomeados. Os valores desses parâmetros são dados utilizando-se o método bindParam(index,valor) - só podemos executar a sentença SQL após termos dado valor a todos os parâmetros. A sentença é executada quando chamamos o método execute().

O formulário para entrada de dados é bem simples, contendo apenas um pequeno trecho de código em PHP que evita acesso não autorizado - vai que algum usuário lammer resolve acessar diretamente o arquivo né? Nunca se sabe...
ARQUIVO: novoContato.inc.php
<?php
session_start();
if (!$_SESSION['autenticado']){
  include_once "index.php";
  exit("<div class='alert alert-danger col-sm-12'>Para acessar o sistema você deve efetuar login</div>");
}
?>
<form class="form-horizontal" action="principal.php?q=1b" method="post">
<fieldset>

<!-- Form Name -->
<legend>Novo Contato</legend>

<!-- Text input-->
<div class="form-group">
  <label class="col-md-4 control-label" for="nome">Nome</label>  
  <div class="col-md-5">
  <input id="nome" name="nome" placeholder="Nome completo" class="form-control input-md" required type="text">
    
  </div>
</div>

<!-- Text input-->
<div class="form-group">
  <label class="col-md-4 control-label" for="telefone">Telefone</label>  
  <div class="col-md-4">
  <input id="telefone" name="telefone" placeholder="(99) 99999-9999" class="form-control input-md" required type="text">
    
  </div>
</div>

<!-- Text input-->
<div class="form-group">
  <label class="col-md-4 control-label" for="email">Email</label>  
  <div class="col-md-4">
  <input id="email" name="email" placeholder="email" class="form-control input-md" required type="text">
    
  </div>
</div>

<!-- Button (Double) -->
<div class="form-group">
  <label class="col-md-4 control-label" for="salvar"></label>
  <div class="col-md-8">
    <button id="salvar" name="salvar" class="btn btn-success" type="submit"  >&nbsp;Salvar&nbsp;</button>
    <a href="principal.php" id="cancelar" name="cancelar" class="btn btn-danger">Cancelar</a>
  </div>
</div>

</fieldset>
</form>


Para completarmos essa parte, precisaremos alterar a página principal.php - Um menu dropdown foi adicionado para permitir acessarmos o formulário de cadastro.
Todos os links apontam para a própria página principal, passando um parâmetro na URL (q) que indica qual página deve ser processada. No corpo da página, este parâmetro é lido é a página indicada incluída. Quando o formulário é submetido (veja o action da página novoContato.inc.php), ele também é enviado para a página principal.php, esta página ao recebê-lo, cria uma nova instância da classe Contato e executa o método novo, salvando os dados no banco.
<?php
session_start();
?>
<!doctype html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">

 <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<title>Agenda Web</title>

</head>

<body>
<?php

if (!$_SESSION['autenticado']){
  include_once "index.php";
  exit("<div class='alert alert-danger col-sm-12'>Para acessar o sistema você deve efetuar login</div>");
}
?>
<div class="container">    
        <div id="loginbox" style="margin-top:50px;" class="mainbox">                    
            <div class="panel panel-info" >
                    <div class="panel-heading">
                        <div class="panel-title">Agenda Web - Bem vindo <b><?=$_SESSION['usuario'];?></b></div>
                        
                        <div style="float:right; font-size: 80%; position: relative; top:-10px"><a href="logout.php"> Sair </a></div>
                    </div>     
            </div>
            
              <!-- Menu dropdown com bootstrap -->
              <div class="dropdown">
              <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">Ações
              <span class="caret"></span></button>
              <ul class="dropdown-menu">
                    <li><a href="?q=1">Cadastrar Contato</a></li>
                    <li><a href="#">Visualizar Contatos</a></li>
                    <li><a href="#">Localizar</a></li>
              </ul>
              </div>

<?php
  if (isset($_GET['q'])){
    switch($_GET['q']) {
      case '1':
        include_once 'novoContato.inc.php';
        break;
      case '1b':
        include_once 'Contato.class.php';
        $contato = new Contato();
        try {
          $contato->novo($_POST['nome'],$_POST['email'],$_POST['telefone'],$_SESSION['usuario']);
          echo "<br /><br /><div class='alert alert-success col-sm-12'>Contato salvo com sucesso.</div>";
        } catch(PDOException $p) {
          echo "Ocorreu um erro inesperado: ". $p->getMessage();
        }  
    }
  } else {
    ?>
         <div style="font-size:60px;color:white;text-shadow: 2px -5px 3px skyblue;margin:0 auto;width:50%">Agenda WEB 1.0</div> 
    <?php
  }      
?>
            
            
            
        </div>
</div>
</body>
</html>
Em anexo, todos os arquivos atualizados até aqui.
Bons estudos.

Baixar arquivos anexos