Jump to content
betomunhoz

uma cláusula if não está dando certo

Recommended Posts

bom estou fazendo um codigo simples de um app de consulta de preço tipo de mercado, porém não estou conseguindo fazer o if para quando não encontrar o código de barras no banco de dados apresentar a mensagem de código não encontrado, ele está apresentando a mensagem em qualquer codigo que passo... abaixo esta o código:

<div align="center" style="color:#0000FF">
<?php
    $servidor = "localhost";
    $usuario = "root";
    $senha = "senha1";
    $dbname = "teste";
    //Criar a conexao
    $conn = mysqli_connect($servidor, $usuario, $senha, $dbname);
    
    $pesquisar = $_POST['pesquisar'];
    $result_produtos = "select * from cadpro inner join arqbar where cadpro.codpro01=arqbar.codpro and arqbar.codbarra='$pesquisar'";
    $resultado_produtos = mysqli_query($conn, $result_produtos);
    
    if($result_produtos = 0) {
        while($rows_produtos = mysqli_fetch_array($resultado_produtos)){
        echo '<font size="20" style="color:#000000"'.">";
        echo "".$rows_produtos['descpro01']."<br>";
        echo '<font size="20" style="color:#FF0000"'.">";
        echo 'R$  ' . number_format($rows_produtos['prevend01'], 2, ',', '.');
    }
        } 
    else {
        echo '<font size="20" style="color:#FF0000"'.">";
        echo "PRODUTO NÃO LOCALIZADO!";
    }
        
?>
</div>

    <script>
    window.setTimeout("history.back(-2)", 3000);
    </script>   

 

Edited by Matheus Tavares
Adicionar marcação para código

Share this post


Link to post
Share on other sites

Olá @betomunhoz, seja bem-vindo.

