Jump to content
JoaoVM

ANSWERED Falha na Condição

Recommended Posts

JoaoVM

Boas,

Já coloquei esta duvida aqui no fórum e descobri de onde vem o problema, queria pedir agora a vossa ajuda para solucionar o problema que advém do problema resolvido.

Tenho uma query SQL que me devolve o ultimo movimento de um utilizador numa tabela, esse evento pode ser uma Entrada (E) ou uma Saida(S), tudo isto na data atual.

Tenho uma condição em php que o que faz é que se não existir esse utilizador na tabela faz a inserção como uma entrada (E).

Caso ele já exista verifica qual foi o ultimo movimento, se E ou S. Se foi E então vai inserir uma S, se foi S vai inserir uma E.

O meu problema e o seguinte:

QUANDO INSIRO UM UTILIZADOR E OUTRO A SEGUIR E SEGUIDAMENTE FAÇO A SAIDA DO PRIMEIRO UTILIZADOR ELE FALHA, DA ENTRADA EM VEZ DE SAIDA:

UTILIZADOR A - E

UTILIZADOR B - E

UTILIZADOR A - E (!!!FALHA - INSERE ENTRADA QUANDO DEVERIA INSERIR SAIDA!!!)

MAS SE FIZER A ENTRADA E SAIDA SEGUIDAMENTE ELE FUNCIONA SEM PROBLEMA:

UTILIZADOR A - E

UTILIZADOR A - S

UTILIZADOR B - E

UTILIZADOR B - S

O meu código:

if ($eventoE['rfid'] == 0){

   mysql_query("insert into transacoes_bmw (ENTRADA)");
   echo "<img src=ok.png width=50 height=50>";
   echo '<br>';
   echo "<font color='green' size='5'><b><u>Entrada</u></b> Realizada com Sucesso!!!</font>";
  }
elseif ($eventoE['rfid'] > 0 && $eventoE['evento'] == 'E'){

   mysql_query("insert into transacoes_bmw (SAIDA)");
   echo "<img src=ok.png width=50 height=50>";
   echo '<br>';
   echo "<font color='green' size='5'><b><u>Saída</u></b> Realizada com Sucesso!!!</font>";

}
elseif ($eventoE['rfid'] > 0 && $eventoE['evento'] == 'S'){

   mysql_query("insert into transacoes_bmw (ENTRADA)");
   echo "<img src=ok.png width=50 height=50>";
   echo '<br>';
   echo "<font color='green' size='5'><b><u>Entrada</u></b> Realizada com Sucesso!!!</font>";

}

A conclusão que tiro é que quando existe duas entradas seguidas ele deixa de reconhecer o primeiro utilizador e insere como se fosse novo registo, ou seja a condição quando o código do utilizador A == 0;

​Já testei com echos na condição e quando ele me insere o registo de entrada que deveria ser de saída ele insere como se fosse um novo registo, ou seja, executa a instrução da primeira condição.

Como posso resolver isto?

Edited by Rui Carlos

Share this post


Link to post
Share on other sites
Virneto

interesting...

Mas quando entra no teu primeiro if e fazes a entrada pela primeira vez, onde é que alteras o $eventoE['rfid'] de zero para >0?

Já confirmaste na bd como ficam os campos $eventoE['rfid'] e $eventoE['evento'] após o primeiro insert?

Edited by Virneto

"Que inquieto desejo vos tortura, Seres elementares, força obscura? Em volta de que ideia gravitais?" >> Anthero de Quental

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Linuxando.com | ...

Share this post


Link to post
Share on other sites
JoaoVM

Ele tem a condição de quando não existe o rfid na tabela na data atual, então insere, na condição seguinte se já existir o rfid ou seja, rfid > 0, insere entrada ou saída, mas se tirar o código das condições o erro é o mesmo.

($eventoE['rfid'] > 0 && ...)

Se fizer isto nas condições o resultado é o mesmo

