Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

MANIPULAÇÃO DE DATA

Boa tarde a todos.

Agradeceria de uma idéia para resolver meu problema:

Meus campos datainicio e datatermino estão sendo enviados ao BD utilizando esta preg_replace:

public function getDatainicio()
{  

return $this->datainicio;

}
public function setDatainicio($datainicio)
{   
    $datainicio= preg_replace("/\D+/", "", $datainicio); 
    $this->datainicio = $datainicio;
}

public function getDatatermino()
{     
    return $this->datatermino;
}
public function setDatatermino($datatermino)
{   
    $datatermino= preg_replace("/\D+/", "", $datatermino); 
    $this->datatermino = $datatermino;
}

Estou conseguindo inserir sem prolemas. Mas quando eu preciso criar o formulário de alteração eu estou retornando os dados do BD recebo desta forma:

 ["datainicio"]=> string(8) "20180921" ["datatermino"]=> string(8) "20180923"

Preciso converter para o padrão brasileiro e exibir no html e depois converter novamente se o usuário quiser alterar a data e enviar ao BD novamente com a data que ele aceita.

Já tentei alterar diretamente no HTML utilizando javascript mas não consegui resultado acho que é porque ele teria que receber no formato do BD 2018-09-21 e não 20180921.

Porque isto está acontecendo e qual o melhor método para resolver?

Este é meu html

<?php ini_set('display_errors', 1);?>
<?php error_reporting(E_ALL);?>
<?php require_once 'conecta.php' ?>
<?php require_once 'cabecalho.php' ?>
<?php require_once 'banco-curso.php' ?>
<?php require_once 'banco-fornecedor.php' ?>
<?php require_once 'curso.php' ?>
<?php require_once 'fornecedor.php' ?>

<?php
$curso = new Curso();
$curso->setFornecedor(new Fornecedor());
if (array_key_exists('id', $_GET)) {
    $id = $_GET['id'];
    $curso = buscaCurso($conexao, $id);
    }
?>

<?php $fornecedores = listaFornecedores($conexao); ?>

<?php
$ehAlteracao = false;
$action = "adiciona-curso.php";
if (array_key_exists("id", $_GET)) {
    $id = $_GET['id'];
    $curso = buscaCurso($conexao, $id);
    $ehAlteracao = true;
    $action = "altera-curso.php";
}
?>
<div class="container">
 <center><h1 class="h3 mb-3 font-weight-normal"> <?=$ehAlteracao ? "Alterar" : "Cadastrar " ?>
  o Curso</h1><form action="<?=$action ?>"  method="post" ></center>
      <div class="form-group">

<input type="hidden" name="id" value="<?=$curso->getId() ?>" />

    <div class="form-group col-md-12">
      <label for="inputEmail4">Nome do Curso</label>
      <input type="text" class="form-control" id="nome" name="nome" placeholder="nome do curso" required 
      value="<?=$curso->getNome() ?>">
    </div>

    <div class="form-group col-md-4">
      <label for="inputDataInicio">Data Inicio</label>
      <input type="date" class="form-control" id="datainicio" name="datainicio"
      value="<?=$curso->getDatainicio() ?>"   required>

    </div>  

  <div class="form-group col-md-4">
      <label for="inputDataTermino">Data Término</label>
      <input type="date" class="form-control" id="datatermino" name="datatermino" 
      value= "<?=$curso->getDatatermino()?>" required>

    </div>


  <div class="form-group col-md-8">
      <label for="professor">Professor</label>
      <input type="text" class="form-control" id="professor" name="professor" placeholder="professor" required 
      value="<?=$curso->getProfessor() ?>">
    </div>

    <div class="form-group col-md-8">
      <label for="local">Local do Curso</label>
      <select name="fornecedor_id" class="form-control">
    <option selected>Escolher...</option>
          <?php foreach($fornecedores as $fornecedor)  :?>
     <?php
         $essaEhAfornecedor = $curso->getfornecedor()->getId()
         == $fornecedor->getId();
         $selecao = $essaEhAfornecedor ? "selected='selected'" : "";
     ?>
        <option value="<?=$fornecedor->getId() ?>" <?=$selecao ?> >
            <?=$fornecedor->getCidade() ?>
        </option>
            <?php endforeach ?>
    </select>
</div>
<br>
    <center><button type="submit" name="submit" id="registrar"
 class="btn btn-primary" ng-disabled="!checked">CADASTRAR</button> </center>

</div>
```Este é meu banco nas funções altera e busca
function buscaCurso($conexao, $id) {
    $query = "select c.*, f.cidade as fornecedor_cidade from cursos c
    inner join fornecedores f on(c.fornecedor_id = f.id)
    where c.id = {$id}"; 

    $resultado = mysqli_query($conexao, $query);
    $array = mysqli_fetch_assoc($resultado);        
    $curso = new curso();
    $curso->setId( $array['id'] );
   $curso->setDatainicio( $array['datainicio'] );
$curso->setDatatermino($array['datatermino']);

`

