Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Thiago Barraviera

Select entre datas

Recommended Posts

Boa noite,

Estou fazendo uma busca no banco mysql entre duas datas, porém não está retornando nada.
No banco, o campo está como date no formato Ex: 2017-01-25
Já tentei colocar no Select TO_DATE, já tentei também deixar as datas fixas para testar se retorna alguma coisa, porém tudo sem sucesso. Ex: SELECT * FROM `veiculo` WHERE `dataOc` BETWEEN '2017-01-10' AND '2017-01-30'

Alguém já se deparou com isso?

Veiculos.class.php

 public function queryDatas($dados){

        try{
            $this->dataUm = $dados['dataUm'];
            $this->dataDois = $dados['dataDois'];

            $cst = $this->con->conectar()->prepare("SELECT * FROM `veiculo` WHERE `dataOc` BETWEEN :dataUm AND :dataDois");

            $cst->bindParam(":dataUm", $this->dataUm, PDO::PARAM_STR);
            $cst->bindParam(":dataDois", $this->dataDois, PDO::PARAM_STR);
           //Teste para ver se está recebendo
            echo 'Recebi ' . $this->dataUm;
            echo 'Recebi ' . $this->dataDois;

            echo '<br />';

            $linhas = $cst->rowCount();

            print_r($linhas);


        }catch (PDOException $ex){
            return 'error '.$ex->getMessage();
        }

    }
 

O retorno rowCount está vindo zero.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Apresente as DDLs das tabelas, o problema pode estar no tipo de dado da tabela.

PS.: você não é tão novo no fórum para não usar a tag code.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe, amigo. Faz muito tempo que parei de programar e não estava mais usando o fórum. Não lembrava da tag code.

Estrutura da tabela `veiculo`
--

