Ir ao conteúdo
  • Cadastre-se

Converter e consultar datas no mysql


Posts recomendados

Boa Noite.... fale DiF... já vi que o sr entende mesmo dessa parada de Date no PHP... hehhehe

Amigo é o seguinte, também sou iniciante em PHP, estudo sozinho e estou desenvolvendo um sistema de cadastro. Ele já está praticamente pronto, só que agora estou na fase dos "Afinamentos", sendo que o cadastro do Campo 'Data de Nascimento' ainda está no padrão Americano do MySQL tudo porque ainda não consegui implementar esse código de inversão e pelo que vejo a complicação toda é porque montei ele com Dreamweaver que ajuda muito, mas ao mesmo tempo complica algumas coisas, pois o código que ele gera é cheio de Firula. Ex:

<?php require_once('Connections/conext.php'); ?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $insertSQL = sprintf("INSERT INTO cadastro (id, datacad, nome, datanasc, endereco, cep, bairro, telefone, email, demanda, obs, status) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
                       GetSQLValueString($_POST['id'], "int"),
                       GetSQLValueString($_POST['datacad'], "date"),
                       GetSQLValueString($_POST['nome'], "text"),
                       GetSQLValueString($_POST['datanasc'], "date"),
                       GetSQLValueString($_POST['endereco'], "text"),
                       GetSQLValueString($_POST['cep'], "text"),
                       GetSQLValueString($_POST['bairro'], "text"),
                       GetSQLValueString($_POST['telefone'], "text"),
                       GetSQLValueString($_POST['email'], "text"),
                       GetSQLValueString($_POST['demanda'], "text"),
                       GetSQLValueString($_POST['obs'], "text"),
                       GetSQLValueString($_POST['status'], "text"));

  mysql_select_db($database_conext, $conext);
  $Result1 = mysql_query($insertSQL, $conext) or die(mysql_error());

  $insertGoTo = "confirma_cadastro.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo));
}

mysql_select_db($database_conext, $conext);
$query_rsBairro = "SELECT * FROM bairros ORDER BY bairro ASC";
$rsBairro = mysql_query($query_rsBairro, $conext) or die(mysql_error());
$row_rsBairro = mysql_fetch_assoc($rsBairro);
$totalRows_rsBairro = mysql_num_rows($rsBairro);

mysql_select_db($database_conext, $conext);
$query_rsDemanda = "SELECT * FROM demanda ORDER BY demanda ASC";
$rsDemanda = mysql_query($query_rsDemanda, $conext) or die(mysql_error());
$row_rsDemanda = mysql_fetch_assoc($rsDemanda);
$totalRows_rsDemanda = mysql_num_rows($rsDemanda);

mysql_select_db($database_conext, $conext);
$query_rsStatus = "SELECT * FROM status ORDER BY status ASC";
$rsStatus = mysql_query($query_rsStatus, $conext) or die(mysql_error());
$row_rsStatus = mysql_fetch_assoc($rsStatus);
$totalRows_rsStatus = mysql_num_rows($rsStatus);
?>

isso tudo aí é só o código... sem a parte HTML. Já testeu um monte de saídas que encontrei, mas não sei onde colocar nesse código complicado do Dreamweaver. Mas vou indo mesmo sem conseguir resolver isso por enquanto. Aí resolvi fazer uma estatística no sistema. Eu seleciono data inicial e data final e me retorna o período pesquisado e a quantidade de cadastros realizados nesse período. Aí eu que já estou Compreendendo melhor o funcionamento do PHP, fui pro Braço. Estudei, pesquisei, montei e saiu isso:

<?php require_once('Connections/conext.php'); ?>

<?php

function converteData($dataini,$datafin){
    if(count(explode("/",$dataini,$datafin)) > 1): 
         return implode("-",array_reverse(explode("/",$dataini,$datafin)));
    elseif(count(explode("-",$dataini)) > 1): 
         return implode("/",array_reverse(explode("-",$dataini,$datafin)));
    endif;
}

if(isset($_POST['ok'])){

$dataini = $_POST["dataini"];
$datafin = $_POST["datafin"];

$sql = "SELECT * FROM cadastro WHERE datacad BETWEEN $dataini AND $datafin";
$query = mysql_query($sql) or die(mysql_error());
//$total = mysql_num_rows($query);

while ($loop = mysql_fetch_array($query)) {
    
     $id = $loop["id"];
	}
}	

?>

No form estou usando Input type='date' (pra não ficar digitando) e retorna as datas com:

<tr>
	<td><font face="Arial" size="2px" color="#990000"><strong>Período consultado</strong></font></td>
    <td align="center"><font face="Arial" size="2px"><?php echo $dataini = implode("/",array_reverse(explode("-",$dataini))); ?></font></td>
    <td align="center"><font face="Arial" size="2px"><?php echo $datafin = implode("/",array_reverse(explode("-",$datafin))); ?></font></td>
</tr>

