Logo Hardware.com.br
Romanoo.oo1
Romanoo.oo1 Novo Membro Registrado
21 Mensagens 4 Curtidas

[Resolvido] DateFormat() para enviar date e hora para o Banco de Dados

#1 Por Romanoo.oo1 27/10/2020 - 14:56
Olá Programadores!

Estou tentando enviar data e hora para o banco no formato do DB (Ex: 2020-10-23 14:40:00), Mas... não sei pq causa, razão, motivo e circunstância ele não formata no retorno do form para o php tendo as horas incluído. Consegui apenas com as datas, mas se acrescentar o horário não da certo.

1 - Arquivo de cadastro, gravando no BD corretamente a data e hora, pq estou usando a data e hora do servidor. OK
2 - (Problema) Arquivo de Exibição e Edição, que o form envia para o Arquivo update.php
3 - (Problema) Arquivo de update.php, recebe do form erro 1969/30/30 12:00:00
A coluna do BD em datetime


Logo abaixo no código, o html de Exibição e Edição recebe do BD na consulta sql Ex: 2020-10-23 14:40:00 e é formatado para exibir d/m/Y H:i:s
e ele o form envia para o update.php fazer o update a data e hora no padrão de erro 1969/30/30 12:00:00, mas se eu tirar a hora e deixar somente a data envia correto 2020-10-23.

Abaixo em html o form envia para o php que por sua vez faz o Update dos dados

<!--Recebe em datetime do BD / pesquisa sql para exibir -->
$horarioreserva = $aux['horarioreserva'];

<!--Form, envia os dados para update.php -->
<form method="POST" action="php/update.php" id="salvarReserva_id">

<!--Exibe e Edita com duplo clique -->
<input onclick="myFunction()" role="cell" type="text" class="form-control" name="horarioreserva" id="horarioreserva" autocomplete="off"
onmouseout="UnTip()" value='<?php echo date('d/m/Y H:m:s', strtotime($aux['horarioreserva'])); ?>'>


Abaixo é o php que envia para o DB (Já tentei receber o POST sem formatar e converter para timestamp e depois formatar, tbm não da certo)
[php]
//recebe do form
$horarioreserva = date('Y/m/d H:i:s', strtotime($_POST['horarioreserva']));
//tbm tentei sem formatar
$horarioreserva = $_POST['horarioreserva'];
[/php]


__________________


Já tentei esta formatação (Só funciona com Datas)
[php]$horarioreserva= implode("-",array_reverse(explode("/",$horarioreserva)));[/php]

Tenho esse código abaixo que funciona apenas com datas
[php]
//INÍCIO FORMATAÇÃO DATAS PARA USA SAÍDA
$horarioreserva= $_POST['horarioreserva'];

$div2 = explode("/",$_POST['horarioreserva']);

$data_format2 = $div2[2]."/".$div2[1]."/".$div2[0];

//echo $data_format2;
//FIM FORMATAÇÃO DATAS PARA USA
[/php]


É uma página de reservas, que tem que ser editado os dados do hospede, e é preciso salvar a data e o horário da reserva, não pode ser atualizada, mas se posteriormente precisar de edição já teria o código comentado.
Se alguém souber uma dica agradeço, Abraços.boa.gif

Anexos

esquiloesperto
esquiloesper... Cyber Highlander Moderador
7.1K Mensagens 2.2K Curtidas
#2 Por esquiloesper...
28/10/2020 - 05:43
Antes de tudo, a sua descrição do problema não deixa claro se o problema está em salvar o formulário pela primeira vez ou depois (ao editar ou exibir, por exemplo). Mais precisamente por conta disso:
Romanoo.oo1 disse:
... não formata no retorno do form para o php tendo as horas incluído.
- Que "retorno" é esse?

Além do mais, "value" implica que deve ser um 'input', até aí blz... Mas é muito importante saber o tipo, pois o trecho não revela qual é o tipo desse input que recebe a "data". - Qual seria afinal: text, date, datetime ou datetime-local ? - Alguns destes tipos não coletam a informação de horário, e o problema pode ser justamente este!

Quanto aos códigos PHP eles estão corretos e não precisa usar 'implode' e nem 'explode' para persistir datas; A função strtotime resolve, mas somente funciona se o padrão recebido do BD (ou do form) for uma "string". Caso receba um timestamp nem precisaria dela, capiche?

Veja as construções possíveis:
[php]# OO
$date = new DateTime('2020-10-23 14:44:44');
echo $date->format('d/m/Y H:i:s');

