Jump to content
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"

 

Share this post


Link to post
Share on other 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)

 

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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/

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By DinhoPHP
      Estou tentando enviar um anexo e o mesmo não chega no email, apenas quando não faço uso da função attach.
      arquivo que contém as functions responsáveis pelo envio do email.
      public function attach(string $filePath, string $fileName): Email{ $this->data->attach[$filePath] = $fileName; return $this; } Arquivo que utiliza a função attach.
      No arquivo que captura os dados do formulário, já passei os parâmetros de tudo quanto é jeito.
      require __DIR__ . "/include/head.php"; require __DIR__ . "/vendor/autoload.php"; use Source\Support\Email; $email = new Email(); // CAPTURANDO DADOS DO FORMULÁRIO $nome = trim(ucwords(preg_replace('/\s\s+/', ' ',($_POST['nome-curriculo'])))); $eemail = trim(strtolower(preg_replace('/\s\s+/', ' ',($_POST['email-curriculo'])))); $telefone = trim(preg_replace('/\s\s+/', ' ',($_POST['telefone-curriculo']))); $cidade = trim(preg_replace('/\s\s+/', ' ',($_POST['cidade-curriculo']))); $assunto = trim(preg_replace('/\s\s+/', ' ',($_POST['assunto-curriculo']))); $mensagem = trim(preg_replace('/\s\s+/', ' ',("<pre>".$_POST['mensagem-curriculo']."</pre>"))); // $file_tmp = ($_FILES['file'], $_POST['name']); $files = $_FILES['curriculo']; $email->add($assunto, "<h3>Nome: {$nome}<br>{$files['name']}<br>Email: {$eemail}<br><br>Telefone: {$telefone}<br><br>Cidade: {$cidade}<br><br></br>Mensagem:<br>{$mensagem}</h3>", $nome, $eemail)->attach($files['tmp_name'], $files['name'])->send(); var_dump($files); A função attach que recebe dois parâmetros, quando utilizada, não envia o anexo vindo do form HTML, já digitando os parâmetros na função, ela envia o anexo. Já li até alguns casos semelhantes aqui mesmo e nada! Só envia o anexo digitando os parâmetros manualmente. 
    • By Sapinn
      Como faço para trazer checkbox marcados com os dados do banco eu consigo enviar e cadastrar dados de checkbox marcados em uma tabela  SQL mas não sei como trazer os checkbox marcadas em uma listagem de PHP procedural.
    • By Rafaelmcd
      Olá, tenho um site em WordPress e preciso de uma regra para fazer um redirecionamento em massa, um redirecionamento 301.
      A regra seria mais ou menos assim, alterar links assim: https://site.com/blog/leia-top-games para https://site.com/blog/top-games
      Ou seja, precisa retirar o "leia-" de todos os link e redirecionar para o link novo.
      Alguém poderia me ajudar?
    • By Marcelodiehl
      Boa tarde,
      tenho um código php para envio de documentos para uma área do cliente e no admin onde eu realizo o upload dos documentos tem um input onoffswitch onde eu ativo ou desativo (Quando Ativo = "Mostrar na area dos clientes") mas quando envio um arquivo ele fica por default desativado, então tenho que ativar para que o cliente Visualize o documento. O que eu preciso é que este botão fique Ativado por default, mas não encontro no script onde mudo isso. Peço desculpas pela minha ignorancia em PHP, mas estou iniciando um curso esta semana, não sei muito ainda, mas já tenho este desafio. Alguém poderia me ajudar?
       
      <?php defined('BASEPATH') or exit('No direct script access allowed'); ?> <div class="modal fade" id="customer_file_share_file_with" data-total-contacts="<?php echo count($contacts); ?>" tabindex="-1" role="dialog"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> <h4 class="modal-title"><?php echo _l('share_file_with'); ?></h4> </div> <div class="modal-body"> <?php echo form_hidden('file_id'); ?> <?php echo render_select('share_contacts_id[]',$contacts,array('id',array('firstname','lastname')),'customer_contacts',array(get_primary_contact_user_id($client->userid)),array('multiple'=>true,'data-actions-box'=>true),array(),'','',false); ?> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal"><?php echo _l('close'); ?></button> <button type="button" class="btn btn-info" onclick="do_share_file_contacts();"><?php echo _l('confirm'); ?></button> </div> </div><!-- /.modal-content --> </div><!-- /.modal-dialog --> </div><!-- /.modal --> <h4 class="no-mtop bold"><?php echo _l('customer_attachments'); ?> <br /> <small class="text-info"><?php echo _l('customer_files_info_message'); ?></small> </h4> <hr /> <?php if(isset($client)){ ?> <?php echo form_open_multipart(admin_url('clients/upload_attachment/'.$client->userid),array('class'=>'dropzone','id'=>'client-attachments-upload')); ?> <input type="file" name="file" multiple /> <?php echo form_close(); ?> <div class="text-right mtop15"> <button class="gpicker" data-on-pick="customerGoogleDriveSave"> <i class="fa fa-google" aria-hidden="true"></i> <?php echo _l('choose_from_google_drive'); ?> </button> <div id="dropbox-chooser"></div> </div> <div class="attachments"> <div class="mtop25"> <table class="table dt-table scroll-responsive" data-order-col="2" data-order-type="desc"> <thead> <tr> <th width="30%"><?php echo _l('customer_attachments_file'); ?></th> <th><?php echo _l('customer_attachments_show_in_customers_area'); ?></th> <th><?php echo _l('file_date_uploaded'); ?></th> <th><?php echo _l('options'); ?></th> </tr> </thead> <tbody> <?php foreach($attachments as $type => $attachment){ $download_indicator = 'id'; $key_indicator = 'rel_id'; $upload_path = get_upload_path_by_type($type); if($type == 'invoice' || $type == 'proposal' || $type == 'estimate' || $type == 'credit_note'){ $url = site_url() .'download/file/sales_attachment/'; $download_indicator = 'attachment_key'; } else if($type == 'contract'){ $url = site_url() .'download/file/contract/'; $download_indicator = 'attachment_key'; } else if($type == 'lead'){ $url = site_url() .'download/file/lead_attachment/'; } else if($type == 'task'){ $url = site_url() .'download/file/taskattachment/'; $download_indicator = 'attachment_key'; } else if($type == 'ticket'){ $url = site_url() .'download/file/ticket/'; $key_indicator = 'ticketid'; } else if($type == 'customer'){ $url = site_url() .'download/file/client/'; $download_indicator = 'attachment_key'; } else if($type == 'expense'){ $url = site_url() .'download/file/expense/'; $download_indicator = 'rel_id'; } ?> <?php foreach($attachment as $_att){ ?> <tr id="tr_file_<?php echo $_att['id']; ?>"> <td> <?php $path = $upload_path . $_att[$key_indicator] . '/' . $_att['file_name']; $is_image = false; if(!isset($_att['external'])) { $attachment_url = $url . $_att[$download_indicator]; $is_image = is_image($path); $img_url = site_url('download/preview_image?path='.protected_file_url_by_path($path,true).'&type='.$_att['filetype']); $lightBoxUrl = site_url('download/preview_image?path='.protected_file_url_by_path($path).'&type='.$_att['filetype']); } else if(isset($_att['external']) && !empty($_att['external'])){ if(!empty($_att['thumbnail_link']) && $_att['external'] == 'dropbox'){ $is_image = true; $img_url = optimize_dropbox_thumbnail($_att['thumbnail_link']); } $attachment_url = $_att['external_link']; } if($is_image){ echo '<div class="preview_image">'; } ?> <a href="<?php if($is_image){ echo isset($lightBoxUrl) ? $lightBoxUrl : $img_url; } else {echo $attachment_url; } ?>"<?php if($is_image){ ?> data-lightbox="customer-profile" <?php } ?> class="display-block mbot5"> <?php if($is_image){ ?> <div class="table-image"> <div class="text-center"><i class="fa fa-spinner fa-spin mtop30"></i></div> <img src="#" class="img-table-loading" data-orig="<?php echo $img_url; ?>"> </div> <?php } else { ?> <i class="<?php echo get_mime_class($_att['filetype']); ?>"></i> <?php echo $_att['file_name']; ?> <?php } ?> </a> <?php if($is_image){ echo '</div>'; } ?> </td> <td> <div class="onoffswitch"<?php if($type != 'customer'){?> data-toggle="tooltip" data-title="<?php echo _l('customer_attachments_show_notice'); ?>" <?php } ?>> <input type="checkbox" <?php if($type != 'customer'){echo 'disabled';} ?> id="<?php echo $_att['id']; ?>" data-id="<?php echo $_att['id']; ?>" class="onoffswitch-checkbox customer_file" data-switch-url="<?php echo admin_url(); ?>misc/toggle_file_visibility" <?php if(isset($_att['visible_to_customer']) && $_att['visible_to_customer'] == 1){echo 'checked';} ?>> <label class="onoffswitch-label" for="<?php echo $_att['id']; ?>"></label> </div> <?php if($type == 'customer' && $_att['visible_to_customer'] == 1){ $file_visibility_message = ''; $total_shares = total_rows(db_prefix().'shared_customer_files',array('file_id'=>$_att['id'])); if($total_shares == 0){ $file_visibility_message = _l('file_share_visibility_notice'); } else { $share_contacts_id = get_customer_profile_file_sharing(array('file_id'=>$_att['id'])); if(count($share_contacts_id) == 0){ $file_visibility_message = _l('file_share_visibility_notice'); } } echo '<span class="text-warning'.(empty($file_visibility_message) || total_rows(db_prefix().'contacts',array('userid'=>$client->userid)) == 0 ? ' hide': '').'">'.$file_visibility_message.'</span>'; if(isset($share_contacts_id) && count($share_contacts_id) > 0){ $names = ''; $contacts_selected = ''; foreach($share_contacts_id as $file_share){ $names.= get_contact_full_name($file_share['contact_id']) .', '; $contacts_selected .= $file_share['contact_id'].','; } if($contacts_selected != ''){ $contacts_selected = substr($contacts_selected,0,-1); /**na linha abaixo em </a> ' . _l('share_file_with_show, trocando o _1 por 0 desabilita envio */ } if($names != ''){ echo '<a href="#" onclick="do_share_file_contacts(\''.$contacts_selected.'\','.$_att['id'].'); return false;"><i class="fa fa-pencil-square-o"></i></a> ' . _l('share_file_with_show',mb_substr($names, 0,-2)); } } } ?> </td> <td data-order="<?php echo $_att['dateadded']; ?>"><?php echo _dt($_att['dateadded']); ?></td> <td> <?php if(!isset($_att['external'])){ ?> <button type="button" data-toggle="modal" data-file-name="<?php echo $_att['file_name']; ?>" data-filetype="<?php echo $_att['filetype']; ?>" data-path="<?php echo $path; ?>" data-target="#send_file" class="btn btn-info btn-icon"><i class="fa fa-envelope"></i></button> <?php } else if(isset($_att['external']) && !empty($_att['external'])) { echo '<a href="'.$_att['external_link'].'" class="btn btn-info btn-icon" target="_blank">'.($_att['external'] == 'dropbox' ? '<i class="fa fa-dropbox"></i>' : '<i class="fa fa-google"></i>').'</a>'; } ?> <?php if($type == 'customer'){ ?> <a href="<?php echo admin_url('clients/delete_attachment/'.$_att['rel_id'].'/'.$_att['id']); ?>" class="btn btn-danger btn-icon _delete"><i class="fa fa-remove"></i></a> <?php } ?> </td> <?php } ?> </tr> <?php } ?> </tbody> </table> </div> </div> <?php include_once(APPPATH . 'views/admin/clients/modals/send_file_modal.php');  
    • By jdlucena
      Eu tenho um sistema em php e utilizei esse site http://www.pipsomania.com/best_php_obfuscator.do para ofuscar meu código.
       
      Porém, acabei perdendo o código original que estava no hd externo e agora o hd não funciona mais.
       
      Alguém conhece uma forma de reverter o código ofuscado? Entrei em contato com o desenvolvedor do site pipsomania.service@gmail.com mas não tive retorno.
       
      Exemplo de como ficou meu código:
      <?php ${"G\x4c\x4f\x42ALS"}["\x76v\x66\x68\x74\x77c\x73\x69\x70\x66"]="\x6c\x6f\x67i\x6e";if(version_compare(PHP_VERSION,"\x35\x2e3\x2e7","<")){exit("\x53\x6frry,\x20\x53i\x6d\x70le\x20\x50\x48P\x20\x4c\x6fgi\x6e\x20d\x6f\x65\x73\x20n\x6ft \x72un\x20on a P\x48P\x20v\x65r\x73\x69on \x73m\x61ller t\x68\x61n 5\x2e3\x2e7\x20\x21");}else if(version_compare(PHP_VERSION,"5\x2e\x35.0","<")){require_once("li\x62\x72\x61\x72\x69e\x73/p\x61\x73\x73\x77or\x64\x5f\x63om\x70ati\x62i\x6c\x69ty\x5f\x6c\x69b\x72a\x72y.\x70h\x70");}require_once("c\x6fn\x66\x69g/db\x2eph\x70");require_once("c\x6ca\x73se\x73/\x4cogin\x2ep\x68\x70");${${"GLOB\x41L\x53"}["v\x76f\x68\x74w\x63s\x69\x70\x66"]}=new Login();include("\x76\x69ew\x73/\x69n\x64\x65x.\x70\x68p"); ?>  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.