1
resposta

COMO USAR VARIÁVEL NUMA SELEÇÃO DE DADOS MYSQL?

Fiz um pequeno banco de dados com 4 colunas (id, data, nome, valor). Posteriormente criei um formulário (via $POST) para servir como filtro definindo uma data inicial e uma data final Consigo recuperar as datas definidas no formulário em qualquer outra página Usando esse código $SESSION['datainicial'] = $POST['datainicial']; $SESSION['datafinal'] = $_POST['datafinal'];

        Consigo recuperar as datas escolhidas no formulário em qualquer outro arquivo usando por exemplo:

        $datainicio = $_SESSION['datainicial'];
        $datafim = $_SESSION['datafinal'];
        echo $datafim;
        echo $datainicio;

        Entretanto, quando uso essas variáveis ($datainicio e $datafim) num codigo como este:

        $resultadoSelecionado = $this->mysql->query('SELECT * FROM custos WHERE datams BETWEEN "22-09-16" AND "22-09-23"');

        Mas o interessante é que se uso as datas de forma natural (por exemplo 22-09-16 e 22-09-23), como abaixo, a seleção do banco de dados funciona

        $resultadoSelecionado = $this->mysql->query('SELECT * FROM custos WHERE datams BETWEEN "22-09-16" AND "22-09-23"');

        Não entendo, porque as variáveis $datainicio contém a string 22-09-16 e $datafim a string 22-09-23

        Porque quando troco a forma 22-09-16 por uma variável que contém a mesma informação não funciona?
1 resposta

Oi Tiago, tudo bem?

O problema provavelmente está relacionado à formatação das datas ao usar as variáveis $datainicio e $datafim no seu código. Ao definir as datas diretamente no código como "22-09-16" e "22-09-23", você está usando a formatação de data no padrão "dd-mm-yy" (dia-mês-ano). Entretanto, se as datas estão armazenadas nas variáveis como "22-09-16" e "22-09-23", a formatação se torna uma string e não uma data no formato aceito pelo MySQL.

Para resolver esse problema, você precisa garantir que as datas sejam formatadas corretamente para serem utilizadas na consulta SQL. O MySQL aceita o formato de data "yyyy-mm-dd" (ano-mês-dia) ou o formato "yyyy-mm-dd H:i:s" (ano-mês-dia hora:minuto:segundo).

Aqui estão algumas sugestões para corrigir o problema:

  1. Use a função PHP date() para formatar as datas antes de inseri-las na consulta:
$datainicio = $_SESSION['datainicial'];
$datafim = $_SESSION['datafinal'];

$datainicio_formatada = date('Y-m-d', strtotime($datainicio));
$datafim_formatada = date('Y-m-d', strtotime($datafim));

$resultadoSelecionado = $this->mysql->query("SELECT * FROM custos WHERE datams BETWEEN '$datainicio_formatada' AND '$datafim_formatada'");

Nesse exemplo, usamos a função strtotime() para converter a string da data para um formato de data aceitável antes de usá-la na função date(), que a formata no padrão "yyyy-mm-dd".

  1. Outra abordagem é usar o recurso de parâmetros preparados (prepared statements) para evitar problemas de segurança com consultas SQL e permitir que o próprio driver do MySQL cuide da formatação:
$datainicio = $_SESSION['datainicial'];
$datafim = $_SESSION['datafinal'];

// Supondo que você esteja usando PDO para se conectar ao MySQL
$stmt = $this->mysql->prepare("SELECT * FROM custos WHERE datams BETWEEN :datainicio AND :datafim");
$stmt->execute([
    'datainicio' => $datainicio,
    'datafim' => $datafim
]);
$resultadoSelecionado = $stmt->fetchAll();

Neste caso, o driver do PDO tratará a formatação das datas corretamente para você.

Independentemente da abordagem escolhida, garantir que as datas estejam no formato correto é essencial para que o MySQL possa interpretá-las corretamente em sua consulta e, assim, obter os resultados desejados.

Espero ter ajudado!

Caso tenha dúvidas, fico à disposição.

Abraços e bons estudos!