# Procedural
$date = date_create('2020-10-23 14:44:44');
echo date_format($date, 'd/m/Y H:i:s');

echo date('Y/m/d H:i:s', strtotime('2020-10-23 14:55:55'));
# e
echo date('Y/m/d H:i:s', strtotime('2020/10/23 14:55:55'));[/php]
Só é difícil enquanto estiver oculto! cool.png
Use a pesquisa


rolleyes.png  Navegar é preciso, viver... também.  smile.png
marcos andrade22
marcos andra... General de Pijama Registrado
3.6K Mensagens 333 Curtidas
#3 Por marcos andra...
28/10/2020 - 09:10
Outra coisa além do que o @esquiloesperto falou é verificar como esta a coluna e tamanho que recebe estes no banco, como falou que somente data consegue verifica se o tamanho da coluna não esta com somente 6.
outra coisa é adicionar um echo no código que recebe os valores para ver como esta chegando.
Romanoo.oo1
Romanoo.oo1 Novo Membro Registrado
21 Mensagens 4 Curtidas
#5 Por Romanoo.oo1
28/10/2020 - 15:51
esquiloesperto disse:
Antes de tudo, a sua descrição do problema não deixa claro se o problema está em salvar o formulário pela primeira vez ou depois (ao editar ou exibir, por exemplo). Mais precisamente por conta disso:- Que "retorno" é esse?

Além do mais, "value" implica que deve ser um 'input', até aí blz... Mas é muito importante saber o tipo, pois o trecho não revela qual é o tipo desse input que recebe a "data". - Qual seria afinal: text, date, datetime ou datetime-local ? - Alguns destes tipos não coletam a informação de horário, e o problema pode ser justamente este!

Quanto aos códigos PHP eles estão corretos e não precisa usar 'implode' e nem 'explode' para persistir datas; A função strtotime resolve, mas somente funciona se o padrão recebido do BD (ou do form) for uma "string". Caso receba um timestamp nem precisaria dela, capiche?

Veja as construções possíveis:
[php]# OO
$date = new DateTime('2020-10-23 14:44:44');
echo $date->format('d/m/Y H:i:s');

# Procedural
$date = date_create('2020-10-23 14:44:44');
echo date_format($date, 'd/m/Y H:i:s');

echo date('Y/m/d H:i:s', strtotime('2020-10-23 14:55:55'));
# e
echo date('Y/m/d H:i:s', strtotime('2020/10/23 14:55:55'));[/php]



_______________________

Perfeitamente, não soube explicar, desculpas! daa.png

Reformulei a questão logo à cima.

Mas funciona assim...
1 - Arquivo de cadastro da data e hora no BD, usando a data e hora do servidor, grava corretamente no banco. ok
2 - (Problema) Arquivo de Exibição e Edição ao mesmo tempo com duplo clique, onde edita os dados e envia para o update .php.
3 - (Problema) Arquivo de Update .php, recebe e grava no BD.

É um sistema de hospedagem, reservas, caixas etc... de hotel, e os dados são exibidos para o funcionário e pode ser editado com duplo clique.

Bom... eu deixei este campo data e horário da reserva bloqueado a edição, mas se por ventura precisasse habilitar a edição deste dado, já teria o código comentado.

Obrigado! comemorando.gif

marcos andrade22 disse:
Outra coisa além do que o @esquiloesperto falou é verificar como esta a coluna e tamanho que recebe estes no banco, como falou que somente data consegue verifica se o tamanho da coluna não esta com somente 6.
outra coisa é adicionar um echo no código que recebe os valores para ver como esta chegando.


__________________

Marcos,

Obrigado pela ajuda boa.gif

A coluna no BD está em datetime.
E o echo exibido no update.php é erro 1969/30/30 12:00:00.
Mas se tirar a hora do html H:i:s e deixar somente a data, ai ele envia a data correta para o update.php Ex: 2020-10-23.

Obrigado cap_feceiro.png:

esquiloesperto disse:
Exato.
Inclusive pode usar gettype() nas variáveis para saber o tipo de cada uma nesse echo.


Boa... este gettype() eu não conhecia. Vou pesquisar.

Fazendo testes de formatação:

HTML envia edição por form, form envia para arquivo update.php

<!--Arquivo html de Exibir e Editar envia form-->

<!--Recebe em datetime do BD / pesquisa sql para exibir -->
$horarioreserva = $aux['horarioreserva'];

<!--Form, envia os dados para update.php -->
<form method="POST" action="php/update.php" id="salvarReserva_id">