elseif ($eventoE['evento'] == 'E'){ insert into .... (SAIDA)
}

Não esquecendo sempre que a minha query a base de dados devolve o ultimo movimento do cartão que passa no leitor, quanto a isso está certo porque ele devolve os valores corretos que eu pretendo, mesmo assim fica a query:

SELECT id_transacao, rfid, data, evento,hora_entrada, hora_saida, total_horas FROM transacoes_bmw WHERE rfid=".$_POST['rfid']." and data=timestamp(current_date()) AND id_transacao=(SELECT max(id_transacao) FROM transacoes_bmw);

Edited by JoaoVM

Share this post


Link to post
Share on other sites
Virneto

Não sei se já o fizeste.... mas eu experimentava mudar o operador e contornar o "==":

elseif ($eventoE['rfid'] !='')

ou então, passar o $eventoE['rfid'] para booleano?

Edited by Virneto

"Que inquieto desejo vos tortura, Seres elementares, força obscura? Em volta de que ideia gravitais?" >> Anthero de Quental

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Linuxando.com | ...

Share this post


Link to post
Share on other sites
JoaoVM

Não sei se já o fizeste.... mas eu experimentava mudar o operador e contornar o "==":

elseif ($eventoE['rfid'] !='')

Como dizes apenas insere entradas seguidamente, E, E, E, E, seja em que colaborador for, e alternado.

Passar para boleado como assim?Alterar o campo da tabela?

Share this post


Link to post
Share on other sites
HappyHippyHippo

SELECT id_transacao,
      rfid,
      DATA,
      evento,
      hora_entrada,
      hora_saida,
      total_horas
 FROM transacoes_bmw
WHERE rfid=".$_POST['rfid']."
  AND DATA=TIMESTAMP(CURRENT_DATE())
  AND id_transacao=(SELECT MAX(id_transacao)  -- esta condição serve para que ??
                      FROM transacoes_bmw);   -- esta condição serve para que ??

 SELECT *
   FROM transacoes_bmw
  WHERE rfid=".$_POST['rfid']."
    AND DATA=TIMESTAMP(CURRENT_DATE())
ORDER BY id_transacao DESC              -- deveria ser pela data/hora, mas como a tua data/hora é uma salgalhada ...
  LIMIT 1

  • Vote 1

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

Share this post


Link to post
Share on other sites
Virneto

Passar para boleado como assim?Alterar o campo da tabela?

eu estava a pensar que se o $eventoE['rfid']; te traz a condição de [existe utilizador] vs [não existe utilizador] podias converter para boleano.

Mas vê a sugestão do @Happy, porque já sabemos que nestas coisas....he rules!! ;)

Eu vou ficar só a acompanhar

  • Vote 1

"Que inquieto desejo vos tortura, Seres elementares, força obscura? Em volta de que ideia gravitais?" >> Anthero de Quental

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Linuxando.com | ...

Share this post


Link to post
Share on other sites
JoaoVM

Não poderia converter para boleado porque o RFID é um campo com 10 caracteres bigint. Mas já encontrei a solução, ou pelo menos até agora não falhou tendo em conta que ainda não testei intensivamente.

HappyHippyHippo a subquery que eu tinha devolvia o valor correto por isso e que não pensei que fosse da query, mas mais uma vez tens razão e desde já agradeço.

Esta passou a ser a minha nova query:

Como o HappyHippyHippo disse que a minha data era uma salgalhada resolvi então criar uma hora também, para otimizar a query.

E finalmente o que queria ficou a funcionar. ;)

SELECT * FROM transacoes_bmw WHERE rfid=".$_POST['rfid']." ORDER BY data DESC, hora DESC LIMIT 1;

Penso que poderei fazer apenas com um campo na tabela que de tudo, a data e hora e depois fazer a pesquisa com o NOW(). mas para já está bom ;)

Virneto obrigado pela atenção ;)

Edited by JoaoVM
  • Vote 1

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.