Ir para conteúdo
danipereira

[Resolvido] Dúvida básica de foreach

Recommended Posts

Dúvida bem básica:

Tenho duas tabelas: produtos e reservas. Preciso listar os produtos que NÃO constam na reserva por um determinada período.

Faço  com um innerJoin e um foreach de produtos com if($produto!=$reserva_id)   ou dois foreach sendo um com reservas e depois nos produtos != reservas naquele período?

Não tou conseguindo fazer a listagem corretamente.

-----PRODUTO--------------RESERVAS------------
produto_id               reserva_id
produto_nome             produto_id
produto_status           data_reserva
------------------------------------------------
"SELECT imoveis.imv_id, imoveis_reservas.imv_id FROM imoveis INNER JOIN imoveis_reservas ON imoveis.imv_id =imoveis_reservas.imv_id"

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ambas as tratativas não irão funcionar, este não é o propósito do INNER JOIN.

 

Se você quiser resultados que estão em uma tabela, mas, não estão em outra, utilize a cláusula NOT IN ou NOT EXISTS. O último sendo um pouco mais rápido que o primeiro.

 

IN

SELECT 
    * 
FROM 
    table1
WHERE
    table1.id NOT IN (SELECT table1id FROM table2);

Exists:

SELECT 
    * 
FROM 
    table1
WHERE
    NOT EXISTS (SELECT 'x' FROM table2 WHERE table2.table1id = table1.id)

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel, agradeço muito pela resposta e peço desculpa pela demora.

Agora lhe faço uma pergunta: se quiser comparar o mesmo período em dois campos da tabela, como faço?

o período digitado precisa ser pesquisado na data de entrada e data de saida.

Tentei desta maneira mais não funciona:

"SELECT * from imoveis WHERE NOT EXISTS (SELECT * from imoveis_calendario WHERE imoveis_calendario.imv_id = imoveis.imv_id and start BETWEEN '2018-05-22' AND '2018-05-28' OR end BETWEEN '2018-05-22' AND '2018-05-28')"

Se faço apenas o select interno retorna o resultado correto:

SELECT * from imoveis_calendario WHERE start BETWEEN '2018-05-22' AND '2018-05-28' OR end BETWEEN '2018-05-22' AND '2018-05-28'

Se puder me ajudar, agradeço muito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que exatamente você quer comparar nesses períodos. Pois, normalmente, em um período é comparado apenas a data atual.

 

Explique como quer comparar, para entedermos o que deve ser feito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Gabriel.

Então, na verdade eu estava  errada, preciso apenas um between no período de saida, o de entrada não importa.

Eu tenho um form de busca que o hóspede procura imóveis que estejam disponível.

Ele digita um período - start e end e faço a pesquisa listando apenas os imóveis disponíveis.

AI no caso eu procuro apenas na DATA DE SAIDA o intervalo que o hóspede selecionar.

"SELECT * from imoveis WHERE NOT EXISTS (SELECT * from imoveis_calendario WHERE imoveis_calendario.imv_id = imoveis.imv_id and end BETWEEN '2018-05-22' AND '2018-05-28')"

Agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que tenha resolvido então?

 

só uma dica, não retorne asterísco (*) no select do exists. Adicione um valor simples, como foi no exemplo (SELECT 'x'). Ai não precisará retornar dados reais, tornando a consulta mais rápida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, tudo bem ? espero que sim.

 

Abaixo segue parte do Código que uso o INNER JOIN.

<?php
  //Faço conexão com o MySql
   $sql_pegaAtivos = 'SELECT pro.codProdClie, pro.produtoDescr, pro.apres_unid, pro.clienteId,
                              cota.cotaId, cota.cotaItensId, cota.cotaNumImport, cota.cotaNumero, cota.cotaQtde, cota.cotaComenta, 
                              cota.codProdClie
                         FROM cotacaoItens cota
                   INNER JOIN produto pro ON pro.codProdClie = cota.codProdClie
                        WHERE pro.clienteId = :clienteId 
                          AND cota.cotaNumero = :cotaNumero                           
                     ORDER BY cota.cotaItensId ASC'; 
                
       try{
         $query_pegaAtivos = $conecta->prepare($sql_pegaAtivos);
         $query_pegaAtivos->bindValue(':clienteId',$clienteId,PDO::PARAM_STR);
         $query_pegaAtivos->bindValue(':cotaNumero',$cotaNumero,PDO::PARAM_STR);         
         $query_pegaAtivos->execute();
         
         $resultado_pegaAtivos = $query_pegaAtivos->fetchAll(PDO::FETCH_ASSOC);
         $count_pegaAtivos = $query_pegaAtivos->rowCount(PDO::FETCH_ASSOC);

         }catch(PDOexception $error_pegaAtivos){
              echo 'Erro ao pegar ativos';
         }
         
        //Trago os dados usando o Foreach
         foreach($resultado_pegaAtivos as $resAtivos){
                 $cotaId        = $resAtivos['cotaId'];             
                 $clienteId     = $resAtivos['clienteId'];              
                 $cotaItensId   = $resAtivos['cotaItensId'];        
                 $cotaNumero    = $resAtivos['cotaNumero'];                    
                 $cotaNumImport = $resAtivos['cotaNumImport'];
                 $codProdClie   = $resAtivos['codProdClie'];
                 $cotaQtde      = $resAtivos['cotaQtde'];  
                 $cotaComenta   = $resAtivos['cotaComenta'];                  
                 $descrProd     = $resAtivos['produtoDescr'];
                 $apresProd     = $resAtivos['apres_unid'];
             
         }