CREATE TABLE `veiculo` (
  `id` int(11) NOT NULL,
  `placa` varchar(10) NOT NULL,
  `modelo` varchar(100) NOT NULL,
  `ano` varchar(50) NOT NULL,
  `cor` char(3) NOT NULL,
  `area` varchar(50) NOT NULL,
  `situacao` char(2) NOT NULL,
  `dataOc` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Extraindo dados da tabela `veiculo`
--

INSERT INTO `veiculo` (`id`, `placa`, `modelo`, `ano`, `cor`, `area`, `situacao`, `dataOc`) VALUES
(18, 'TRA3455', 'corsa', '2014', 'cza', '7', 'ac', '2017-01-21'),
(30, 'ore3499', 'fox', '2010', 'pto', '11', 'f', '2017-01-10'),
(34, 'erf2390', 'strada', '2011', 'vro', '13', 'f', '2017-01-17'),
(35, 'DFU2356', 'golf', '2014', 'pto', '13', 'ou', '2017-01-20'),
(36, 'CED1256', 'prisma', '2010', 'pto', '13', 'f', '2017-01-21'),
(37, 'FTR2354', 'corsa', '2010', 'pto', '11', 'f', '2017-01-11'),
(38, 'CIU4576', 'fox', '2010', 'cza', '13', 'f', '2017-01-23'),
(39, 'XSE4578', 'BMW x3', '2016', 'cza', '45', 'r', '2017-01-25');

O cadastro ocorre normalmente. No campo dataOc, estou inserindo do formato 2017-01-26. Esse campo também está do tipo date, como mostra o SQL acima.

O problema é quando eu vou buscar os registro entre as datas xxxx-xx-xx a xxxx-xx-xx

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não está executando a prepared statement.

Você precisa usar o seguinte comando:

$cst->execute();

Antes de retornar a quantidade de linhas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa! Retornou a quantidade de linhas. Agora tenho certeza de que o SELECT está funcionando.

Fui tentar dar um foreach para imprimir os registros, mas está gerando um erro.

Página index.php

<?php
require_once 'classes/Veiculos.class.php';

if (isset($_POST['btBuscar'])){
    if ($objFcn->queryDatas($_POST) == 'ok'){
        header('location: index.php');
    }else{
        echo '<script type="javascript">alert("Erro em buscar entre datas");</script>';
    }
}


foreach ($objFcn->queryDatas() as $rdt){

            echo $rdt['placa'];

        }

?>
public function queryDatas($dados){

        try{
            $this->dataUm = $dados['dataUm'];
            $this->dataDois = $dados['dataDois'];

            $cst = $this->con->conectar()->prepare("SELECT * FROM `veiculo` WHERE `dataOc` BETWEEN :dataUm AND :dataDois");

            $cst->bindParam(":dataUm", $this->dataUm, PDO::PARAM_STR);
            $cst->bindParam(":dataDois", $this->dataDois, PDO::PARAM_STR);

            //echo 'Recebi ' . $this->dataUm;
            //echo 'Recebi ' . $this->dataDois;
            //echo '<br />';

            if($cst->execute()){
                return 'ok';
            }else{
                return 'erro';
            }           


        }catch (PDOException $ex){
            return 'error '.$ex->getMessage();
        }

    }

Warning: Missing argument 1 for Veiculos::queryDatas(), called in C:\xampp\htdocs\cadastro-veicular\index.php on line 179 and defined in C:\xampp\htdocs\cadastro-veicular\classes\Veiculos.class.php on line 51

Notice: Undefined variable: dados in C:\xampp\htdocs\cadastro-veicular\classes\Veiculos.class.php on line 54

Notice: Undefined variable: dados in C:\xampp\htdocs\cadastro-veicular\classes\Veiculos.class.php on line 55

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\cadastro-veicular\index.php on line 179

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leia os erros, está faltando o parâmetro na chamada da função. O retorno da função também não corresponde com o que o foreach espera.

Os três primeiros erros são referentes ao parâmetro. O último é pelo retorno.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, amigo! Deu certo. Era isso mesmo que você falou.

Fiquei bastante tempo sem programar, estou voltando agora e aprendendo também programar orientado à objetos.

Agradeço pela ajuda e paciência.

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É uma boa prática eu imprimir algo dentro da minha função???

Como está na linha 153 echo $row['placa'];

Arquivo: Veiculos.class.php

public function queryDatas($dados){

        try{
            $this->dataUm = $dados['dataUm'];
            $this->dataDois = $dados['dataDois'];

            $cst = $this->con->conectar()->prepare("SELECT * FROM `veiculo` WHERE `dataOc` BETWEEN :dataUm AND :dataDois");

            $cst->bindParam(":dataUm", $this->dataUm, PDO::PARAM_STR);
            $cst->bindParam(":dataDois", $this->dataDois, PDO::PARAM_STR);

            if($cst->execute()){

             foreach ($cst->fetchAll(PDO::FETCH_ASSOC) as $row){

                 echo $row['placa'];

             }

            }else{
                return 'erro';
            }

        }catch (PDOException $ex){
            return 'error '.$ex->getMessage();
        }

    }

Compartilhar este post


Link para o post
Compartilhar em outros sites

É uma boa prática eu imprimir algo dentro da minha função???

Não, não é.

Leia a PSR-1. Scripts PHP devem declarar novos símbolos ou causar outros efeitos (output, alterar config, etc...), nunca ambos.

Esse seu script declara uma classe e, em um dos métodos, está imprimindo um resultado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tendo problemas com isso, pois se eu tiro o foreach do meu arquivo Veiculo.class.php e coloco no index.php, não retorna nada. Ou eu estou fazendo burrada.

Veja que agora deixei return $cst->fetchAll(PDO::FETCH_ASSOC); no arquivo Veiculos.class.php

E, estou fazendo um laço (foreach) e imprimindo no index.php, porém me retorna em branco.

Agora, se eu faço da outra forma, deixando o laço dentro do Veiculo.class.php, depois eu chamo o método queryDatas na index.php, dessa forma funciona.

Veiculos.class.php

include_once "Conexao.class.php";
include_once "Funcoes.class.php";

class Veiculos {

    private $con, $objfc, $placa, $modelo, $ano, $cor, $area, $situacao, $dataOc, $idFuncionario, $dataUm, $dataDois;


    public function __construct(){
        $this->con = new Conexao();
        $this->objfc = new Funcoes();
    }

    public function __set($atributo, $valor){
        $this->$atributo = $valor;
    }
    public function __get($atributo){
        return $this->$atributo;
    }

public function queryDatas($dados){

        try{
            $this->dataUm = $dados['dataUm'];
            $this->dataDois = $dados['dataDois'];

            $cst = $this->con->conectar()->prepare("SELECT * FROM `veiculo` WHERE `dataOc` BETWEEN :dataUm AND :dataDois");

            $cst->bindParam(":dataUm", $this->dataUm, PDO::PARAM_STR);
            $cst->bindParam(":dataDois", $this->dataDois, PDO::PARAM_STR);

            if($cst->execute()){


                return $cst->fetchAll(PDO::FETCH_ASSOC);


            }else{
                return 'erro';
            }

        }catch (PDOException $ex){
            return 'error '.$ex->getMessage();
        }

    }
}

index.php

<?php

        if (isset($_POST['btBuscar'])){
            if ($objFcn->queryDatas($_POST) == 'ok'){

               foreach ($objFcn->queryDatas() as $row){

                   echo $row['placa'];

               }

            }else{
                echo '<script type="javascript">alert("Erro em buscar entre datas");</script>';
            }
        }

    ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde,

Na minha index.php estou fazendo um foreach, porém não imprime nada, muito menos um erro.

Não sei o que faço para descobrir o que está havendo.

 

Veiculo.class.php

public function queryDatas($dados){

        try{
            $this->dataUm = $dados['dataUm'];
            $this->dataDois = $dados['dataDois'];

            $cst = $this->con->conectar()->prepare("SELECT * FROM `veiculo` WHERE `dataOc` BETWEEN :dataUm AND :dataDois");

            $cst->bindParam(":dataUm", $this->dataUm, PDO::PARAM_STR);
            $cst->bindParam(":dataDois", $this->dataDois, PDO::PARAM_STR);


            if($cst->execute()){

                return $row = $cst->fetchAll(PDO::FETCH_ASSOC);

            }else{
                return 'erro';
            }

        }catch (PDOException $ex){
            return 'error '.$ex->getMessage();
        }

    }

 

index.php

<?php

    if (isset($_POST['btBuscar'])){
        if ($objFcn->queryDatas($_POST) == 'ok'){

            foreach ($objFcn->queryDatas() as $rst) {
                echo $rst['placa'];
            }

        }else{
            echo '<script type="javascript">alert("Erro em buscar entre datas");</script>';
        }
    }

    ?>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Thiago Barraviera, você está fazendo uma verificação sem sentido:

 

if ($objFcn->queryDatas($_POST) == 'ok'){

 

Sua função queryDatas não está retornando "ok" em nenhum momento, por isso seu foreach não será executado. Se você está mandando um array, é importante definir isso na função:

 

public function queryDatas(array $dados){

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.