<input onclick="myFunction()" role="cell" type="text" class="form-control" style="" name="horarioreserva" id="horarioreserva" autocomplete="off"
onmouseout="UnTip()" value='<?php echo date('d/m/Y H:m:s', strtotime($aux['horarioreserva'])); ?>'>


update.php recebe edição
[php]
// Arquivo de update.php, recebe do form

// recebe do form formatado d/m/Y H:m:s
$horarioreserva = $_POST['horarioreserva'];

1º) // print sem formatar, como recebe do form
echo "Sem formatar - ".$horarioreserva."
";

2º) // print formatado strtotime
echo "Strtotime - ".$horarioreserva = date('d/m/Y H:m:s', strtotime($aux['horarioreserva']))."
";

3º) echo "Strtotime2 - ".$horarioreserva = date('d-m-Y H:m:s', strtotime($aux['horarioreserva']))."
";

4º) // print formatado implode
echo "implode - ".$horarioreserva = implode("-",array_reverse(explode("/",$horarioreserva)))."
";

5º) // print formatado explode
//INÍCIO FORMATAÇÃO DATAS PARA USA SAÍDA
$horarioreserva= $_POST['horarioreserva'];

$div3 = explode("/",$_POST['horarioreserva']);

$data_format3 = $div3[2]."-".$div3[1]."-".$div3[0];

echo "explode - ".$data_format3."
";
//FIM FORMATAÇÃO DATAS PARA USA

[/php]

Resultado echo:

1º) Sem formatar = 28/10/2020 15:10:41 (recebeu o que estava exibindo no html)
2º) Strtotime = 31/12/1969 21:12:00
3º) Strtotime2 = 31-12-1969 21:12:00
4º) implode = 31-12-1969 21:12:00

5º) explode = 2020 15:10:41-10-28
esquiloesperto
esquiloesper... Cyber Highlander Moderador
7.1K Mensagens 2.2K Curtidas
#6 Por esquiloesper...
28/10/2020 - 20:39
O problemas no 2º, 3º e 4º itens são idênticos:
  • A variável "aux" não existe ou parece estar completamente vazia, por isso a geração de data (vazia) acontece em 1970 porque é o padrão default.
  • As repetidas reinserções em '$horarioreserva' feitas ali são um erro desnecessário. Ora, você já fez a atribuição:
$horarioreserva = $_POST['horarioreserva'];

Então não faz sentido repetir!


Correto seria:[php]2º) // print formatado strtotime
echo "Strtotime - " . date('d/m/Y H:m:s', strtotime($horarioreserva)) . "
";

3º) echo "Strtotime2 - " . date('d-m-Y H:m:s', strtotime($horarioreserva)) . "
";

4º) // print formatado implode
echo "implode - " . implode("-", array_reverse(explode("/", $horarioreserva))) . "
";[/php]
Só é difícil enquanto estiver oculto! cool.png
Use a pesquisa


rolleyes.png  Navegar é preciso, viver... também.  smile.png
marcos andrade22
marcos andra... General de Pijama Registrado
3.6K Mensagens 333 Curtidas
#7 Por marcos andra...
29/10/2020 - 11:26
Neste trecho do código:
<<a href="'http://december.com/html/4/element/input.html'" target="_blank">input</a> onclick="myFunction()" role="cell" type="text" class="form-control" style="" name="horarioreserva" id="horarioreserva" autocomplete="off"
onmouseout="UnTip()" value='<?php echo date('d/m/Y H:m:s', strtotime($aux['horarioreserva'])); ?>'>

Acredito que o erro possa estar ali no value pois m é mês, tenta:
 date('Y-m-d H:i:s' , strtotime($aux['horarioreserva']))[code]


Acredito que desta forma não precise formatar nada, o padrão de inserção no bd é yyyy-mm-dd hh-mm-ss, o que confunde as vezes é que minuto no PHP é "i" e não "m" .
Romanoo.oo1
Romanoo.oo1 Novo Membro Registrado
21 Mensagens 4 Curtidas
#8 Por Romanoo.oo1
29/10/2020 - 14:06
esquiloesperto disse:
O problemas no 2º, 3º e 4º itens são idênticos:
  • A variável "aux" não existe ou parece estar completamente vazia, por isso a geração de data (vazia) acontece em 1970 porque é o padrão default.
  • As repetidas reinserções em '$horarioreserva' feitas ali são um erro desnecessário. Ora, você já fez a atribuição:

Então não faz sentido repetir!


Correto seria:[php]2º) // print formatado strtotime
echo "Strtotime - " . date('d/m/Y H:m:s', strtotime($horarioreserva)) . "
";