?>

 

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu posso usar o between desta maneira?

SELECT imv_id,data_start,data_end FROM imoveis_calendario WHERE '2018-06-16' BETWEEN  data_start AND data_end OR '2018-09-15' BETWEEN data_start and data_end 

São duas datas Data de entrada e Data de saida eu preciso verificar os imoveis que estarão ocupados em um período.

Similar os site: https://www.booking.com/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que lógica é mais para esta aqui:

data_start BETWEEN '2018-06-16' AND '2018-09-15'
OR data_end BETWEEN '2018-06-16' AND '2018-09-15' 
OR (data_start < '2018-06-16' AND data_end > '2018-09-15')

Basicamente a lógica é a seguinte:

  • Data de início está no período da pesquisa;
  • Data de término está no período da pesquisa;
  • As datas de reserva abrangem um período maior que o solicitado.

É a terceira lógica que você está deixando de lado. Por exemplo, eu estou pesquisando no período de  10/05/2018 até 20/05/2018. Se alguém fez uma reserva em um perído maior (09/05/2018 até 21/05/2018), sua consulta não iria considerá-lo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa, por isso que não listava alguns que deveria listar! ...quebrando a cabeça aqui!

Então na verdade usando o NOT IN por exemplo, fica assim:

"SELECT imv_id AS Id FROM imoveis WHERE imv_id NOT IN (SELECT imv_id FROM 
imoveis_calendario WHERE imv_id =imoveis.imv_id  AND start BETWEEN 
'2018-05-12' AND '2018-05-22' OR end BETWEEN '2018-05-12' AND '2018-05-22')"

Agradeço.

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

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por BTK
      Boa noite, estou tentando criar um curl que faz cadastro no site(o proprietário está ciente disso) porem ele está me retornando (HTTP/1.1 100 Continue HTTP/1.1 302 Moved Temporarily)

       $ch = curl_init();   
          
                                                                                                                     
          curl_setopt($ch, CURLOPT_URL, "https://www.cafefacil.com.br/customer/account/create/");                                     
          curl_setopt($ch, CURLOPT_HEADER, true);                                                                                                   
          curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36');                                                                                                                                               
          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);                                                                                         
          curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);                                                                                       
          curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);                                                                                       
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
          curl_setopt($ch, CURLOPT_COOKIESESSION, true);                                                                             
          curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd().'/cafefacil.txt');
          curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd().'/cafefacil.txt'); 
          
          
          
          
          $b1 = curl_exec($ch);
          
          $form_key = value($b1, 'type="hidden" name="form_key" value="', '"');
          
          curl_setopt($ch, CURLOPT_URL, 'https://www.cafefacil.com.br/customer/account/createpost/');                                     
          curl_setopt($ch, CURLOPT_HEADER, true);                                                                                                   
          curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36');                                                                                                                                                  
          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);                                                                                         
          curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);                                                                                    
          curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);                                                                                       
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
          curl_setopt($ch, CURLOPT_COOKIESESSION, true);   
          curl_setopt($ch, CURLOPT_REFERER, 'https://www.cafefacil.com.br/customer/account/create/');                                                                           
          curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd().'/cafefacil.txt');
          curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd().'/cafefacil.txt'); 
          curl_setopt($ch, CURLOPT_POST, 1);                                                                                                    
          $boundary = '---------------------------WebKitFormBoundaryRQ3KHJbpfmPf11v6';
          
          $data = '-----------------------------'.$boundary.'
          Content-Disposition: form-data; name="success_url"
          
          
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="error_url"
          
          
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="form_key"
          
          '.$form_key.'
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="tipopessoa"
          
          15
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="firstname"
          
          NomeTest SobreNomeTest
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="nomefantasia"
          
          
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="inscricaoestadual"
          
          
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="email"
          
          nometestsobrenometest@gmail.com
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="day"
          
          01
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="month"
          
          01
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="year"
          
          1990
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="dob"
          
          01/01/1990
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="taxvat"
          
          199.758.750-50
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="celular"
          
          (11)4712-8491
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="password"
          
          senhatest
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="confirmation"
          
          senhatest
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="persistent_remember_me"
          
          on
          -----------------------------'.$boundary.'--';
          
          $header[] = "Content-Type: multipart/form-data; boundary=".$boundary;
          curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
          curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
          
            
          echo $exec = curl_exec($ch);
          curl_close($ch);
    • Por allencar.limma
      Tento incluir as informações de um formulário no banco de dados e não consigo. conforme código abaixo.
      <? /*Incluir as informações no formulario */ include "config.php"; $nome = trim($_POST['nome']); $masp = trim($_POST['masp']); $cpf = trim($_POST['cpf']); $telefone = trim($_POST['telefone']); $email = trim($_POST['email']); $endereco = trim($_POST['endereco']); $data_nascimento = trim($_POST['data_nascimento']); $unidade_lotacao = trim($_POST['unidade_lotacao']); /* Vamos checar algum erro nos campos */ if ((!$nome) || (!$masp) || (!$cpf) || (!$telefone) || (!$email) || (!$endereco) || (!$data_nascimento) || (!$unidade_lotacao)){ echo "ERRO: <br /><br />"; if (!$nome){ echo "Nome Completo é requerido.<br />"; } if (!$masp){ echo "Masp é requerido.<br />"; } if (!$cpf){ echo "CPF é requerido.<br /)>"; } if (!$telefone){ echo "Telefone é requerido.<br />"; } if (!$email){ echo "Email é requerido.<br />"; } if (!$endereco){ echo "Endereço é requerido.<br />"; } if (!$data_nascimento){ echo "Data de Nascimento é requerido.<br />"; } if (!$unidade_lotacao){ echo "Unidade de Lotação é requerido.<br>"; } echo "Preencha os campos abaixo: <br />"; include "formulario_cadastro.php"; }else { /* Vamos checar se o nome de Usuário escolhido e/ou Email já existem no banco de dados */ $sql_email_check = mysql_query( "SELECT COUNT(usuario_id) FROM usuarios WHERE email='{$email}'" ); $sql_masp_check = mysql_query( "SELECT COUNT(usuario_id) FROM usuarios WHERE masp='{$masp}'" ); $sql_cpf_check = mysql_query( "SELECT COUNT(usuario_id) FROM usuarios WHERE cpf='{$cpf}'" ); $eReg = mysql_fetch_array($sql_email_check); $uReg = mysql_fetch_array($sql_masp_check); $uReg = mysql_fetch_array($sql_cpf_check); $email_check = $eReg[0]; $masp_check = $uReg[0]; $cpf_check = $uReg[0]; if (($email_check > 0) || ($masp_check > 0) || ($cpf_check > 0)){ echo "<strong>ERRO</strong>: <br /><br />"; if ($email_check > 0){ echo "Este email já está sendo utilizado.<br /><br />"; unset($email); } if ($masp_check > 0){ echo "Este Masp já está sendo utilizado.<br /><br />"; unset($masp); } if ($cpf_check > 0){ echo "Este CPF já está sendo utilizado.<br /><br />"; unset($cpf); } include "formulario_cadastro.php"; }else{ /* Se passarmos por esta verificação ilesos é hora de finalmente cadastrar os dados. Vamos utilizar uma função para gerar a senha de forma randômica*/ function makeRandomPassword(){ $salt = "abchefghjkmnpqrstuvwxyz0123456789"; srand((double)microtime()*1000000); $i = 0; while ($i <= 7){ $num = rand() % 33; $tmp = substr($salt, $num, 1); $pass = $pass . $tmp; $i++; } return $pass; } $senha_randomica = makeRandomPassword(); $senha = md5($senha_randomica); // Inserindo os dados no banco de dados //$cpf = htmlspecialchars($cpf); ***RETIRADO PELO FATO DE NÃO ESTA SENDO USADO $sql = mysql_query( "INSERT INTO usuarios (none, masp, cpf, telefone, email, endereco, data_nascimento, unidade_lotacao) VALUES ('$nome', '$masp', '$cpf', '$telefone', '$email', '$endereco', '$data_nascimento', '$unidade_lotacao', now())") or die( mysql_error() ); if (!$sql){ echo "Ocorreu um erro ao criar sua conta, entre em contato."; }else{ $usuario_id = mysql_insert_id(); // Enviar um email ao usuário para confirmação e ativar o cadastro! $headers = "MIME-Version: 1.0\n"; $headers .= "Content-type: text/html; charset=iso-8859-1\n"; $headers .= "From: RCI - <rci@rcionline.com.br>"; $subject = "Confirmação de cadastro - www.rcionline.com.br"; $mensagem = "Prezado {$nome} {$masp},<br /> Obrigado pelo seu cadastro em nosso site, <a href='http://www.rcionline.com.br'> http://www.rcionline.com.br</a>!<br /> <br /> Para confirmar seu cadastro e ativar sua conta em nosso site, podendo acessar à áreas exclusivas, por favor clique no link abaixo ou copie e cole na barra de endereço do seu navegador.<br /> <br /> <a href='http://www.rcionline.com.br/ativar.php?id={$usuario_id}&code={$senha}'> http://www.rcionline.com.br/ativar.php?id={$usuario_id}&code={$senha} </a> <br /> <br /> Após a ativação de sua conta, você poderá ter acesso ao conteúdo exclusivo efetuado o login com os seguintes dados abaixo:<br > <br /> <strong>Usuario</strong>: {$usuario_id}<br /> <strong>Senha</strong>: {$senha_randomica}<br /> <br /> Obrigado!<br /> <br /> Webmaster<br /> <br /> <br /> Esta é uma mensagem automática, por favor não responda!"; mail($email, $subject, $mensagem, $headers); echo "Foi enviado para seu email - ( ".$email." ) um pedido de confirmação de cadastro, por favor verifique e sigas as instruções!"; } } } ?>  
    • Por vinicius.david
      Gostaria que fosse possível encontrar produtos pela marca no Opencart 2.3.0.2. Quando a pessoa digitar no buscar a marca do produto, ele deveria mostrar todos os produtos que pertencem aquela marca. Em catalog/model/catalog/product.php já existe por padrão a função de procurar por fabricante: 

      if (!empty($data['filter_manufacturer_id'])) {                 $sql .= " AND p.manufacturer_id = '" . (int) $data['filter_manufacturer_id'] . "'";             }
      Mas ela não faz a função de procurar por marca. Alguém já encontrou alguma solução na internet para este caso?
    • Por manolegal
      Bom dia.
      Recebo em meu formulário um dado em forma de url.
      Extraio desta url o CNPJ da empresa. A seguir faço uma pesquisa para verificar se este CNPJ está em minha base de dados, sendo que se estiver trago dados da empresa para preenchimento do campo empresa do formulário.
      Estando a empresa no BD, consigo trazer os dados corretamente, porém estes dados não passados para o formulário para serem o valor inicial do campo empresa.
      $cnpj_numero = 12345678910; $Sql_cnpj = "SELECT id_empresa as id_empresa_bd_ext, upper(empresas.empresa) as fornecedor_bd_ext FROM empresas WHERE empresas.cnpj = '$cnpj_numero'"; $Resultado_cnpj = executa($Sql_cnpj); while ($linha_cnpj = pg_fetch_array($Resultado_cnpj)){ $empresa_bd_ext = $linha_cnpj["fornecedor_bd_ext"]; $forn_hid_bd_ext = $linha_cnpj["id_empresa_bd_ext"]; } echo "Fornecedor BD: $empresa_bd_ext - $forn_hid_bd_ext<br><hr>"; // Está mostrando dados corretamente // Definir valor a ser recebido pelo campo Empresa do Formulário if ($cnpj_numero != ""){ $empresa = $empresa_bd_ext; $forn_hid = $forn_hid_bd_ext; }else{ // Caso url não tenha trazido CNPJ, atribuo outro valor $empresa = $empresa_bd; $forn_hid = $forn_hid_bd; } O campo empresa do formulário não está recebendo o valor de $empresa. Considerando que exista um CNPJ, onde pode estar o problema?
    • Por edvaldo123
      Olá para todos, preciso de um código em PHP ou HMTL que mostre cotações de moedas, pra colocar em um site de notícias. Vou deixar um link abaixo onde tem exatamente o que preciso, porém queria remover algumas linhas desse código para não identificar seu site de origem.

      http://www.precododolar.com/widgets/cotacao.php
×

Informação importante

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