Até ai perfeito, as datas retornam que uma beleza, mas quando vou ver o resultado da minha consulta:

<tr>
	<td><font face="Arial" size="2px" color="#990000"><strong>Pessoas cadastradas</strong></font></td>
	<td colspan="2" align="center"><font face="Arial" size="2px"><strong><?php echo $id; ?></strong></font></td>
</tr>

Não vem nada. Então pergunto caro amigo.. o que eu ainda não entendi? Onde está o meu pecado?

Agora é o seguinte, se tira a função, tira o input date e deixar text, se digitar tudo no formato do mysql... funciona. S eu deixar só a $dataini.... funciona, mas com a $datafin no formato MySQL. Tem como dar uma ajuda aí amigo?

retorno_dados_consulta.jpg

Link para o comentário
Compartilhar em outros sites

  • Moderador

@Glayson Duarte Olá,

 

Primeiramente deixo um aviso que movi seu post para um novo tópico.  Só para manter a organização!

 

Posso começar informando que o Dreamweaver é uma péssima IDE. Exatamente por isso. Você mais perde tempo tirando o que não quer do que fazendo o que quer.

O ideal é, se você está na época de aprendizado, escreva. Use IDEs que obriguem você a escrever caractere por caractere.. por exemplo o notepad++,  Eclipse for php(oxygen) e por aí vai. Eu uso o eclipse, além de ser leve é gratuito.

 

Sobre seu código, creio que você não tenha usado corretamente a função criada.

Nesse caso, não pode ter dois parâmetros por causa que o explode não aceita duas variáveis.

O você pode pode fazer é chamar duas vezes a mesma função para cada data.

 

Os erros ocorrem por que a função foi alterada.

 

Você pode sem problema algum chamar quantas vezes quiser a função!

 

Então recomendo que faça assim:

 

Por exemplo na sua consulta, o mysql  precisa que a data seja na forma internacional então você aplica nas variáveis:

 

 

$dataini = $_POST["dataini"];
$datafin = $_POST["datafin"];

$dataInicial = converteData($dataini);
$dataFinal   = converteData($datafin);


$sql = "SELECT * FROM cadastro WHERE datacad BETWEEN $dataInicial AND $dataFinal";

Desta forma, você envia ao banco de dados a data na forma internacional( assumindo que no formulário você entrou com a dada desta maneira " 29/06/2017" )

 

Nesta parte aqui:

 

<tr>
	<td><font face="Arial" size="2px" color="#990000"><strong>Período consultado</strong></font></td>
    <td align="center"><font face="Arial" size="2px"><?php echo $dataini = implode("/",array_reverse(explode("-",$dataini))); ?></font></td>
    <td align="center"><font face="Arial" size="2px"><?php echo $datafin = implode("/",array_reverse(explode("-",$datafin))); ?></font></td>
</tr>

Você não precisa colocar o trecho de implode de novo... pois você já tem isso na função... então é direto, é só chamar a função de novo!

 

Desta forma:

<tr>
    <td><font face="Arial" size="2px" color="#990000"><strong>Período consultado</strong></font></td>
    <td align="center"><font face="Arial" size="2px"><?php echo converteData($dataini); ?></font></td>
    <td align="center"><font face="Arial" size="2px"><?php echo converteData($datafin); ?></font></td>
</tr>

 

É importante que você organize seu código, por isso tudo que é função que você usar, coloque em um arquivo separado e inclua com include bem no topo da página, principalmente quando precisa usar mais de uma vez!

PS: Só não coloque acima de um session_start().

 

A ideia é que sempre ao emitir ao php uma data,  você converte antes de inserir ou emitir ao mysql,  e sempre que  recuperar uma data do mysql,  converte antes de imprimir em tela.

 

Então, seu erro é que além da função estar errada ali( tem duas datas) você não está chamando ela corretamente!

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Fale @DiF... amigo.. desde já quero agradecer pelo tempo dispensado para dar essa ajuda e desculpa a demora do retorno. agora é foco total neste 'sisteminha'.

 

bem, na parte que lhe expliquei sobre entrar com uma data inicial e uma data final para se obter o numero de registro em um determinado período, procurei seguir seus ensinamentos e ficou assim: criei um arquivo chamado 'fdata.php' que contem a função:

<?php

require_once('Connections/conext.php');

function converteData($data){
    if(count(explode("/",$data)) > 1): 
         return implode("-",array_reverse(explode("/",$data)));
    elseif(count(explode("-",$data)) > 1): 
         return implode("/",array_reverse(explode("-",$data)));
    endif;
}

?>

depois, na página da pesquisa 'estat_cadastro.php' entrei com esse código:

<?php 

require_once('Connections/conext.php'); 

include('fdata.php');

if(isset($_POST['ok'])){
	
$dataini = $_POST['dataini'];
$datafin = $_POST['datafin'];

$dataInicial = converteData($dataini);
$dataFinal   = converteData($datafin);

$sql = "SELECT * FROM cadastro WHERE datacad BETWEEN $dataInicial AND $dataFinal";
$query = mysql_query($sql) or die(mysql_error());

while ($loop = mysql_fetch_array($query)) {
    
     $id = $loop['id'];
	}
}
?>

e para exibir o resultado ficou assim:

<td><font face="Arial" size="2px" color="#990000"><strong>Período consultado</strong></font></td>
<td align="center"><font face="Arial" size="2px"><?php echo converteData($dataini); ?></font></td>
<td align="center"><font face="Arial" size="2px"><?php echo converteData($datafin); ?></font></td>

bem, explicando o que aconteceu:

utilizando o campo input como tipo 'date', entro com as datas inicial e final  no calendario e quando clico em pesquisar ele me trás realmente a data inicial e final perfeitamente no nosso padrão PT-br, porém ele não me retorna o resultado da consulta no banco da quantidade de registros no período. Como mostrei antes se não usar função funciona. O que será que tá de errado nesse meu código? Acho que seja algo nesse while que ainda não enxerguei.

datas.jpg

Link para o comentário
Compartilhar em outros sites

  • Moderador

@Glayson Duarte Realmente não sei onde está o problema... mas tem coisas me chamando a atenção.

Você já tentou fazer a consulta retornando um count()  de registros?

Porque o mysql_num_rows está comentado?  ele seria perfeito para mostrar a quantidade de registros retornados.

Além disso,  o seu while,  notei que você não mostra dados de cada registro... não pelo menos nos códigos que estão acima.. acho nesse caso ali não precisa de while.

 

porque ele só é necessário caso você queira apresentar  vários dados de cada registro.

Como você quer mostrar o total de pessoas cadastradas entre duas datas.   

 

Você pode usar o mysql_affected_rows  ou num_rows 

 

Só devo lembrar que o mysql é obsoleto. hj em dia é usado o mysqli  com i no final.  Digo isso porque desde o php 5  está obsoleto e no php7 foi completamente retirado!

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

Fala DiF,

 

Assim, eu consegui matar a charada da inversão da data com o Dreamweaver. Sou muito grato por toda a ajuda e conselhos que me destes. A sacada era a Formula que o LGDelai usou no outro tópico. Vou mostrar aqui a Solução da coisa porque rodei muito atrás disso e sei que muitos gostariam de saber.

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $datanasceua = implode("-",array_reverse(explode("/", $_POST["datanasc"])));	
  $insertSQL = sprintf("INSERT INTO cadastro (id, datacad, nome, datanasc, endereco, cep, bairro, telefone, email, demanda, obs, status) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
                       GetSQLValueString($_POST['id'], "int"),
                       GetSQLValueString($_POST['datacad'], "date"),
                       GetSQLValueString($_POST['nome'], "text"),
                       GetSQLValueString($datanasceua, "date"),
                       GetSQLValueString($_POST['endereco'], "text"),
                       GetSQLValueString($_POST['cep'], "text"),
                       GetSQLValueString($_POST['bairro'], "text"),
                       GetSQLValueString($_POST['telefone'], "text"),
                       GetSQLValueString($_POST['email'], "text"),
                       GetSQLValueString($_POST['demanda'], "text"),
                       GetSQLValueString($_POST['obs'], "text"),
                       GetSQLValueString($_POST['status'], "text"));

  mysql_select_db($database_conext, $conext);
  $Result1 = mysql_query($insertSQL, $conext) or die(mysql_error());

Mas.... como estou procurado melhorar, já estou seguindo seu conselho e estudando "MySQLi" e digitando linha por linha para melhor entender a lógica da coisa e o funcionamento. Meu irmão um grande abraço pra você e se eu me enrolar não ter vergonha em perguntar pra você. :D

Valeu!!!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Glayson Duarte Realmente deve mudar para MySQLi, contudo creio que deva se aplicar mais em PDO, que permite os mesmos comandos para conexões com diversos bancos de dados. Ex: MySQL, SQLServer, Postgres, SQLITE, etc...

Se puder, estude frameworks para aumentar a produtividade. Um bom exemplo é o Laravel já bastante usado e contribuído pela comunidade.

 

Sobre seu problema, eu não formato mais datas pelo PHP, eu já trago as datas formatadas do banco de dados. Ex:

 

SELECT DATE_FORMAT(BirthDate, "%W %M %e %Y") FROM Employees;

 

BirthDate => Tupla ou campo tipo date ou datetime dentro da tabela Employees. Assim a data já vem formatada para apresentação.

 

Resultado: Sunday December 8 1968

 

A última dica que dou (mas essa é pessoal): Fuja de automação de editores, isso porque normalmente este não usará a melhor lógica para resolver o problema, usará muitas linhas de código fazendo você perder desempenho e além do fato que, muitas vezes, achar um erro no código gerado é muito trabalhoso. Se for trabalhar mesmo com PHP use PHPStorm como editor ou se quer um bom editor free, Netbeans PHP é uma ótima opção.  

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...