3º) echo "Strtotime2 - " . date('d-m-Y H:m:s', strtotime($horarioreserva)) . "
";

4º) // print formatado implode
echo "implode - " . implode("-", array_reverse(explode("/", $horarioreserva))) . "
";[/php]



______________________
A variável "aux" não existe ou parece estar completamente vazia, por isso a geração de data (vazia) acontece em 1970 porque é o padrão default.


Só funciona se tirar date('d-m-Y H:m:s', strtotime(' ')), pode ser que nesta versão do php o strtotime não funcione "sei lá"
Apache/2.4.46 (Win64) OpenSSL/1.1.1g PHP/7.4.10 Server at localhost Port 80

No exemplo de nº 5 dos testes logo à cima funciona somente com datas.

As repetidas reinserções em '$horarioreserva' feitas ali são um erro desnecessário. Ora, você já fez a atribuição:


Perfeito! tem toda razão, obrigado pela dica wink.png

marcos andrade22 disse:
Neste trecho do código:
<<a href="'http://december.com/html/4/element/input.html'" target="_blank">input</a> onclick="myFunction()" role="cell" type="text" class="form-control" style="" name="horarioreserva" id="horarioreserva" autocomplete="off"
onmouseout="UnTip()" value='<?php echo date('d/m/Y H:m:s', strtotime($aux['horarioreserva'])); ?>'>

Acredito que o erro possa estar ali no value pois m é mês, tenta:
 date('Y-m-d H:i:s' , strtotime($aux['horarioreserva']))[code]


Acredito que desta forma não precise formatar nada, o padrão de inserção no bd é yyyy-mm-dd hh-mm-ss, o que confunde as vezes é que minuto no PHP é "i" e não "m" .


________________
Acredito que o erro possa estar ali no value pois m é mês, tenta:

Há sim, estou usando (d/m/Y H:i:s) é que estava fazendo testes, vi um código assim usando o "m" no lugar do "i" em um site, ai tentei.

Acredito que desta forma não precise formatar nada, o padrão de inserção no bd é yyyy-mm-dd hh-mm-ss

Então... outra forma seria se eu deixar sem formatar na página Exibir e Editar no formato que recebe do BD Y-m-d H:i:s da certo, o update.php salva igual,
Mas fica feio né... deixar a data em formato americano no Exibir.
Romanoo.oo1
Romanoo.oo1 Novo Membro Registrado
21 Mensagens 4 Curtidas
#10 Por Romanoo.oo1
29/10/2020 - 15:50
Consegui... Success

Envio do form html Exibir e Editar

<input onclick="myFunction()" role="cell" type="text" class="imputt immputt form-control" style="cursor: pointer;" name="horarioreserva"
id="horarioreserva" autocomplete="off" onmouseout="UnTip()" value='<?php echo date('d/m/Y H:i:s', strtotime($horarioreserva)); ?>'>


Recebe update.php envia DB
[php]
//recebe do form html Exibir Editar
$horarioreserva = $_POST['horarioreserva'];

// define o formato de entrada para dd/mm/yyyy
$formato = 'd/m/Y H:i:s';

// define data desejada
$data = DateTime::createFromFormat($formato, $horarioreserva);

// formata a saída
$datareserva = $data->format('Y-m-d H:i:s');
//echo $datareserva;
[/php]

Obrigado a todos, Deus abençoe sempre! boa.gifsuper.gif
marcos andrade22
marcos andra... General de Pijama Registrado
3.6K Mensagens 333 Curtidas
#12 Por marcos andra...
30/10/2020 - 10:27
Que bom que resolveu, pode tentar também adicionar um input tipo datepicker com jquery, sei que no bootstrap vem algo do tipo, se puder dá uma olhada nos links abaixo:
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local

https://eonasdan.github.io/bootstrap-datetimepicker/

https://www.jqueryscript.net/time-clock/Date-Time-Picker-Bootstrap-4.html
Romanoo.oo1
Romanoo.oo1 Novo Membro Registrado
21 Mensagens 4 Curtidas
#13 Por Romanoo.oo1
30/10/2020 - 20:32
marcos andrade22 disse:
Que bom que resolveu, pode tentar também adicionar um input tipo datepicker com jquery, sei que no bootstrap vem algo do tipo, se puder dá uma olhada nos links abaixo:
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local

https://eonasdan.github.io/bootstrap-datetimepicker/

https://www.jqueryscript.net/time-clock/Date-Time-Picker-Bootstrap-4.html

__________________

Muito legal Marcos! Show boa.gif

Obrigado
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal