Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Glayson Duarte

Converter e consultar datas no mysql

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @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!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×