3 respostas

Oi Sergio, tudo bom?

A melhor abordagem para lidar com datas no PHP é a classe DateTime. Ela já possui um construtor que recebe diversas formatações de data, então no seu caso bastaria usar e formatar do jeito que você quisesse. Por exemplo:

public function getDatatermino()
{     
    return $this->datatermino;
}
public function setDatatermino(\DateTime $datatermino)
{
    $this->datatermino = $datatermino;
}

function buscaCurso($conexao, $id) {
    $query = "select c.*, f.cidade as fornecedor_cidade from cursos c
    inner join fornecedores f on(c.fornecedor_id = f.id)
    where c.id = {$id}"; 

    $resultado = mysqli_query($conexao, $query);
    $array = mysqli_fetch_assoc($resultado);        
    $curso = new curso();
    $curso->setId( $array['id'] );
   $curso->setDatainicio( $array['datainicio'] );
$curso->setDatatermino(new DateTime($array['datatermino']));

<div class="form-group col-md-4">
      <label for="inputDataTermino">Data Término</label>
      <input type="date" class="form-control" id="datatermino" name="datatermino" 
      value= "<?=$curso->getDatatermino()->format('d-m-Y')?>" required>

    </div>

Na função insereCurso também seria necessário formatar a data para o formato do banco =)

Aqui na documentação você encontra mais informações sobre a api de datas.

Abraço!

Bom dia André muito obrigado pelas explicações. Fiz as correções como sugeriu mas me deparei com mais um erro. No "datainicio" está funcionando perfeitamente, e aparece na view-source

 value="2018-09-21"   required>

ou seja está trazendo a data do BD e fazendo a conversão na apresentação ao usuário, perfeito! Mas no "datatermino" ele já está trazendo a data formatada para o PT-BR segundo a view-source

value= "23-09-2018" required>

e não mostra a data convertida no campo value para o usuário, o campo fica em branco. O que poderia estar ocorrendo? Como posso ajustar isso?

Esse é o html como ficou com a alteração:

 <div class="form-group col-md-4">
      <label for="inputDataInicio">Data Inicio</label>
      <input type="date" class="form-control" id="datainicio" name="datainicio"
      value="<?=$curso->getDatainicio() ?>"   required>

    </div>  

    <div class="form-group col-md-4">
      <label for="inputDataTermino">Data Término</label>
      <input type="date" class="form-control" id="datatermino" name="datatermino" 
      value= "<?=$curso->getDatatermino()->format('d-m-Y')?>" required>

    </div>

Aproveitando, seria essa a alteração que devo fazer no adiciona-curso?

<?php

$curso = new curso();
$curso->setNome($_POST["nome"]) ;
$curso->setFornecedor(new Fornecedor());
$curso->setFornecedor($_POST["fornecedor_id"]);
$curso->setDatainicio($_POST["datainicio"]);
$curso->setDatatermino(new DateTime($array['datatermino']));
$curso->setProfessor($_POST["professor"]);

$dao = new cursoDAO($conexao);

if ($dao->inserecurso($curso)) {   

?>
<script type="text/javascript">
window.location="lista-cursos.php"
      </script>
<p class ="Alert-Sucess">
                O curso<?=$curso->getNome()?>,<?=$curso->getSobrenome() ?> 
                Foi adicionado com sucesso!

<noscript> 
Se não for direcionado automaticamente, clique <a href="lista-cursos.php">aqui</a>. 
</noscript>
</p>

Obrigado

solução!

Opa, a alteração está certinha =)

Pra resolver o outro problema é só padronizar a forma com que você exibe a data:

<div class="form-group col-md-4">
      <label for="inputDataInicio">Data Inicio</label>
      <input type="date" class="form-control" id="datainicio" name="datainicio"
      value="<?=$curso->getDatainicio() ?>"   required>

    </div>  

    <div class="form-group col-md-4">
      <label for="inputDataTermino">Data Término</label>
      <input type="date" class="form-control" id="datatermino" name="datatermino" 
      value= "<?=$curso->getDatatermino()?>" required>

    </div>

Ou

<div class="form-group col-md-4">
      <label for="inputDataInicio">Data Inicio</label>
      <input type="date" class="form-control" id="datainicio" name="datainicio"
      value="<?=$curso->getDatainicio()->format("d-m-Y") ?>"   required>

    </div>  

    <div class="form-group col-md-4">
      <label for="inputDataTermino">Data Término</label>
      <input type="date" class="form-control" id="datatermino" name="datatermino" 
      value= "<?=$curso->getDatatermino()->format("d-m-Y") ?>" required>

    </div>

Também é possivel passar outras formatações pra função format, fica a seu critério

Abraço