if($result_produtos = 0) {

Essa linha está completamente incorreta.

 

1 - Você está atribuindo 0 à variável, e não fazendo uma verificação/validação/comparação. Você deveria estar utilizando "==" ou "===".

 

2 - $result_produtos contém apenas a consulta em String (texto puro). Você precisa trabalhar em cima do mysqli_query, que está em $resultado_produtos.

 

Para verificar se não foram encontrados registros, você deveria fazer assim:

// "> 0" é opcional, mas fica mais fácil de entender...
if ( mysqli_num_rows( $resultado_produtos ) > 0 ) {

Veja o exemplo do manual: http://php.net/manual/pt_BR/mysqli.query.php

  • +1 1

Share this post


Link to post
Share on other sites

Blz?

 

Outra solução:

if($resultado_produtos) { .... echo "produto encontrado"; } else { .... echo "nenhum produto encontrado"; }

Se não tiver nenhum retorno, o próprio IF identificará que a string está vazia, pois não retornou nenhum resultado, ou pelo contrário é verdadeira.

 

Abraços.

Share this post


Link to post
Share on other sites
48 minutos atrás, leomarriel disse:

Se não tiver nenhum retorno, o próprio IF identificará que a string está vazia, pois não retornou nenhum resultado, ou pelo contrário é verdadeira.

Na verdade, não.

 

O retorno do mysqli_query é:

Citar

Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.

 

Isso significa que verificar somente se ela possui um valor pseudo-verdadeiro apenas iria dizer se a consulta está correta.

 

Resumindo, se a consulta fosse absurda como:

SELECT * FROM `tabela` WHERE `id` = 1 AND `id` != 1

Ainda assim o if iria permitir o prosseguimento da execução.

 

O ideal mesmo seria verificar ambos: se mysqli_query não é FALSE e a quantidade de registros de num_rows é maior que zero.

Mas se confiarmos que a consulta está correta, num_rows é suficiente...

Share this post


Link to post
Share on other sites
17 minutos atrás, Matheus Tavares disse:

Na verdade, não.

 

O retorno do mysqli_query é:

 

Isso significa que verificar somente se ela possui um valor pseudo-verdadeiro apenas iria dizer se a consulta está correta.

 

Resumindo, se a consulta fosse absurda como:


SELECT * FROM `tabela` WHERE `id` = 1 AND `id` != 1

Ainda assim o if iria permitir o prosseguimento da execução.

 

O ideal mesmo seria verificar ambos: se mysqli_query não é FALSE e a quantidade de registros de num_rows é maior que zero.

Mas se confiarmos que a consulta está correta, num_rows é suficiente...

Show...

 

Utilizo da forma que apresentei e me atende perfeitamente, utilizo codeigniter portanto ele informaria se a consulta apresentasse algum erro. Vai do contexto da aplicação e da necessidade. Na realidade que ele apresentou, funcionaria, mas poderia ocorrer um erro na consulta e não retornaria valor algum, então ele não identificaria se foi um erro na consulta ou se o produto realmente não existe.

 

Seguindo uma aplicação para extrair mais condições, antecipando algum problema futuro, o correto seria:

 

 if ($resultado_produtos)
  {
   if(mysqli_num_rows( $resultado_produtos ) > 0) { echo "Produto encontrado"; }
  else { echo "Produto não encontrado"; }
  }
else
    { echo "Erro na consulta."; }

Dessa forma se houver algum erro, teria como identificar em que etapa o mesmo ocorreu e retornar uma mensagem mais exata.

 

Abraços.

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 Marcos PP
      Tenho uma tabela onde pego todos pedidos realizados no dia, porem mostro todos em uma tabela, ate ai tudo bem, mas o cliente precisa que seja agrupado por quem pediu, vou dar um exemplo,

      Na minha tabela tenho 

      ID_PEDIDO  |  ID_USER_PEDIDO |  PEDIDO
      1                   |   20                           |   524
      5                   |   52                           |   258
      2                   |   35                           |   525
      6                   |   52                           |   253
      3                   |   20                           |   658
      4                   |   20                           |   358

      No resultado me aparece conforme consulta e me mostra todos os pedidos em ordem de pedido
      SELECT * FROM pedidos  ORDER BY ID_PEDIDO ASC
       
      Se eu colocar um GROUP BY ID_USER_PEDIDO vai agrupar os pedidos de acordo com o usuário e mo mostrar apenas 1


      Eu preciso que seja mostrado todos eles porem agrupados na mesma linha da tabela
       
      <table id="datatable1" class="table display responsive "> <thead> <tr> <th class="">ID</th> <th class="">ID do usuario</th> <th class="">Pedido</th> </tr> </thead> <tbody> <?php $sql = "SELECT * FROM pedidos  ORDER BY ID_PEDIDO ASC"; $result = $conn->query($sql); while($row = $result->fetch_assoc()) { ?> <tr> <td><?php echo $row["ID_PEDIDO"];?></td> <td><?php echo $row["ID_USER_PEDIDO"];?></td> <td><?php echo $row["PEDIDO"];?></td> </tr> <?php } ?> </tbody> </table> E que seja exibido conforme esta imagem
       

    • By gersonab
      Bom dia, tenho 2 tabelas editáveis em uma div, estas funcionam normalmente, o problema é que o loop não acontece , só carrega sobre 1 item, sendo que este eu posso ter mais itens.
       na página principal tenho:
      <div class="carregadados"></div> function fetch_data() { $.ajax({ url:"../lista/finan.php", method:"POST", success:function(data){ $('.carregadados').html(data); } }); } fetch_data(); a página a ser carregada esta assim:
      <?php session_start(); require_once('config.php'); $output = ''; $idc1=$_SESSION['idc']; $sql01 = "SELECT * FROM porcent WHERE idfcli='$idc1'"; $result = mysqli_query($con, $sql01); while($user41 = mysqli_fetch_array($result)){ // primeiro while onde seleciono os itens da pessoa podendo ter vários $output .= ' <div class="table-responsive mb-4 mt-4"> Aqui vem os dados da pessoa '; $id1= $user41["idproc"]; $sqladv = "SELECT * FROM poradv WHERE procav='$id1'"; $resulta = mysqli_query($con, $sqladv); $output .= ' <table class="table table-bordered table-hover table-striped" style="width:100%"> <thead> <tr> </tr> </thead> <tbody>'; if(mysqli_num_rows($resulta) > 0) { while($usera = mysqli_fetch_array($resulta)){ //segundo while onde tenho os dados de venda em uma tabela editavel $output .= ' <tr> </tr>'; } $output .= ' <tr> // insiro linhas caso precise </tr> '; } else { $output .= '<tr> // caso não tenha nada inserido, posso fazer por aqui </tr> '; } $output .= '</tbody> </table>'; $id2= $user41["idproc"]; $sql = "SELECT * FROM parcelas WHERE procid='$id2' ORDER BY datapar, idpar ASC"; $result = mysqli_query($con, $sql); $output .= ' <table class="table table-bordered table-hover table-striped" style="width:100%"> <thead> <tr> // tabela de pagamentos editavel </tr> </thead> <tbody>'; if(mysqli_num_rows($result) > 0) { while($row = mysqli_fetch_array($result)) { //terceiro while , tabela referente a pagamentos $output .= ' <tr> // tabela pagamentos </tr>'; } $output .= ' <tr> // insiro linhas caso precise </tr> '; } else { $output .= '<tr> // caso não tenha nada inserido, posso fazer por aqui </tr> '; } $output .= '</tbody> </table> </div> '; } echo $output; ?> só esta carregando uma vez , tudo dentro da parte editável esta funcionando, porém no primeiro while só faz 1 loop, os demais estão funcionando perfeitamente.
      desde já agradeço qualquer ajuda.
    • By diagphp
      Olá amigos, sou muito novo no assunto de consultar APIs em PHP, então gostaria por gentileza de uma ajuda.
       
      Tem uma api externa que devemos consultar, mas está retornando o erro: PHP Fatal error: Uncaught Error: Class 'GuzzleHttp\Client' not found in /home1/

      A hospedagem é Hostgator.
       
       
      A consulta é simples:
       
      <?php
      $client = new \GuzzleHttp\Client();
      $response = $client->get("https://api.centraldofrete.com/v1/cargo-type", [
          'headers' => [
                  'Authorization' => '{token do cliente}',
              ],
      ]);
      $body = $response->getBody();
      print_r(json_decode((string) $body));
      ?>
       
      Alguém poderia me ajudar a fazer este tipo de consulta e obter o retorno da API? Tem algum arquivo a mais que tenho que colocar no servidor?
       
      Agradeço a  ajuda!
    • By Camilavip
      Oi, como consigo fazer uma página de erro ou redirecionamento ou aviso, caso alguém clique em um cadastro que já não existe ou não tenha?
      localhost/clientes/12/ricardo No exemplo acima eu clico no cliente com esse id 12 e abre os dados dele, mas se eu o excluir mas estiver com o link e colocar no navegador, ele abre a página, sem os dados dele, mas abre. Eu queria se caso não tivesse mais o id cadastrado, abrisse algo como nenhum cadastro encontrado ou existente.
    • By mamotinho
      Olá, gostaria de sabe como posso fazer uma contagem regressiva apartir de um registro em meu banco de dados eu tentei montar um código da seguinte forma:

       
      <? $DateGET = date('m/d/Y H:i A', strtotime($result->DateDiscount)); ?> <script> var valueDate = <?=$DateGET?>; var end = new Date(valueDate); var _second = 1000; var _minute = _second * 60; var _hour = _minute * 60; var _day = _hour * 24; var timer; function showRemaining() { var now = new Date(); var distance = end - now; if (distance < 0) { clearInterval(timer); document.getElementById("countdown").innerHTML = "EXPIRED!"; return; } var days = Math.floor(distance / _day); var hours = Math.floor((distance % _day) / _hour); var minutes = Math.floor((distance % _hour) / _minute); var seconds = Math.floor((distance % _minute) / _second); document.getElementById("countdown").innerHTML = "<span class='n_date day' id='days'>" + days + "</span><span class='date'>일</span>"; document.getElementById("countdown").innerHTML += "<span class='n_time hour' id='hrs'>" + hours + "</span>"; document.getElementById("countdown").innerHTML += "<span class='n_time minute' id='minus'>" + minutes + "</span>"; document.getElementById("countdown").innerHTML += "<span class='n_time second' id='secs'>" + seconds + "</span>"; } timer = setInterval(showRemaining, 1000); </script> Mais infelizmente não passou a data registrada no banco de dados, alguém teria ideia de como posso ta fazendo.
×

Important Information

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