Jump to content
lealdl

Consulta usando fetch_array só retorna um registro

Recommended Posts

lealdl

Pessoal, estou quebrando a cabeça, alguém poderia me ajudar?

Preciso filtrar o consumo dos hóspedes de um hotel, criei uma consulta, mas só está me retornando um registro (o primeiro).

eis meu código:

<?php
$conn  = mysqli_connect('localhost','root','','reservas');

$busca =  $_POST['busca'];

$query =mysqli_query($conn,"SELECT hospede, quarto, produto, qtde, valor_unit,
       total, sum(total)  as soma from consumo WHERE quarto LIKE '%$busca%'");
       
//$query = mysqli_query($conn, "SELECT distinct * FROM consumo WHERE quarto LIKE '%$busca%'");
$num   = mysqli_num_rows($query);
if($num >=0){

    while($row = mysqli_fetch_array($query)){
      
    echo $row['produto'];
    
    }

    //echo '  Quarto:  '.'</br>'. $row['quarto'].'<br/>'. ' HÓSPEDE:  '.$row['hospede'].'</br>'.' PRODUTO '.$row['produto'].'<BR/>'.'QTDE:  ' .$row['qtde'].'  VALOR      '.$row['valor_unit'].'<BR/>'.'TOTAL QUARTO      '.'<BR/>'.$row['soma'].'<br /><hr>';        
}else{


  echo "Registro não Encontrado!";
}

?>

*filtro em um campo digitando o numero do quarto, mas retorna somente um registro. Por exemplo, um hóspede consumiu 5 produtos, mas só me retorna o primeiro.

Onde estou errando no código?

Fico grato desde já, abraços

Luciano

 

Share this post


Link to post
Share on other sites
M6

Já executaste a query diretamente no MySQL para confirmar que a mesma está correta?

  • Vote 1

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
lealdl

Olá, M6! Grato pela resposta! Sim, executo "SELECT hospede, quarto, produto, qtde, valor_unit,
       total, sum(total)  as soma from consumo WHERE quarto = 102", por exemplo. A query me retorna somente um registro, sendo que há vários produtos nesse mesmo quarto.

Não deveria retornar todos? 

Share this post


Link to post
Share on other sites
lealdl

Olá,"HappyHippyHippo" !

Lista todos os registros, mas não executa a soma total. Tenho somente o campo total individual.

Gostaria que me apresentasse assim, por exemplo: 

Quarto 102

Produto:

amendoim       Qtde 2  Valor Unit: 3,00  Total Item :      6,00

coca-cola lata  Qtde 2  Valor Unit: 3,50  Total Item :      7,00

                                                                Total Quarto : 13,00

Share this post


Link to post
Share on other sites
M6

Não consegues fazer isso só com uma query simples.

Ou agrupas os dados, com o sum, ou listas os dados.

Para fazeres o que queres tens de usar algo do tipo "left join" com duas queries, uma para listar os dados e outra para calcular o sum. Mas tens de ter atenção de que isso vai repetir o valor do sum em todas as linhas.

Edited by M6
Submeti sem querer antes de concluir a resposta.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
lealdl

Muito obrigado, vou reanalisar a query. Em princípio, achei que fosse algo com a query estar fora do laço. Não sou muito bom nessa lógica, mas vou dar uma estudada. 

Mas outra dúvida... se retornar algo assim... 

quarto1

 

produto   valor_unit qtde valor valor

quarto2

produto   valor_unit qtde valor valor

quarto3

produto   valor_unit qtde valor valor

 

Share this post


Link to post
Share on other sites
lealdl

Não tenho a mínima idéia de como montar esse left join, considerando que os campos fazem parte de uma mesma tabela :(

Share this post


Link to post
Share on other sites
M6

Tens de ter em atenção que o SQL é uma linguagem de exploração de dados, ou seja, retorna informação existente na base de dados não tem como objetivo devolver informação formatada para apresentação.

Para usares uma tabela mais de uma vez numa query, basta dares um alias "... from tabela as t1, tabela as t2 ...", depois referes as tabelas pelo seu alias.

Podes também fazer uma view com o group by, por exemplo, e depois fazes o left join.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
lealdl

Olá, M6! Qto à função da linguagem sql, sim, tenho ciência de que nao é para formatação. Foi só a maneira que achei para exemplificar o que eu queria.

Mas há possibilidade de dar aliases para a mesma tabela? Pois faço referência a uma única tabela, que é a "consumo". 

Grato mais uma vez, vou tentando. Abraços

Share this post


Link to post
Share on other sites
HappyHippyHippo

é uma questão de estrutura das tabelas da BD.

como está feito, o mais simples é mesmo fazer a soma no PHP


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
lealdl

HappyHippyHippo, você se refere a programar via código? Havia pensado nisso, mas achei que seria mais complicado.

Share this post


Link to post
Share on other sites
M6

Sim, podes dar alias as vezes que quiseres à mesma tabela.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
lealdl

Olá amigos!
Novamente preciso de uma ajuda(espero que não haja mais,rs)

tenho um formulário de baixas de hóspedes, onde seleciono a data de saída e 
automaticamente o sistema está retornando o valor total da hospedagem.

Tenho também uma tabela de consumo dos hóspedes, em uma tela separada.
Preciso de uma trigger que, ao passar o status do quarto para 1(disponível),
automaticamente exclua o consumo para o quarto em que está sendo baixado.

Estou tendo dificuldades com a lógica, já que, selecionando o quarto manualmente no mysql, 
o trigger funciona perfeitamente.

Assim funciona:



CREATE TRIGGER baixa_consumo 
  AFTER UPDATE  ON quartos
  
FOR EACH ROW 
  begin
 
delete  FROM consumo 
  WHERE quarto = 101; 
 
end;

[/CODE]

Não estou sabendo como fazer para pegar o numero do quarto através do formulário.
Alguém pode me ajudar?
Grato!

Share this post


Link to post
Share on other sites
lealdl
2 horas atrás, lealdl disse:

Olá amigos!
Novamente preciso de uma ajuda(espero que não haja mais,rs)

tenho um formulário de baixas de hóspedes, onde seleciono a data de saída e 
automaticamente o sistema está retornando o valor total da hospedagem.

Tenho também uma tabela de consumo dos hóspedes, em uma tela separada.
Preciso de uma trigger que, ao passar o status do quarto para 1(disponível),
automaticamente exclua o consumo para o quarto em que está sendo baixado.

Estou tendo dificuldades com a lógica, já que, selecionando o quarto manualmente no mysql, 
o trigger funciona perfeitamente.

Assim funciona:

 



 

CREATE TRIGGER baixa_consumo 
  AFTER UPDATE  ON quartos
  
FOR EACH ROW 
  begin
 
delete  FROM consumo 
  WHERE quarto = 101; 
 
end;

[/CODE]

Não estou sabendo como fazer para pegar o numero do quarto através do formulário.
Alguém pode me ajudar?
Grato!

Pessoal, apanhei um pouco mas consegui resolver o problema do trigger. 

Achei mais fácil pela tabela de locaçoes, assim sempre que uma locação é baixada, o consumo relacionado também será!

O problema é que já havia atualizações com AFTER para essa tabela.

Mudei para BEFORE e o problema foi resolvido. Ficou assim:

		

		

CREATE TRIGGER baixa_consumo 
  BEFORE UPDATE  ON tb_locacoes
FOR EACH ROW
begin
DELETE FROM consumo 
  WHERE quarto = old.quarto;
 

END;

[/CODE]

Grato

 

2 horas atrás, lealdl disse:

 

 

 

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

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.