Ir para o conteúdo
JoaoVM

[Resolvido] Falha na Condição

Mensagens Recomendadas

JoaoVM    5
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?

Editado por Rui Carlos

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Virneto    75
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?

Editado por Virneto

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

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

Linuxando.com | ...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
JoaoVM    5
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);

Editado por JoaoVM

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Virneto    75
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?

Editado por Virneto

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

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

Linuxando.com | ...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
JoaoVM    5
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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
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


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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Virneto    75
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


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

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

Linuxando.com | ...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
JoaoVM    5
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 ;)

Editado por JoaoVM

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.